【ラビットチャレンジ】 深層学習:その4 Day4まとめ

ラビットチャレンジ 深層学習:その4

講師の人

レコメンドエンジンを開発

TensorFlowについても少しふれていく

TensorFlowの使い方

実際の業務ではニューラルネットワークを実装するラッパー、ミドルウェアを利用することがほとんど

TensorFlowはユーザー数が一番多い

※ tensorflowインストール

pip3 install --upgrade tensorflow --ignore-installed
python
 >> import tensorflow as tf
 (何事もなく完了)

※ 以下tensorflowの基本的な概念や使い方を列挙

constant

a = tf.constant(1)
b = tf.constant(2, dtype=tf.float32, shape=[3,2])
c = tf.constant(np.arange(4), dtype=tf.float32, shape=[2,2])

constantの第一引数、初期化するパラメータ 第二引数、パラメータのタイプ 第三引数、テンソルのかたち

デバッグについて → 基本的にはprintデバッグ

placeholder

箱のようなもの。

# プレースホルダーを定義
x = tf.placeholder(dtype=tf.float32, shape=[None,3])

variables

変数

# 変数を定義
x = tf.Variable(1)

線形回帰

noise=0.3

f:id:n_morioka:20190723012626p:plain

noise=0.1

f:id:n_morioka:20190723012647p:plain

d=5x+2, noise=0.1

f:id:n_morioka:20190723012706p:plain

非線形回帰

noise = 0.05

f:id:n_morioka:20190723012732p:plain

noise = 0.6

f:id:n_morioka:20190723012753p:plain

演習問題

f:id:n_morioka:20190723012819p:plain

TensorFlowによるMNIST

1層

f:id:n_morioka:20190723012851p:plain

3層(Adam)

f:id:n_morioka:20190723012915p:plain

3層(Momentum)

f:id:n_morioka:20190723012935p:plain

CNN(dropout_rate=0)

f:id:n_morioka:20190723012954p:plain

※ 中間層のサイズは、精度と速度のトレードオフ 中間層大きい:精度高い、速度遅い 中間層小さい:精度低い、速度早い

※ dropoutを実施しないと、精度は下がる

論文

論文から実装しよう

画像認識の最新モデルを実装するには?
・ VGG
・ AlexNet
・ GoogLeNet ・ Resnet
・ Yolo
→ 論文を見てみよう

※ ネットワークの形式や、リザルト、実装についても乗っているのでコツをつかむと論文から実務作業に落としこめる模様

※ VGGなどは有名なので、ブログでも解説があったりする

※ ライセンスには気をつけるべし

YOLO

物体認識の手法 → 実装まで公開されていて、githubにある

例題について

1 Inception module

GoogleNetの特徴としてInception moduleと呼ばれる復数のフィルタ郡により構成されたブロックが挙げられる。Inception moduleに関する記述として誤っているものはどれか

→ (a)が間違い。スパースなデータが増えているため

2 Auxiliary Less

GoogleNetnのの特徴としてAuxiliary Lessの存在が挙げられる。Auxiliary Lossに関する記述といて間違っているものを選べ

→ (a)が間違い。Classifiersを増やすことによって計算量は増える

3 ResNet

深くモデルを設計出来なかった問題は?

→ (a) 勾配消失問題

4 ResNet

層をまたがる結合の名前

→ (a)。Identity mapping、いわゆるスキップコネクションのこと

5 Residual Brock

Residual Brockの導入によって期待されたもの

→ (a)。ブロックへの入力にこれ以上変換が必要ない場合は重みが0となり、小さな変換が求められる場合は対応する小さな変換をより見つけやすくなる

6 転移学習

転移学習の記載として誤ったものはどれか?

→ (あ) 。ワンショット学習というののはあるクラスにたいして画像を1枚用意して、特徴ベクトルを抽出する。特徴ベクトルが同じクラスであれば近い、離れていれば遠いということで判断する。転移学習の説明としては不当

7 一般物体検出アルゴリズム

一般物体検出アルゴリズムとして正しいものを選べ

→ (a) (b)は最大2つというのが間違い。必ず定義された2つの候補領域が生成される (c) 2つの誤差の単純和が間違い。2つの誤差の重み付けまで表現されている (d)出力についてはカテゴリのプラスの確率と2つの候補領域が出力される

