Pythonを用いた機械学習20日目
前回は一次関数を使って誤差を小さくしていく方法(損失関数が最小になる重みを見つけること)を学んだ。今回はニューラルネットワークにおける誤差を小さくする方法について学習していく。
前回の内容はこちらからどうぞ。
*誤差逆伝播
ニューラルネットワークにおいて、入力と出力の間に中間層を挟み、それぞれの接続にバイアスを考慮する。入力があり、1ないし複数のニューロンを経て出力にいたる。そこに最適な重みを求めていく(順伝播)。これを逆方向に考え、求める出力から重みを決定していくことを誤差逆伝播という。
*順伝播と誤差逆伝播を行うコード
>>> import numpy as np
>>>
>>> V = np.array([[0.1, 0.3], [0.2, 0.4]])
>>> W = np.array([[0.1, 0.3], [0.2, 0.4]])
>>>
>>> t = np.array([[1, 0]])
>>>
>>> eta = 0.005
>>>
>>> x = np.array([[1, 0.5]])
>>> y = x.dot(V)
>>> z = y.dot(W)
>>>
>>> delta2 = z - t
>>> grad_w = y.T.dot(delta2)
>>> delta1 = delta2.dot(W.T)
>>> grad_v = x.T.dot(delta1)
>>> W -= eta * grad_w
>>> V -= eta * grad_v
>>>
>>> print(V)
[[0.10005 0.30036 ]
[0.200025 0.40018 ]]
>>> print(W)
[[0.10088 0.29974]
[0.2022 0.39935]]
>>>
*活性化関数を使って求めるコード
>>> import numpy as np
>>>
>>> def sigmoid(x):
... return 1 / (1 + np.exp(-x))
...
>>> def softmax(x):
... e = np.exp(x)
... return e / np.sum(e)
...
>>> V = np.array([[0.1, 0.3], [0.2, 0.4]])
>>> W = np.array([[0.1, 0.3], [0.2, 0.4]])
>>>
>>> t = np.array([[1, 0]])
>>>
>>> eta = 0.005
>>>
>>> x = np.array([[1, 0.5]])
>>> y = sigmoid(x.dot(V))
>>> z = softmax(y.dot(W))
>>>
>>> delta2 = x - t
>>> grad_W = y.T.dot(delta2)
>>> sigmoid_dash = y * (1 - y)
>>> delta1 = delta2.dot(W.T) * sigmoid_dash
>>> grad_V = x.T.dot(delta1)
>>> W -= eta * grad_W
>>> V -= eta * grad_V
>>>
>>> print(V)
[[0.09981436 0.299765 ]
[0.19990718 0.3998825 ]]
>>> print(W)
[[0.1 0.29862542]
[0.2 0.39844385]]
>>>
これを繰り返して少しずつ重みを更新していき、誤差を小さくしていく。
いいなと思ったら応援しよう!
よろしければサポートお願いします。いただいたサポートを皆さんに還元していきたいと思っております。