見出し画像

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]]
>>> 

これを繰り返して少しずつ重みを更新していき、誤差を小さくしていく。



よろしければサポートお願いします。いただいたサポートを皆さんに還元していきたいと思っております。