確認テスト

GG, GoogleNet, ResNetの特徴をそれぞれ簡潔に述べよ

→ VGGについては2014からあるモデル 、単純なモデルの積み重ねになっているのでシンプルなモデル。ただしパラメータ数は多い → GoogleNetはinception moduleを使っている。次元削減やスパースなもので表現されるのが特徴 → ResNetはスキップコネクション:identity moduleを使って深い学習が出来る

Keras1

TensorFlowをラップする形式で、簡単に記載が可能 ただし、柔軟性はTensorFlowの方が高く細かいところで記載が必要であればTensorFlowを利用することも多い データ分析の実際の実務でも使うことは多く、TensorFlowの次くらいに利用者が多い

Python演習

線形回帰

f:id:n_morioka:20190723013705p:plain

単純パーセプトロン

Epoch 30/30
4/4 [==============================] - 0s 3ms/step - loss: 0.2794
TEST
[[ True]
 [ True]
 [ True]
 [ True]]
Epoch 100/100
4/4 [==============================] - 0s 2ms/step - loss: 0.1640
TEST
[[ True]
 [ True]
 [ True]
 [ True]]

単純パーセプトロン(XOR)

...
model = Sequential()
model.add(Dense(input_dim=2, units=5,activation="relu"))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.summary()

model.compile(loss='binary_crossentropy', optimizer=SGD(lr=0.1))
 
# トレーニング用入力 X と正解データ T
X = np.array( [[0,0], [0,1], [1,0], [1,1]] )
T = np.array( [[0], [1], [1], [0]] )
... 
Epoch 300/300
4/4 [==============================] - 0s 4ms/step - loss: 0.0213
TEST
[[ True]
 [ True]
 [ True]
 [ True]]

irisデータセット

花びらの大きさとかがく片のデータから花を分類したもの

relu

f:id:n_morioka:20190723013907p:plain

sigmoid

f:id:n_morioka:20190723013929p:plain

SGD(lr=0.1)

f:id:n_morioka:20190723013946p:plain

MNIST(NN)

f:id:n_morioka:20190723014010p:plain

sparse_categorical_crossentropy

f:id:n_morioka:20190723014027p:plain

Adam(lr=0.01)

f:id:n_morioka:20190723014045p:plain

MNIST(CNN)

※途中で中断

f:id:n_morioka:20190723014111p:plain

cifar10(分類問題)

※途中で中断

RNN

Epoch 1/5
10000/10000 [==============================] - 16s 2ms/step - loss: 0.0638 - acc: 0.9450
Epoch 2/5
10000/10000 [==============================] - 15s 2ms/step - loss: 0.0017 - acc: 1.0000
Epoch 3/5
10000/10000 [==============================] - 15s 2ms/step - loss: 6.6395e-04 - acc: 1.0000
Epoch 4/5
10000/10000 [==============================] - 15s 2ms/step - loss: 4.0004e-04 - acc: 1.0000
Epoch 5/5
10000/10000 [==============================] - 15s 2ms/step - loss: 2.8125e-04 - acc: 1.0000

RNN(sigmoid)

Epoch 1/5
10000/10000 [==============================] - 17s 2ms/step - loss: 0.2476 - acc: 0.5392
Epoch 2/5
10000/10000 [==============================] - 16s 2ms/step - loss: 0.2294 - acc: 0.6658
Epoch 3/5
10000/10000 [==============================] - 16s 2ms/step - loss: 0.1137 - acc: 0.8800
Epoch 4/5
10000/10000 [==============================] - 16s 2ms/step - loss: 0.0149 - acc: 1.0000
Epoch 5/5
10000/10000 [==============================] - 16s 2ms/step - loss: 0.0011 - acc: 1.0000
Test loss: 0.00022750332874086856
Test accuracy: 1.0

RNN(tanh)

Epoch 1/5
10000/10000 [==============================] - 17s 2ms/step - loss: 0.0302 - acc: 0.9633
Epoch 2/5
10000/10000 [==============================] - 15s 2ms/step - loss: 3.5838e-04 - acc: 1.0000
Epoch 3/5
10000/10000 [==============================] - 15s 1ms/step - loss: 3.0595e-04 - acc: 0.9999
Epoch 4/5
10000/10000 [==============================] - 15s 2ms/step - loss: 7.6703e-04 - acc: 0.9993
Epoch 5/5
10000/10000 [==============================] - 15s 2ms/step - loss: 8.6655e-05 - acc: 1.0000
Test loss: 7.51769667030231e-05
Test accuracy: 1.0

