逆伝播の仕組み

Page content

やりたいことは簡単のニューラルネットワークの逆伝播の仕組みを計算することです。自分の中の整理のためでもあります。

もっともシンプルの例で、猫なのか、猫じゃないなのかを判断するただ一層のニューラルネットワークで、一枚の画像で訓練するとします。下の図で仕組みを表しています。

png

上の図では

x : 入力画像

w: 求めたい重み

b: 求めたいバイアス

z: 順伝播(Forward Propagation)の線形部分

a: zに対して活性化関数を適した後

L: 損失関数(Lost function)

砕けた言い方にするとニューラルネットワークの目的は損失関数を小さくして、その時に重み(w)とバイアス (b) を求めるだけです。

猫であるかどうかを判断する2分類の問題は損失関数として、クロスエントロピー関数(Cross entropy)を使うことができます。下の形になっています。

L(a,y)=(ylog(a)+(1y)log(1a))

a: 毎回訓練の結果を表しています。0.2, 0.6, 0.9などを値になります。

y: 実際ある画像は猫であるかどうかを示す値で、例えば0か1かになります。

zに活性関数(Activation Function)を適応する結果はaで、活性関数はシグモイド関数の場合、a=11+ez です。

このネットワークの目的はdW (重みの微分)と db(バイアスの微分)を求めることで、これらを求めたら下の式で少しずつ重みWbを更新して、損失関数の値を小さくします。αは学習率(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)+(1y)log(1a)))

=y1a(1y)11a(1)

=ya+1y1a

そしてdzを求める。

dz=dL(a,y)dz=dL(a,y)dadadz

(ya+1y1a)(a(1a))=

ay

最後に

dW=dL(a,y)dW=dL(a,y)dadadzdzdW=

dzx=(ay)x

同じように

db=dL(a,y)dadadzdzdb=dz=(ay)

これで全ての未知数はわかったので、重みを更新することができるわけです。

W[l]=W[l]α dW[l]

b[l]=b[l]α db[l]

このネットワークはもっともシンプルの構造をしているので、そもそも隠れ層もないです。L層ののネットワークになる、求め方は少し複雑になりますが、考え方は一緒で、L層のdWldblを求めるだけです。

実際にこのネットワークを実装する際に上で求めた結果を利用してNumpyで実装する形になります。

http://ml-cheatsheet.readthedocs.io/en/latest/loss_functions.html

About Wang Zhijun
機械学習好きなプログラマー