今日もラビットチャレンジの超AI入門講座で勉強した。
むずかしくなってきていて、一回見ただけじゃ理解できない。。。
何度も反復しないと。
2-4-2_微分の連鎖律
今日学んだこと
連鎖率
合成関数の微分は、構成されている関数の微分を掛け算したものとなる。
シグモイド関数の微分
シグモイド関数を微分すると
(1-sigmoid(a))*sigmoid(a)
となり、シグモイド関数で表現できる。
w(Weight)の更新式
w=w-dE/w
パラメータwの更新をPythonで行う。
>>> import numpy as np
>>>
#シグモイド関数の定義
>>> def sigmoid(x):
... return 1/(1+np.exp(-x))
...
>>>
#2乗誤差の定義
>>> def mse(y,t):
... return 0.5*(np.sum((y-t)**2))
...
>>>
#w、x、tを定義
>>> w=np.array([[0.1]])
>>> x=np.array([[3]])
>>> t=np.array([[1]])
>>>
#aを計算
>>> a=w.dot(x)
#確率yを計算
>>> y=sigmoid(a)
>>> y
array([[0.57444252]])
#誤差Eを計算
>>> E=mse(y,t)
>>> E
0.09054958574879755
>>>
>>>
#Eをwで微分を関数にて定義
>>> def diff(y,t,a,x):
... return ((y-t)*(1-sigmoid(a))*sigmoid(a).dot(x.T))
...
>>>
>>> w
array([[0.1]])
#wの更新式
>>> w=w-diff(y,t,a,x)
>>> w
array([[0.41209319]])
>>>
##更新したwで再計算
>>> a=w.dot(x)
>>> y=sigmoid(a)
>>> y
array([[0.77491576]])
>>> E=mse(y,t)
#誤差が小さくなった。
>>> E
0.02533145832272906
>>>
#もう一回wを更新
>>> w=w-diff(y,t,a,x)
>>> a=w.dot(x)
>>> y=sigmoid(a)
>>> E=mse(y,t)
>>> y
array([[0.83056193]])
#先ほどより誤差が小さくなった。
>>> E
0.014354629740687509
>>>
#もう一回wを更新
>>> w=w-diff(y,t,a,x)
>>> a=w.dot(x)
>>> y=sigmoid(a)
#誤差が小さくなった。
>>> E-mse(y,t)
0.004366366403377217
>>>
#wの更新をfor文で100回繰り返す
#「_」のところは、変数ですが、変数を使わない場合は慣習で「__を書いておくみたい
>>> for _ in range(100):
... w=w-diff(y,t,a,x)
... a=w.dot(x)
... y=sigmoid(a)
... E=mse(y,t)
...
>>>
>>>
>>> y
array([[0.97596999]])
#誤差がかなり小さくなった。
>>> E
0.000288720710169242
>>>
勉強時間
今日: 1時間
総勉強時間: 5.5時間