© 2016 IBM Corporation
Pythonをつかってディープ・ラーニングの仕
組みを見ていくよ
Tanaka Y.P
2016-10-18
© 2016 IBM Corporation2
お詫びと言い訳
(仮)Sparkで試してみるディープ・ラーニング
昨今、人工知能関連で最大の話題であるDeep Learningを、Apache
Sparkを使って実装する方法について体験していただくハンズ・オン・セッ
ションです。
Pythonをつかってディープ・ラーニングの仕組みを見ていくよ
昨今、人工知能関連で最大の話題であるDeep Learningを、Numpyを
使って実装する方法について体験していただくハンズ・オン・セッションで
す。
© 2016 IBM Corporation3
自己紹介
田中裕一(yuichi tanaka)
主にアーキテクチャとサーバーサイドプログラムを担当
することが多い。Hadoop/Spark周りをよく触ります。
Node.js、Python、最近はSpark周りの仕事でScalaを書く
ことが多い気がします。
休日はOSS周りで遊んだり。
詳解 Apache Spark
© 2016 IBM Corporation4
DeepLearningとは
• 機会学習の一つであるNNの層を重ね高精度な予測・分類処理を行うための手法
• 色々な関数の層を重ねて精度を向上させる
• 画像識別の分野で精度が高くて有名(ResNet/GoogLeNet等)
例)VGG16
© 2016 IBM Corporation5
さっきのを簡略に書き直すと
Data Convo
lution
Relu Affine Relu Softmax
Out
・・・
max
poolin
g
VGG16の簡略図
© 2016 IBM Corporation6
今日のゴール
• 今日は最終的に下記のNN(fully-connected)を作成します。
• 今日の例では特に層を厚くする意味もないですがせっかくなのでDNNっぽく・・・
Data Affine Relu Affine Relu Softmax
Out・・・ Affine
© 2016 IBM Corporation7
今日の範疇
今日の話の中で説明すること
 背景的な話
 DeepLearningの全体像
 レイヤ
 フォワード
• アフィン変換
 活性化関数について
• ReLU関数
 出力層での正規化関数
• ソフトマックス関数
 バックプロパゲーション
 損失関数
 誤差伝搬について
 ハイパーパラメータ
© 2016 IBM Corporation8
今日の範疇
今日の話の中で説明しないこと
 DeepLearningの種類的な違いとかの細かいこと
 畳み込みニューラルネットワーク:CNN@触れる程度で
 再帰ニューラルネットワーク:RNN
 教師なし学習:GAN
 強化学習:DQN
 数式の話
 『うぇ』ってなるので数式なしで
 内積の話@アフィン変換
 ネイピア数@ところどころ
 各関数の詳細@特にバックプロパゲーションの関数
 Batch Norm@各レイヤの値の分布調整
 Dropoutについて@過学習とか
© 2016 IBM Corporation9
背景
 人間の脳の構造を模してやれば上手く識別できるのは?
ニューロン情報処理モデル
例)単純パーセプトロン
I
I
I
W
W
W
S O
Input1
Input2
Input3
output
参考)
単純パーセプトロンの基本のき
Weight
© 2016 IBM Corporation10
背景
 層をふやしてやれば上手く識別できるのは?
