「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
ニューラルネットワークは、
「重み」のパラメタ(w1, w2, θ(-b))の決定は人手によって行われる。
という問題を、データから自動で「重み」のパラメタを学習することで解決する。
第0層 第1層 第2層~ 入力層 → 中間層(隠れ層) → 出力層
というように単一方向へのみ信号が伝播する。
ステップ関数とシグモイド関数とReUL関数がある。
なんとなく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)
5.0 ~ 5.0までの0.1刻みのプロットをステップ関数にかけてグラフ化する。
"""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刻みのプロットをシグモイド関数にかけてグラフ化する。
"""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()
ReUL(Rectified Linear Unit)関数
┌ │0 ( a <= 0 ) y = h(a) = < │a ( a > 0 ) └
"""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刻みのプロットをReUL関数にかけてグラフ化する。
"""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()
バイアスと活性化関数を省略し重みだけとする。
X行列 * W行列=Y行列
┌ ┐ ┌ ┐ ┌ ┐ │a1 b1│ │a2 b2 c2│ = │a1a2+b1d2 a1b2+b1e2 a1c2+b1f2│ └ ┘ │ │ └ ┘ │d2 e2 f2│ └ ┘ X行列 W行列 Y行列
#ref(): File not found: "simple.png" at page "ニューラルネットワーク"
┌ ┐ ┌ ┐ ┌ ┐ │a b│ │1 3 5│ = │1a+2b 3a+4b 5a+6b│ └ ┘ │ │ └ ┘ │2 4 6│ └ ┘ X行列 W行列 Y行列
>>> x=np.array([1,2]) >>> x array([1, 2]) >>> w=np.array([[1,3,5],[2,4,6]]) >>> w array([[1, 3, 5], [2, 4, 6]]) >>> y=np.dot(x,w) >>> y array([ 5, 11, 17])
#ref(): File not found: "3tier.png" at page "ニューラルネットワーク"
┌ ┐ │w(1)11 w(1)21 w(1)31│ │w(1)12 w(1)22 w(1)32│ └ ┘
h(A(1)) = Z(1)