深層学習4章の誤差逆伝播について

深層学習という青いイルカさんが表紙の本がありまして最近読んでいる。
重み上限など自分の知らないことが載っていてまだまだ勉強不足と感じる。

4章の誤差逆伝播について、二乗誤差の第n層の重みの更新を考えるとき
f:id:Owatank:20170801132533p:plain
こんな式が載っていた。右辺の第二項の微分を計算したいが、出力層から第n層までを展開、微分しなくてはいけなくなり計算量が大きくなる問題があるということが書いてあった。そしてその問題を解決するために出てきたのが誤差逆伝播

読み進めていった結果

(;^ω^)
こんな感じの顔になった。連鎖律からどういう微分をするのかはわかった気はするがスッキリしなかった。こっちも微分の計算大変じゃね?という感想。
この資料を参考に実際計算をしてみる。

ネットワークとしては中間層が1つの以下を考える。
f:id:Owatank:20170801133428p:plain
まずは順伝播、h1,z1,h2,z2,p1,p2を求める。
中間層。活性化関数としてシグモイド関数を使うことにする。
f:id:Owatank:20170801135358p:plain
出力層。活性化関数は恒等関数。
f:id:Owatank:20170801135736p:plain

次は逆伝播。重みの更新を試みる。まずは誤差関数の値を計算する
f:id:Owatank:20170801140531p:plain
次に出力層に近い w5 ~ w8 の重みの勾配を求める。
w5はネットワークの図から、p1を通過するのがわかる。連鎖律から以下のように式で表せるはず。
f:id:Owatank:20170801142315p:plain
右辺の第1項は
f:id:Owatank:20170801142403p:plain
第2項は
f:id:Owatank:20170801150506p:plain
右辺が計算できたので、勾配を求めてそのまま重み w5 を更新する。
f:id:Owatank:20170801151130p:plain
元の w5 の値より若干増加した。同様に w6 を更新する。右辺の第1項は共通、計算してあるので
f:id:Owatank:20170801151744p:plain
w7,w8については、この2つは p2 を通過しているので dE/dp2 を計算する。
f:id:Owatank:20170801152158p:plain
w7,w8を更新する
f:id:Owatank:20170801152517p:plainf:id:Owatank:20170801152753p:plain
w7とw8はw5,w6に比べてかなり減少してしまった。あってるのか不安になってきた。

最後に入力と中間の間にある w1~w4の重みを更新する。
w1 は z1とh1 を通過しているので
f:id:Owatank:20170801155009p:plain
右辺の第1項から計算していく。z1はp1とp2に値を伝播しているので以下のような連鎖律で表せるはず。
f:id:Owatank:20170801154532p:plain f:id:Owatank:20170801154616p:plain
dE1/dp1とdE2/dp2はw5~w8の重みの更新をする際に計算したのでやるべき計算は dp1/dz1 と dp2/dz1 のみ

右辺第2項と第3項を計算する。
f:id:Owatank:20170801162018p:plain
こっちは比較的楽。右辺が計算できたので勾配を求め、w1の重みを更新する。
f:id:Owatank:20170801162520p:plain
w2も同様に
f:id:Owatank:20170801162859p:plain
w3はz2,h2を通過してきているので、
f:id:Owatank:20170801164224p:plain
右辺第1項を計算する
f:id:Owatank:20170801164309p:plain
右辺第2項と第3項も計算する
f:id:Owatank:20170801164434p:plain
右辺が全て計算できたので w3 の重みを更新する。
f:id:Owatank:20170801164735p:plain
w4も同様に
f:id:Owatank:20170801165035p:plain

これで w1 ~ w8 全ての重みが更新できた。
誤差逆伝搬における入力と中間の間の w1 ~ w4 の重みに更新については出力層から微分の値を受け取ることで、局所的な計算のみで勾配を計算できる認識でいいのかな?
計算が苦手な自分でも求められたから楽にはなってるだろう。多層になればなおさらな気がした。