例)FF-NN
I
I
I
Input1
Input2
Input3
output
O
O
© 2016 IBM Corporation11
今日のサンプル(色の識別:3つに分類)
• 何色ですか?
RGB(255,0,0)
RGB(0,255,0)
RGB(0,0,255)
RGB(233,63,127)
赤
緑
青
赤
© 2016 IBM Corporation12
今日のサンプルNN(色の識別)の用語説明
• こんな形のFully-Connectedを作成していきます。
Out
・・・
・
・
・
・
・
・
・
・
・
・
・
・
入力層
隠れ層
出力層
Softmax
© 2016 IBM Corporation13
今日のサンプルNN(色の識別)の用語説明
• こんな形のFully-Connectedを作成していきます。
・・・
・
・
・
・
・
・
・
・
・
・
・
・
0層(入力層) 1層 4層(出力層)2層
計算処理 活性化関数 出力関数
レイヤ
Softmax Out
© 2016 IBM Corporation14
今日のサンプルNN(色の識別)の用語説明
• こんな形のFully-Connectedを作成していきます。
・・・
Forward Backward
・
・
・
・
・
・
・
・
・
・
・
・
計算処理
Affine変換
活性化関数
Relu関数
出力関数
Softmax関数
OutSoftmax
© 2016 IBM Corporation15
フォワード(入力レイヤ -> Affine)
122
66
94
n1
・
・
・
・
・
・
RGBの値でフォワードとバックプロパゲーションについて見ていきます。
入力値 : RGB(122, 66, 94)
n1:発火のしやすさ(バイアス)、各重み
Rの値 * Rの重み
Gの値 * Gの重み
Bの値 * Bの重み
122
66
94
n1
Rの重み
Gの重み
Bの重み
バイアス
© 2016 IBM Corporation16
フォワード(入力レイヤ -> Affine)
バイアスと重みを使ってどのくらい発火するか計算します。
入力値 : RGB(122, 66, 94)
n1:バイアス、重み
Rの値 * Rの重み
Gの値 * Gの重み
Bの値 * Bの重み
122
66
94
n
1
Rの重み
Gの重み
Bの重み
122
66
94
n
1
Rの重み
Gの重み
Bの重み
bias
バイアス
バイアス
(122 * Rの重み) + (66 * Gの重み) + (94 * Bの重み) + バイアス
© 2016 IBM Corporation17
フォワード(入力レイヤ -> Affine)
入力値と重みの内積にバイアスを足したもの
122
66
94
n1
n2
n3
・
・
・
・
・
・
bias
output = Input ・ weight + bias
122,66,94
n1R,n2R,n3R
n1G,n2G,n3G
n1B,n2B,n3G
・
・
・
n1B,n2B,n3B,・・・
pythonコード:
out = x.dot(w) + b
n1O,n2O,n3O,・・・
© 2016 IBM Corporation18
フォワード(Affine -> Relu)
Affineの出力結果を活性化関数Reluを使って活性化させます
・
・
・
・
・
・
・
・
・
s1 = np.array([[122, 66, 94]])
w1 = np.array([[0.1], [0.2],[0.3]])
s1.dot(w1) + [0.5]
[ 54.1]
例)Affineの重み・バイアスを決め打ちで計算
n1
54.1
© 2016 IBM Corporation19
フォワード(Affine -> Relu)
Relu関数はx<=0なら0をx>0ならxを返す。(超簡単)
Relu関数の図
n1
54.1 54.1
phthonコード
return np.maximum(0,x)
© 2016 IBM Corporation20
フォワード(Affine -> 出力レイヤ)
Softmax関数で最終値を扱いやすい形に変換
Softmax関数
pythonコード
e = np.exp(x)
sum_e = e.sum()
return e / sum_e
Softmax
n1
n2
n3
出力例
[0, 0.1, 5.3] => [ 0.00493969, 0.0054592 , 0.98960111]
98%の確率で青と判定!
© 2016 IBM Corporation21
バックプロパゲーション
• 各nodeの重みとバイアスは?
・・・
Backward
・
・
・
・
・
・
・
・
・
・
・
・
OutSoftmax
© 2016 IBM Corporation22
バックプロパゲーション(損失関数)
• 各nodeの重みとバイアスは?
・・・
Backward
・
・
・
・
・
・
OutSoftmax
RGB(122, 66, 94)
教師Label [1,0,0]
初期値を当てる
Forward
教師Label
[1,0,0]
出力
[0.3,0.28,0.32]
損失関数
誤差修正
交差エントロピー誤差
© 2016 IBM Corporation23
バックプロパゲーション(誤差伝搬)
・・・
・
・
・
・
・
・
・
・
・
・
・
・
Softmax
Backward
本来は勾配という微分計算を全パラメータに対して行う必要があるところ、
誤差逆伝搬法を使うことで出力層側から入力層側に向かって
単純計算だけでパラメータの更新を行います。
© 2016 IBM Corporation24
バックワード(出力レイヤ(Softmax + 交差エントロピー誤差))
Softmax関数 + 交差エントロピー誤差
yk - tk
pythonコード
dx = (self.y - self.t)
Softmax
n1
n2
n3
ここからはバックワードする際のコードと式を紹介だけします。
Softmax
y1 – t1
y2 – t2
y3 – t3
損失関数
© 2016 IBM Corporation25
バックワード(Affine -> Relu)
pythonコード
dx = dout.dot(self.w.T) #出力
w = dx.T.dot(dout) #重み
b = dout.sum(axis=0) #バイアス
Affine変換の式は重み・バイアス・入力の3値を計算します
・
・
・
・
・
・
Affine変換の重み・バイアス
© 2016 IBM Corporation26
バックワード(Relu -> Affine)
pythonコード
dout[self.mask] = 0
Relu関数は値を反転してあげるだけ
・
・
・
・
・
・
© 2016 IBM Corporation27
フォワードとバックワード
Data Affine Relu Affine Relu Softmax
Out・・・ Affine
Forward
Forward Forward Forward Forward Forward Forward
Backward
BackwardBackwardBackwardBackwardBackwardBackward
• Foward -> Backwordを繰り返し処理を行うことで重み・バイアスの更新が可能になります
© 2016 IBM Corporation28
もう一度CNNを見てみよう
Data Convo
lution
Relu Affine Relu Softmax
Out
・・・
max
poolin
g
VGG16の簡略図
© 2016 IBM Corporation29
ハイパーパラメータについて(層の数とNodeの数)
・・・
・
・
・
・
・
・
・
・
・
・
・
・
Softmax
• NNでは各関数の重みやバイアスを自動で調整していく事で精度を上げます
• ではNNではパラメータの調整は全て不要なのでしょうか?
全体で幾つの層を重ねるのか?
1層に幾つのNode
を作るのか?
© 2016 IBM Corporation30
ハイパーパラメータについて(ネットワーク全体の学習率)
Affine変換の重み・バイアス
・・・
・
・
・
・
・
・
・
・
・
・
・
・
Softmax
Affine変換の重み・バイアス Affine変換の重み・バイアス
どのぐらいの強さで重み・バイアスを更新するのか?
学習率学習率学習率
© 2016 IBM Corporation31
今日のサンプルプログラム
・・・
・
・
・
・
・
・
・
・
・
・
・
・
Softmax
Affine変換の重み・バイアス
学習率:0.01
全体4層
50 100 503 3
入力データ数
train: 240
test: 20
© 2016 IBM Corporation32
DataScientistExperienceへ
Notebookはこちらそれではコードに移ります

