【ゼロから作るDeap Learning】5.5~5.8

244 Views

June 09, 25

スライド概要

profile-image

AI・機械学習を勉強したい学生たちが集まる、京都大学の自主ゼミサークルです。私たちのサークルに興味のある方はX(Twitter)をご覧ください!

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

KaiRA ゼロつく輪読会 #6 ゼロから作るDeep Learning 5.5~5.8 : 誤差逆伝播法 京都大学 工学部 情報学科 宮前明生 0

2.

アジェンダ ◼ 活性化関数レイヤの実装 ◼ Affine/Softmaxレイヤの実装 ◼ 誤差逆伝播法の実装 1

3.

アジェンダ ◼ 活性化関数レイヤの実装 ◼ Affine/Softmaxレイヤの実装 ◼ 誤差逆伝播法の実装 2

4.

活性化関数レイヤの実装:ReLUレイヤ ReLU関数:入力が0より大きければそのままの値を返し、0以下であ れば0を返す 𝑥 (𝑥 > 0) 𝑦=ቊ 0 (𝑥 ≤ 0) 1 𝜕𝑦 =ቊ 𝜕𝑥 0 (𝑥 > 0) (𝑥 ≤ 0) 𝑦 𝑥 𝜕𝐿 𝜕𝑦 relu 𝑥>0 𝜕𝐿 𝜕𝑦 𝑦 𝑥 0 relu 𝑥≤0 𝜕𝐿 𝜕𝑦 3

5.

活性化関数レイヤの実装:ReLUレイヤ ReLUレイヤをpythonで実装 import numpy as np class Relu: def __init__(self): self.mask = None mask変数: xの各要素の条件に対する True/False def forward(self, x): self.mask = (x <= 0) out = x.copy() out[self.mask] = 0 return out def backward(self, dout): dout[self.mask] = 0 dx = dout return dx 4

6.

活性化関数レイヤの実装:Sigmoidレイヤ Sigmoid関数: 1 𝑦= 1+exp(−𝑥) 𝜕𝑦 1 =− − exp −𝑥 𝜕𝑥 1+exp −𝑥 2 1 exp −𝑥 = = 𝑦(1 − 𝑦) 1+exp −𝑥 1+exp −𝑥 𝑦 𝑥 𝜕𝐿 𝑦(1 − 𝑦) 𝜕𝑦 sigmoid 𝜕𝐿 𝜕𝑦 5

7.

活性化関数レイヤの実装:Sigmoidレイヤ Sigmoidレイヤをpythonで実装 import numpy as np class Sigmoid: def __init__(self): self.out = None def forward(self, x): out = 1 / (1 + np.exp(-x)) self.out = out return out def backward(self, dout): dx = dout * (1.0 - self.out) * self.out return dx 6

8.

アジェンダ ◼ 活性化関数レイヤの実装 ◼ Affine/Softmaxレイヤの実装 ◼ 誤差逆伝播法の実装 7

9.

Affineレイヤの実装 Affineレイヤの順伝播:行列Wの積とバイアスBの和 𝑤11 𝑤12 𝑤13 𝑏 𝑏 𝑏 X = 𝑥1 𝑥2 , W = 𝑤 , 𝐵 = 1 2 3 21 𝑤22 𝑤23 Y = 𝑋𝑊 + 𝐵 = 𝑦1 𝑦2 𝑦3 = 𝑥1 𝑤11 + 𝑥2 𝑤21 + 𝑏1 𝑥1 𝑤12 + 𝑥2 𝑤22 + 𝑏2 𝑥1 𝑤13 + 𝑥2 𝑤23 + 𝑏3 𝜕𝐿 𝜕𝐿 𝜕𝐿 𝜕𝐿 = 𝜕𝑦 𝜕𝑦 𝜕𝑦 , 𝜕𝑌 1 2 3 𝜕𝐿 𝜕𝑦𝑖 𝜕𝐿 𝜕𝑦𝑖 𝜕𝐿 𝜕𝐿 𝜕𝐿 3 3 = 𝜕𝑥 𝜕𝑥 = σ𝑖=1 𝜕𝑦 𝜕𝑥 σ𝑖=1 𝜕𝑦 𝜕𝑥 𝜕𝑋 1 2 1 2 𝑖 𝑖 𝜕𝐿 𝜕𝑦𝑖 𝜕𝐿 3 3 = σ𝑖=1 𝑤1𝑖 𝜕𝑦 σ𝑖=1 𝑤2𝑖 𝜕𝑥 = 𝑊 𝑇 𝜕𝑌 2 𝑖 𝜕𝐿 𝜕𝐿 𝜕𝐿 𝜕𝐿 𝜕𝑦1 𝜕𝐿 𝜕𝑦2 𝜕𝑤11 𝜕𝑤12 𝜕𝑤13 𝜕𝑦1 𝜕𝑤11 𝜕𝑦2 𝜕𝑤12 𝜕𝐿 = 𝜕𝐿 = 𝜕𝐿 𝜕𝑦 𝜕𝐿 𝜕𝐿 𝜕𝐿 𝜕𝑦2 𝜕𝑊 1 𝜕𝑤21 𝜕𝑤22 𝜕𝑤23 𝜕𝑦1 𝜕𝑤21 𝜕𝑦2 𝜕𝑤22 𝜕𝐿 𝜕𝑦3 𝜕𝑦3 𝜕𝑤13 𝜕𝐿 𝜕𝑦3 𝜕𝑦3 𝜕𝑤23 𝑇 𝜕𝐿 =𝑋 𝜕𝑌 8

