「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
第0層 第1層 第2層~ 入力層 → 中間層(隠れ層) → 出力層
そのままの値を出力(出力に重みを掛けられる。
出力と教師信号の誤差の計算をし、
2→1→0層と層の重みを更新していく(誤差逆伝播法)
関数はニューラルネットワーク全体で1つの関数、個々の合成関数。
(x) ─ f1(x1, x2, x3, ...) → (z) ─ f2(z1, z2, z3, ...) → (w) ─ f3(w1, w2, w3, ...) → (p)
z1 = Φ1(w11x1 + w12x2 + w13x3 + ... + b1) z2 = Φ1(w21x1 + w22x2 + w23x3 + ... + b2) ... zn = Φ1(wn1x1 + wn2x2 + wn3x3 + ... + bn)
上記を行列計算に出来る。
(t1,t2,t3,t4) = (x1,x2,x3,x4)┌w11,w12,w13,w14┐ + (b1,b2,b3,b4) │w21,w22,w23,w24│ │w31,w32,w33,w34│ │w41,w42,w43,w44│ │w51,w52,w53,w54│ └w61,w62,w63,w64┘ (z1,z2,z3,z4) = Φ((t1,t2,t3,t4))
┌t11,t12,t13,t14┐ ┌x11,x12,x13,x14┐┌w11,w12,w13,w14┐ ┌b1,b2,b3,b4┐ │t21,t22,t23,t24│ = │x21,x22,x23,x24││w21,w22,w23,w24│ + │b1,b2,b3,b4│ └t31,t32,t33,t34┘ └x31,x32,x33,x34┘│w31,w32,w33,w34│ └b1,b2,b3,b4┘ │w41,w42,w43,w44│ │w51,w52,w53,w54│ └w61,w62,w63,w64┘
┌z11,z12,z13,z14┐ ┌t11,t12,t13,t14┐ │z21,z22,z23,z24│ = Φ(│t21,t22,t23,t24│) └z31,z32,z33,z34┘ └t31,t32,t33,t34┘
softmax((p1,p2)) = (f1,f2)
┌p11,p12┐ ┌f11,f12┐ softmax(│p21,p22│) = │f21,f22│ └p31,p32┘ └f31,f32┘
cross_entropy_error((f1,f2)) = (l1,l2)
┌f11,f12┐ ┌l11,l12┐ cross_entropy_error(│f21,f22│) = │l21,l22│ └f31,f32┘ └l31,l32┘
なんとなくAPI仕様を知らないと難しい感じ。
"""This is a test program.""" import numpy as np def step_function(x_1): """This is a test program.""" y_1 = x_1 > 0 return y_1.astype(np.int)
"""This is a test program.""" import numpy as np def step_function(x_1): """This is a test program.""" return np.array(x_1 > 0, dtype=np.int)
※ 0、1を真偽のキャストで返しているのがトリッキーだよ。
-5.0 ~ 5.0までの0.1刻みのプロットをStep関数にかけてグラフ化する。
"""This is a test program.""" import numpy as np import matplotlib.pylab as plt def step_function(x_1): """This is a test program.""" # 上記のいずれかの実装を選択。 X = np.arange(-5.0, 5.0, 0.1) Y = step_function(X) plt.plot(X, Y) plt.ylim(-0.1, 1.1) # 図で描画するy軸の範囲を指定 plt.show()
もともと出力層の活性化関数から転用されたものなので詳細はそちらを参照。
1 h(x) = ──────── 1 + exp(-x)
ポイントは、Pythonのブロードキャストによって配列も計算できる点。
"""This is a test program.""" import numpy as np def sigmoid(x_1): """This is a test program.""" return 1 / (1 + np.exp(-x_1))
-5.0 ~ 5.0までの0.1刻みのプロットをSigmoid関数にかけてグラフ化する。
"""This is a test program.""" import numpy as np import matplotlib.pylab as plt def sigmoid(x_1): """This is a test program.""" return 1 / (1 + np.exp(-x_1)) X = np.arange(-5.0, 5.0, 0.1) Y = sigmoid(X) plt.plot(X, Y) plt.ylim(-0.1, 1.1) plt.show()
で、勾配消失問題を引き起こし難く、学習をより高速化させる。
def tanh(x): y = np.tanh(x) return y
x = np.arange(-10.0, 10.0, 0.1) y = tanh(x) plt.plot(x, y) plt.ylim(-1.2, 1.2) plt.show()
┌ │0 ( a <= 0 ) y = h(a) = < │a ( a > 0 ) └
np.maximumとか知らんわwと思ってググると、大きい方を返すと。
(つまり、xが、0以下のときは0が返り、0以上になるとxの値が返る。)
"""This is a test program.""" import numpy as np def relu(x_1): """This is a test program.""" return np.maximum(0, x)
-5.0 ~ 5.0までの0.1刻みのプロットをReLU関数にかけてグラフ化する。
"""This is a test program.""" import numpy as np import matplotlib.pylab as plt def relu(x_1): """This is a test program.""" return np.maximum(0, x_1) X = np.arange(-5.0, 5.0, 0.1) Y = relu(X) plt.plot(X, Y) plt.ylim(-0.1, 5.1) plt.show()
def leaky_relu(x, alpha=0.01): y = np.where(x > 0, x , alpha * x) return y
x = np.arange(-5.0, 5.0, 0.1) y = leaky_relu(x, alpha=0.1) plt.plot(x, y) plt.ylim(-1.0, 5.5) plt.show()
LeakyReLU のく 0 部分の直線の傾きを「学習によって最適化」
LeakyReLU のく 0 部分の直線の傾きを「ランダムに試す」
主に物体認識に使用されている。
def abs_relu(x): return np.abs(x)
学習率とは、
誤差逆伝播法の計算において入力層に近い手前の層まで学習が行き渡らなくなる現象
により(事前学習とファイン・チューニングを用いず、)全体の学習ができるようになった。
(Feedforward Neural Network: FNN)
(Deep Neural Network: DNN)
DNNの説明は本項で行われています。
(Deep Q-Network: DQN)
深層強化学習の事例を参照。
Pythonで学ぶディープラーニングの理論と実装
https://www.oreilly.co.jp/books/9784873117584/
https://github.com/oreilly-japan/deep-learning-from-scratch