PythonでDeepLearningを始めるよ

  • 1.
    © 2016 IBMCorporation Pythonをつかってディープ・ラーニングの仕 組みを見ていくよ Tanaka Y.P 2016-10-18
  • 2.
    © 2016 IBMCorporation2 お詫びと言い訳 (仮)Sparkで試してみるディープ・ラーニング 昨今、人工知能関連で最大の話題であるDeep Learningを、Apache Sparkを使って実装する方法について体験していただくハンズ・オン・セッ ションです。 Pythonをつかってディープ・ラーニングの仕組みを見ていくよ 昨今、人工知能関連で最大の話題であるDeep Learningを、Numpyを 使って実装する方法について体験していただくハンズ・オン・セッションで す。
  • 3.
    © 2016 IBMCorporation3 自己紹介 田中裕一(yuichi tanaka) 主にアーキテクチャとサーバーサイドプログラムを担当 することが多い。Hadoop/Spark周りをよく触ります。 Node.js、Python、最近はSpark周りの仕事でScalaを書く ことが多い気がします。 休日はOSS周りで遊んだり。 詳解 Apache Spark
  • 4.
    © 2016 IBMCorporation4 DeepLearningとは • 機会学習の一つであるNNの層を重ね高精度な予測・分類処理を行うための手法 • 色々な関数の層を重ねて精度を向上させる • 画像識別の分野で精度が高くて有名(ResNet/GoogLeNet等) 例)VGG16
  • 5.
    © 2016 IBMCorporation5 さっきのを簡略に書き直すと Data Convo lution Relu Affine Relu Softmax Out ・・・ max poolin g VGG16の簡略図
  • 6.
    © 2016 IBMCorporation6 今日のゴール • 今日は最終的に下記のNN(fully-connected)を作成します。 • 今日の例では特に層を厚くする意味もないですがせっかくなのでDNNっぽく・・・ Data Affine Relu Affine Relu Softmax Out・・・ Affine
  • 7.
    © 2016 IBMCorporation7 今日の範疇 今日の話の中で説明すること  背景的な話  DeepLearningの全体像  レイヤ  フォワード • アフィン変換  活性化関数について • ReLU関数  出力層での正規化関数 • ソフトマックス関数  バックプロパゲーション  損失関数  誤差伝搬について  ハイパーパラメータ
  • 8.
    © 2016 IBMCorporation8 今日の範疇 今日の話の中で説明しないこと  DeepLearningの種類的な違いとかの細かいこと  畳み込みニューラルネットワーク:CNN@触れる程度で  再帰ニューラルネットワーク:RNN  教師なし学習:GAN  強化学習:DQN  数式の話  『うぇ』ってなるので数式なしで  内積の話@アフィン変換  ネイピア数@ところどころ  各関数の詳細@特にバックプロパゲーションの関数  Batch Norm@各レイヤの値の分布調整  Dropoutについて@過学習とか
  • 9.
    © 2016 IBMCorporation9 背景  人間の脳の構造を模してやれば上手く識別できるのは? ニューロン情報処理モデル 例)単純パーセプトロン I I I W W W S O Input1 Input2 Input3 output 参考) 単純パーセプトロンの基本のき Weight
  • 10.
    © 2016 IBMCorporation10 背景  層をふやしてやれば上手く識別できるのは? 例)FF-NN I I I Input1 Input2 Input3 output O O
  • 11.
    © 2016 IBMCorporation11 今日のサンプル(色の識別:3つに分類) • 何色ですか? RGB(255,0,0) RGB(0,255,0) RGB(0,0,255) RGB(233,63,127) 赤 緑 青 赤
  • 12.
    © 2016 IBMCorporation12 今日のサンプルNN(色の識別)の用語説明 • こんな形のFully-Connectedを作成していきます。 Out ・・・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 入力層 隠れ層 出力層 Softmax
  • 13.
    © 2016 IBMCorporation13 今日のサンプルNN(色の識別)の用語説明 • こんな形のFully-Connectedを作成していきます。 ・・・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 0層(入力層) 1層 4層(出力層)2層 計算処理 活性化関数 出力関数 レイヤ Softmax Out
  • 14.
    © 2016 IBMCorporation14 今日のサンプルNN(色の識別)の用語説明 • こんな形のFully-Connectedを作成していきます。 ・・・ Forward Backward ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 計算処理 Affine変換 活性化関数 Relu関数 出力関数 Softmax関数 OutSoftmax
  • 15.
    © 2016 IBMCorporation15 フォワード(入力レイヤ -> Affine) 122 66 94 n1 ・ ・ ・ ・ ・ ・ RGBの値でフォワードとバックプロパゲーションについて見ていきます。 入力値 : RGB(122, 66, 94) n1:発火のしやすさ(バイアス)、各重み Rの値 * Rの重み Gの値 * Gの重み Bの値 * Bの重み 122 66 94 n1 Rの重み Gの重み Bの重み バイアス
  • 16.
    © 2016 IBMCorporation16 フォワード(入力レイヤ -> Affine) バイアスと重みを使ってどのくらい発火するか計算します。 入力値 : RGB(122, 66, 94) n1:バイアス、重み Rの値 * Rの重み Gの値 * Gの重み Bの値 * Bの重み 122 66 94 n 1 Rの重み Gの重み Bの重み 122 66 94 n 1 Rの重み Gの重み Bの重み bias バイアス バイアス (122 * Rの重み) + (66 * Gの重み) + (94 * Bの重み) + バイアス
  • 17.
    © 2016 IBMCorporation17 フォワード(入力レイヤ -> Affine) 入力値と重みの内積にバイアスを足したもの 122 66 94 n1 n2 n3 ・ ・ ・ ・ ・ ・ bias output = Input ・ weight + bias 122,66,94 n1R,n2R,n3R n1G,n2G,n3G n1B,n2B,n3G ・ ・ ・ n1B,n2B,n3B,・・・ pythonコード: out = x.dot(w) + b n1O,n2O,n3O,・・・
  • 18.
    © 2016 IBMCorporation18 フォワード(Affine -> Relu) Affineの出力結果を活性化関数Reluを使って活性化させます ・ ・ ・ ・ ・ ・ ・ ・ ・ s1 = np.array([[122, 66, 94]]) w1 = np.array([[0.1], [0.2],[0.3]]) s1.dot(w1) + [0.5] [ 54.1] 例)Affineの重み・バイアスを決め打ちで計算 n1 54.1
  • 19.
    © 2016 IBMCorporation19 フォワード(Affine -> Relu) Relu関数はx<=0なら0をx>0ならxを返す。(超簡単) Relu関数の図 n1 54.1 54.1 phthonコード return np.maximum(0,x)
  • 20.
    © 2016 IBMCorporation20 フォワード(Affine -> 出力レイヤ) Softmax関数で最終値を扱いやすい形に変換 Softmax関数 pythonコード e = np.exp(x) sum_e = e.sum() return e / sum_e Softmax n1 n2 n3 出力例 [0, 0.1, 5.3] => [ 0.00493969, 0.0054592 , 0.98960111] 98%の確率で青と判定!
  • 21.
    © 2016 IBMCorporation21 バックプロパゲーション • 各nodeの重みとバイアスは? ・・・ Backward ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ OutSoftmax
  • 22.
    © 2016 IBMCorporation22 バックプロパゲーション(損失関数) • 各nodeの重みとバイアスは? ・・・ Backward ・ ・ ・ ・ ・ ・ OutSoftmax RGB(122, 66, 94) 教師Label [1,0,0] 初期値を当てる Forward 教師Label [1,0,0] 出力 [0.3,0.28,0.32] 損失関数 誤差修正 交差エントロピー誤差
  • 23.
    © 2016 IBMCorporation23 バックプロパゲーション(誤差伝搬) ・・・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ Softmax Backward 本来は勾配という微分計算を全パラメータに対して行う必要があるところ、 誤差逆伝搬法を使うことで出力層側から入力層側に向かって 単純計算だけでパラメータの更新を行います。
  • 24.
    © 2016 IBMCorporation24 バックワード(出力レイヤ(Softmax + 交差エントロピー誤差)) Softmax関数 + 交差エントロピー誤差 yk - tk pythonコード dx = (self.y - self.t) Softmax n1 n2 n3 ここからはバックワードする際のコードと式を紹介だけします。 Softmax y1 – t1 y2 – t2 y3 – t3 損失関数
  • 25.
    © 2016 IBMCorporation25 バックワード(Affine -> Relu) pythonコード dx = dout.dot(self.w.T) #出力 w = dx.T.dot(dout) #重み b = dout.sum(axis=0) #バイアス Affine変換の式は重み・バイアス・入力の3値を計算します ・ ・ ・ ・ ・ ・ Affine変換の重み・バイアス
  • 26.
    © 2016 IBMCorporation26 バックワード(Relu -> Affine) pythonコード dout[self.mask] = 0 Relu関数は値を反転してあげるだけ ・ ・ ・ ・ ・ ・
  • 27.
    © 2016 IBMCorporation27 フォワードとバックワード Data Affine Relu Affine Relu Softmax Out・・・ Affine Forward Forward Forward Forward Forward Forward Forward Backward BackwardBackwardBackwardBackwardBackwardBackward • Foward -> Backwordを繰り返し処理を行うことで重み・バイアスの更新が可能になります
  • 28.
    © 2016 IBMCorporation28 もう一度CNNを見てみよう Data Convo lution Relu Affine Relu Softmax Out ・・・ max poolin g VGG16の簡略図
  • 29.
    © 2016 IBMCorporation29 ハイパーパラメータについて(層の数とNodeの数) ・・・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ Softmax • NNでは各関数の重みやバイアスを自動で調整していく事で精度を上げます • ではNNではパラメータの調整は全て不要なのでしょうか? 全体で幾つの層を重ねるのか? 1層に幾つのNode を作るのか?
  • 30.
    © 2016 IBMCorporation30 ハイパーパラメータについて(ネットワーク全体の学習率) Affine変換の重み・バイアス ・・・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ Softmax Affine変換の重み・バイアス Affine変換の重み・バイアス どのぐらいの強さで重み・バイアスを更新するのか? 学習率学習率学習率
  • 31.
    © 2016 IBMCorporation31 今日のサンプルプログラム ・・・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ Softmax Affine変換の重み・バイアス 学習率:0.01 全体4層 50 100 503 3 入力データ数 train: 240 test: 20
  • 32.
    © 2016 IBMCorporation32 DataScientistExperienceへ Notebookはこちらそれではコードに移ります