10.

Affineレイヤの実装 バッチ版Affineレイヤの計算グラフ Affineレイヤの計算グラフ(単データ) (2,) (N,2) X 𝜕𝐿 𝜕𝑋 (2,) (3,) (3,) XW dot (2,3) W (3,) 𝜕𝐿 𝜕𝑊 (2,3) B + 𝜕𝐿 𝜕𝑌 (3,) 𝜕𝐿 𝜕𝑌 (3,) Y 𝜕𝐿 𝜕𝑌 (3,) 𝜕𝐿 𝜕𝑋 (N,2) X (N,3) XW dot (2,3) W 𝜕𝐿 𝜕𝑊 (2,3) (N,3) (3,) B + 𝜕𝐿 𝜕𝑌 (N,3) Y 𝜕𝐿 𝜕𝑌 (N,3) 𝜕𝐿 𝜕𝑌 (N,3) 𝜕𝐿 𝜕𝐿 𝑇 = 𝑊 𝜕𝑋 𝜕𝑌 (N,2) (N,3) (3,2) 𝜕𝐿 𝜕𝐿 = 𝑋𝑇 𝜕𝑊 𝜕𝑌 (2,3) (2,N) (N,3) 9

11.

Affineレイヤの実装 Affineレイヤをpythonで実装 class Affine: def __init__(self, W, b): self.W = W self.b = b self.x = None self.dW = None self.db = None def forward(self, x): self.x = x out = np.dot(self.x, self.W) + self.b return out 勾配はデータごとに合算する def backward(self, dout): dx = np.dot(dout, self.W.T) self.dW = np.dot(self.x.T, dout) self.db = np.sum(dout, axis=0) return dx 10

12.

Softmax-with-Lossレイヤの実装 順伝播:Softmax関数と交差エントロピー exp(𝑥𝑖 ) 𝑦𝑖 = σ𝑛 𝑗=1 exp(𝑥𝑗 ) 𝐿 = − σ𝑛𝑖=1 𝑡𝑖 𝑙𝑜𝑔𝑦𝑖 = − σ𝑛𝑖=1 𝑡𝑖 𝑥𝑖 − 𝑡𝑖 log σ𝑛𝑗=1 exp 𝑥𝑗 = − σ𝑛𝑖=1 𝑡𝑖 𝑥𝑖 + log σ𝑛𝑗=1 exp 𝑥𝑗 𝜕𝐿 = 𝜕𝑋 exp(𝑥1 ) −𝑡1 + σ𝑛 𝑗=1 exp(𝑥𝑗 ) = −𝑡1 + 𝑦1 … σ𝑛𝑖=1 𝑡𝑖 = 1 exp(𝑥𝑛 ) −𝑡𝑛 + σ𝑛 𝑗=1 exp(𝑥𝑗 ) … −𝑡𝑛 + 𝑦𝑛 11

13.

Softmax-with-Lossレイヤの実装 Softmax-with-Lossレイヤをpythonで実装 class SoftmaxWithLoss: def __init__(self): self.loss = None self.y = None # softmaxの出力 self.t = None # 教師データ def forward(self, x, t): self.t = t self.y = softmax(x) self.loss = cross_entropy_error(self.y, self.t) return self.loss def backward(self, dout=1): batch_size = self.t.shape[0] if self.t.size == self.y.size: # 教師データがone-hot-vectorの場合 dx = (self.y - self.t) / batch_size else: dx = self.y.copy() dx[np.arange(batch_size), self.t] -= 1 dx = dx / batch_size return dx 12

14.

アジェンダ ◼ 活性化関数レイヤの実装 ◼ Affine/Softmaxレイヤの実装 ◼ 誤差逆伝播法の実装 13

15.

誤差逆伝播法の実装:学習の全体図 1.訓練データの中からランダムに一部のデータ(ミニバッチ)を選ぶ 2.パラメータに関する損失関数の勾配を求める 3.パラメータを勾配に従って更新する 4.1~3を繰り返す 14

16.

誤差逆伝播法の実装:2層ニューラルネットワークの実装① 2層のニューラルネットワーク ・predictはSoftmax関数を通す必要はな い lossはSoftmaxwithLossから求め、 accuracyはargmaxから予測値を求める から( Softmax関数を通しても大小関係 は同じ) ・accuracyでtがone-hotベクトルならば、 ラベルに変換 15

17.

誤差逆伝播法の実装:2層ニューラルネットワークの実装 勾配を数値微分から求める numerical_gradient関数と 勾配を誤差逆伝播方から求める gradient関数 16

18.

誤差逆伝播法の実装:誤差逆伝播法の勾配確認 誤差逆伝播法は数値微分より実装が複雑なので、比較することで誤差 逆伝播法が正しく実装できていることを確認 17

19.

誤差逆伝播法の実装:学習の実装 Accuracy: Trainデータ:0.9769 Testデータ:0.9687 18