138 Views
May 09, 24
スライド概要
AI・機械学習を勉強したい学生たちが集まる、京都大学の自主ゼミサークルです。私たちのサークルに興味のある方はX(Twitter)をご覧ください!
2024年度前期輪読会#2 「ゼロから作るDeep Learning」 3章 ニューラルネットワーク 3.3~3.4 京都大学理学部 東野 幹大 0
概要 目次 1. 行列の積 2. 3層ニューラルネットワーク 3. まとめ 1
行列の積 2
行列の積 行列 ● 𝑚 × 𝑛 行列 𝑨= 𝑎11 𝑎21 ⋮ 𝑎𝑖1 ⋮ 𝑎𝑚1 𝑎12 ⋯ 𝑎22 ⋯ ⋮ 𝑎𝑖2 ⋯ ⋮ 𝑎𝑚2 ⋯ 𝑎1𝑗 𝑎2𝑗 ⋮ 𝑎𝑖𝑗 ⋮ 𝑎𝑚𝑗 ⋯ ⋯ ⋯ ⋯ 𝑎1𝑛 𝑎2𝑛 ⋮ 𝑎𝑖𝑛 ⋮ 𝑎𝑚𝑛 第𝑖行 第𝑗列 𝑎𝑖𝑗 のことを行列Aの (𝑖, 𝑗)成分 という 3
行列の積 行列の積 ● 行列の積 Aは 𝑚 × 𝑛 行列、Bは 𝑛 × 𝑙 行列とし、AとBの積AB の (𝑖, 𝑗)成分を 𝑐𝑖𝑗 を 𝑛 𝑐𝑖𝑗 ≝ 𝑎𝑖𝑘 𝑏𝑘𝑗 = 𝑎𝑖1 𝑏1𝑗 + 𝑎𝑖2 𝑏2𝑗 + ⋯ + 𝑎𝑖𝑛 𝑏𝑛𝑗 𝑘=1 と定義する。 4
行列の積 行列の積の計算例 ● ● ● 1 2 3 4 19 22 5 6 = 43 50 7 8 1 2 27 30 33 7 8 9 = 61 68 3 4 75 10 11 12 5 6 95 106 117 NumPyの関数np.dot()によって行列の積を計算できる。 >>> import numpy as np >>> A = np.array([[1,2],[3,4],[5,6]]) >>> B = np.array([[7,8,9],[10,11,12]]) >>> C = np.dot(A,B) >>> print(C) [[ 27 30 33] [ 61 68 75] [ 95 106 117]] 5
3層ニューラルネットワーク 6
3層ニューラルネットワーク 例 活性化関数としてシグモイド関数 ℎ 𝑥 = 1 1+exp(−𝑥) を用いる 7
3層ニューラルネットワーク 重みつき和 3.12節と同様に考えて (1) (1) (1) (1) 𝑎1 = 𝑤11 𝑥1 + 𝑤12 𝑥2 + 𝑏1 8
3層ニューラルネットワーク 重みつき和 (1) (1) 𝑎2 𝑎3 についても同様に、 (1) (1) (1) (1) 𝑎1 = 𝑤11 𝑥1 + 𝑤12 𝑥2 + 𝑏1 (1) (1) (1) (1) 𝑎2 = 𝑤21 𝑥1 + 𝑤22 𝑥2 + 𝑏2 (1) (1) (1) (1) 𝑎3 = 𝑤31 𝑥1 + 𝑤32 𝑥2 + 𝑏3 → 𝑎1(1) (1) 𝑎2 (1) 𝑎3 = 𝑥1 𝑥2 (1) 𝑤11 (1) 𝑤12 (1) 𝑤21 (1) 𝑤22 (1) 𝑤31 (1) 𝑤32 + 𝑏1(1) (1) 𝑏2 (1) 𝑏3 9
3層ニューラルネットワーク 重みつき和 書き換えると、 𝑨(1) = 𝑿𝑾 1 + 𝑩(1) ただし、 (1) 𝑨(1) = 𝑎1(1) ● (1) 𝑎2 (1) 𝑎3 、 𝑿 = 𝑥1 𝑥2 、 𝑾 1 = (1) (1) 𝑤11 𝑤21 𝑤31 (1) 𝑤22 (1) 𝑤32 𝑤12 (1) 、 𝑩(1) = 𝑏1(1) (1) 𝑏2 (1) 𝑏3 行列を用いると、重みつき和の計算を一つにまとめられる。 まとめておけば、要素が多くなってもnp.dot()を使えば一度の計算で済む! 10
3層ニューラルネットワーク 活性化関数 活性化関数の実装も簡単! 前に定義したsigmoid()に NumPy配列 A1 = np.array([a1, a2, a3]) をそのまま渡せば、 Z1 = np.array([z1, z2, z3]) が得られる。 11
3層ニューラルネットワーク あとはこれを繰り返す 12
3層ニューラルネットワーク あとはこれを繰り返す 例では、出力層の活性化関 数はシグモイド関数ではな く、恒等関数 𝜎 𝑥 =𝑥 となっている。出力層の活 性化関数は解きたい問題に 応じて決める。 詳しくは次回の輪読会で。 13
3層ニューラルネットワーク
実装例
import numpy as np
def sigmoid(x):
return 1/(1+np.exp(-x))
def identity_function(x):
return x
def init_network():
network = {}
network['W1'] = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])
network['b1'] = np.array([0.1,0.2,0.3])
network['W2'] = np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])
network['b2'] = np.array([0.1,0.2])
network['W3'] = np.array([[0.1,0.3],[0.2,0.4]])
network['b3'] = np.array([0.1,0.2])
return network
14
3層ニューラルネットワーク 実装例(続き) def forward(network,x): W1,W2,W3 = network['W1'],network['W2'],network['W3'] b1,b2,b3 = network['b1'],network['b2'],network['b3'] a1 = np.dot(x,W1) + b1 z1 = sigmoid(a1) a2 = np.dot(z1,W2) + b2 z2 = sigmoid(a2) a3 = np.dot(z2,W3) + b3 y = identity_function(a3) return y network = init_network() x = np.array([1.0,0.5]) y = forward(network,x) print(y) 15
まとめ まとめ1 まとめ2 まとめ3 行列の積の計算にはNumPyの関数np.dot()を用いる 関数 np.dot() を用いると、複数の重みつき和をまとめて一度に計算できる 活性化関数にはNumPy配列をそのまま渡せばいい 出力層の活性化関数は解きたい問題に応じて決める 16
17