逆伝播の仕組み
やりたいことは簡単のニューラルネットワークの逆伝播の仕組みを計算することです。自分の中の整理のためでもあります。
もっともシンプルの例で、猫なのか、猫じゃないなのかを判断するただ一層のニューラルネットワークで、一枚の画像で訓練するとします。下の図で仕組みを表しています。
上の図では
xx : 入力画像
ww: 求めたい重み
bb: 求めたいバイアス
zz: 順伝播(Forward Propagation)の線形部分
aa: zzに対して活性化関数を適した後
LL: 損失関数(Lost function)
砕けた言い方にするとニューラルネットワークの目的は損失関数を小さくして、その時に重み(ww)とバイアス (bb) を求めるだけです。
猫であるかどうかを判断する2分類の問題は損失関数として、クロスエントロピー関数(Cross entropy)を使うことができます。下の形になっています。
L(a,y)=−(ylog(a)+(1−y)log(1−a))L(a,y)=−(ylog(a)+(1−y)log(1−a))
aa: 毎回訓練の結果を表しています。0.2, 0.6, 0.9などを値になります。
yy: 実際ある画像は猫であるかどうかを示す値で、例えば0か1かになります。
zzに活性関数(Activation Function)を適応する結果はaaで、活性関数はシグモイド関数の場合、a=11+e−za=11+e−z です。
このネットワークの目的はdWdW (重みの微分)と dbdb(バイアスの微分)を求めることで、これらを求めたら下の式で少しずつ重みWWとbbを更新して、損失関数の値を小さくします。αは学習率(Learning rate)
W[l]=W[l]−α dW[l]
b[l]=b[l]−α db[l]
目標がわかったので、これでdWを求めてみます。
dW=ddWL(a,y)
微分法の中で連鎖律があって、dWは下の形に書き換えることができます。
dW=dL(a,y)dadadzdzdW
タスクをブレイクダウンして、求めると
da=dL(a,y)da=(−(ylog(a)+(1−y)log(1−a)))‘