Editor's Notes

  • #2 1
  • #4 会社ではSparkとHadoopのスペシャリストやってます。
  • #5 DeepLearningとは
  • #7 今日は画像処理などややこしいことを行わず、純粋にAffine変換とRelu関数、最後のSoftmax関数のみを使ってNNを作成します。 ただ、せっかくなのでAffine+Reluを4層にしてDNNっぽく作ります。 今日のサンプルソースコードでは色(RGB)の分類を扱います。 #ちなみに色の分類行うのにわざわざDNNを作ったりはしません。説明用。
  • #8 Rectified linear unit
  • #10 元々NN系の機会学習は人間の脳の構造を模せば、識別処理が上手くいくのではというところから始まってます。
  • #11 で、単純パーセプトロンは、非線形の分析ができないということで、FF-NN(多層パーセプトロン)に進化していきます。
  • #12 今日はこのあたりからやってきます。
  • #16 まず入力レイヤから見ていきます。
  • #18 余談ですが、このNNに画像を入れる場合 30*30の画像で入力層が900になります。多いですね。
  • #20 また余談です。今回簡素化のため正規化かけてませんが、入力値の正規化は重要です。 今日のサンプルはこのAffine変換と活性化関数Reluを3層重ねてます。
  • #21 この層で結果[1,0,0] ここでForwardの処理は終わりです。ね簡単でしょ?ここまでなら・・・
  • #22  この時の問題として 例えば50のnodeを作ると、今回のケースでいきなり150個の重みと50個のバイアスを適切な値 これ無理ですよね? 出力結果をもとに重みやバイアスを調整するのを誤差伝搬
  • #23 実際のコードはSoftmax関数内で損失関数の計算もやってる 初期値はガウス分布
  • #24 確率勾配を用いて パラメータの微分は独立なものではなく、 レイヤのパラメータに関する誤差関数の微分は、 一つ前の層のレイヤのパラメータの微分が求まっていると、 微分計算をしなくても自動的に単純計算で決まる、つまり微分やらなくても良いので高速
  • #25 次はAffine変換
  • #28 Input(教師データ)だけ用意すればNNを通して各パラメータを自動的に算出してくれます。 これがend-to-endの機会学習と言われる所以ですね。 例えばTensorFlowやchainerやcaffe
  • #29 このDNNをCNNにしたい場合はいくつかの層を Convolutionとmax poolingの関数を作って入れ替えてあげればCNNの完成です。
  • #32 今日はこんな感じのパラメータで作ります。