RNN(adam)

Epoch 1/5
10000/10000 [==============================] - 17s 2ms/step - loss: 0.1151 - acc: 0.8616
Epoch 2/5
10000/10000 [==============================] - 16s 2ms/step - loss: 0.0153 - acc: 0.9971
Epoch 3/5
10000/10000 [==============================] - 16s 2ms/step - loss: 8.0843e-04 - acc: 0.9999
Epoch 4/5
10000/10000 [==============================] - 17s 2ms/step - loss: 2.0166e-04 - acc: 0.9998
Epoch 5/5
10000/10000 [==============================] - 14s 1ms/step - loss: 1.5597e-05 - acc: 1.0000
Test loss: 7.87067476825779e-06
Test accuracy: 1.0

強化学習

強化学習とは
長期的に報酬を最大化できるように環境のなかで行動を選択 できるエージェントを作ることを目標とする機械学習の一分野
→ 行動の結果として与えられる利益(報酬)をもとに、 行動を決定する原理を改善していく仕組みです。

確認テスト

強化学習が使えそうな分野 → オセロ、将棋などや自動運転、自動ゲーム操作など

探索と利用のトレードオフ

環境について事前に完璧な知識があれば、 最適な行動を予測し決定することは可能。 → どのような顧客にキャンペーンメールを送信すると、 どのような行動を行うのかが既知である状況。 →→ 探索と利用のトレードオフ 環境について事前に完璧な知識があれば、 最適な行動を予測し決定することは可能。 どのような顧客にキャンペーンメールを送信すると、 どのような行動を行うのかが既知である状況。

過去のデータで、ベストとされる行動のみを常に取り続ければ 他にもっとベストな行動を見つけることはできない。 → 探索が足りない状態 ↑ ↓ 未知の行動のみを常に取り続ければ、過去の経験が活かせない。 → 利用が足りない状態

強化学習の差分

強化学習と通常の教師あり、教師なし学習との違い

結論:目標が違う ・教師なし、あり学習では、データに含まれるパターンを見つけ出す およびそのデータから予測することが目標 ・強化学習では、優れた方策を見つけることが目標

行動価値観数

行動価値関数とは ・価値を表す関数としては、状態価値関数と行動価値関数の2種類がある ある状態の価値に注目する場合は、状態価値関数 状態と価値を組み合わせた価値に注目する場合は、行動価値関数

方策関数

方策関数とは 方策ベースの強化学習手法において、 ある状態でどのような行動を採るのかの確率を与える関数のことです。

方策勾配法について

方策反復法 方策をモデル化して最適化する手法

f:id:n_morioka:20190723014458p:plain

Jとは? 方策の良さ → 定義しないといけない

定義方法 ・平均報酬 ・割引報酬和 上記の定義に対応して、行動価値関数:Q(s,a)の定義を行い。 方策勾配定理が成り立つ。

f:id:n_morioka:20190723014517p:plain

■方策勾配定理導出のポイント: 方策勾配定理は基本的には下記の2式から導出される

- 状態価値関数 v(s) = sum_a (π(a|s)Q(s,a))
- ベルマン方程式 Q(s,a) = sum_s’(P(s’|s,a)[r(s,a,s’) + γV(s’)]

DCGAN

敵対的ネットワークとCNNを使って、画像生成を行う → 実際には存在しないベッドルームの画像を生成したり

Leaky ReLU = 0以下が0じゃなくて、0.01 x になっている

Kaggle

10万人程度が参加している、機械学習のコンペサイト

※ 参加はfacebook id連携などで簡単にできる

※ これまでやってきた授業の内容で十分出来るようになっている

※ データセットの水増しとかテクニックは必要。Googleで調べると良い ※ 実際にやるとなるとKernelに関する議論などをまずは見てみる?

失敗談

  • 一番最初つまずくのは、難しいのはどのコンテストに出るのか?

※ 最初はシングルモデルにしておいて、最終的にアンサンブル学習をさせるのが良いとのこと

実践につながるアウトプット

今は基本的に学習はKaggleのドキュメントを見ることが多い