深層学習4章の誤差逆伝播について
深層学習という青いイルカさんが表紙の本がありまして最近読んでいる。
重み上限など自分の知らないことが載っていてまだまだ勉強不足と感じる。
4章の誤差逆伝播について、二乗誤差の第n層の重みの更新を考えるとき
こんな式が載っていた。右辺の第二項の微分を計算したいが、出力層から第n層までを展開、微分しなくてはいけなくなり計算量が大きくなる問題があるということが書いてあった。そしてその問題を解決するために出てきたのが誤差逆伝播法。
読み進めていった結果
(;^ω^)
こんな感じの顔になった。連鎖律からどういう微分をするのかはわかった気はするがスッキリしなかった。こっちも微分の計算大変じゃね?という感想。
この資料を参考に実際計算をしてみる。
ネットワークとしては中間層が1つの以下を考える。
まずは順伝播、h1,z1,h2,z2,p1,p2を求める。
中間層。活性化関数としてシグモイド関数を使うことにする。
出力層。活性化関数は恒等関数。
次は逆伝播。重みの更新を試みる。まずは誤差関数の値を計算する
次に出力層に近い w5 ~ w8 の重みの勾配を求める。
w5はネットワークの図から、p1を通過するのがわかる。連鎖律から以下のように式で表せるはず。
右辺の第1項は
第2項は
右辺が計算できたので、勾配を求めてそのまま重み w5 を更新する。
元の w5 の値より若干増加した。同様に w6 を更新する。右辺の第1項は共通、計算してあるので
w7,w8については、この2つは p2 を通過しているので dE/dp2 を計算する。
w7,w8を更新する
w7とw8はw5,w6に比べてかなり減少してしまった。あってるのか不安になってきた。
最後に入力と中間の間にある w1~w4の重みを更新する。
w1 は z1とh1 を通過しているので
右辺の第1項から計算していく。z1はp1とp2に値を伝播しているので以下のような連鎖律で表せるはず。
dE1/dp1とdE2/dp2はw5~w8の重みの更新をする際に計算したのでやるべき計算は dp1/dz1 と dp2/dz1 のみ
右辺第2項と第3項を計算する。
こっちは比較的楽。右辺が計算できたので勾配を求め、w1の重みを更新する。
w2も同様に
w3はz2,h2を通過してきているので、
右辺第1項を計算する
右辺第2項と第3項も計算する
右辺が全て計算できたので w3 の重みを更新する。
w4も同様に
これで w1 ~ w8 全ての重みが更新できた。
誤差逆伝搬における入力と中間の間の w1 ~ w4 の重みに更新については出力層から微分の値を受け取ることで、局所的な計算のみで勾配を計算できる認識でいいのかな?
計算が苦手な自分でも求められたから楽にはなってるだろう。多層になればなおさらな気がした。