🍉しいたげられたしいたけ

NO WAR! 戊争反察Ceasefire Now! 䞀刻も早い停戊を

O'REILLY『れロから䜜るDeep Learning』5章誀差逆䌝播法は芋かけに反しお意倖な難関だったその3

前回の内容、すなわち「2章パヌセプトロンによる論理ゲヌト」を誀差逆䌝播法で機械孊習するずいう自䜜の挔習問題を解いおみた感想だ。

たずは、なぜ自分の曞いたスクリプトが「動けばいい」ずいうレベルにすぎず拙い、ずいうこずを繰り返したかずいう理由から。O'REILLY『れロから䜜るDeep Learning ―Pythonで孊ぶディヌプラヌニングの理論ず実装』以䞋 “テキスト”に掲茉されおいるクラスは、前回䜿甚した数倀埮分を求める “numerical_gradient” にしろ、6月26日付 および 7月1日付 蚘事で䜿甚したMNISTデヌタセットの掚定倀を求める  “TwoLayerNet”  にしろ、目的以倖の甚途に䜿甚しおも立掟に動䜜しおくれた。私の曞いたスクリプトでは、絶察そうはいくたい。

これは、たたたた動いたのではなく、あえおそう䜜っおあるのだず思う。䟋えば “numerical_gradient” の゜ヌスコヌドを芋るず、for 文“むテレヌタ” ず蚀うのだそうだが倚次元配列にも柔軟に察応できるような曞き方になっおいる。「はぁ、Python ではこう曞くのか」ず思わずにはいられなかった。それ以前に、考えおみれば私は昔から汎甚性の高いプログラムの曞き方をするのが苊手だった。ナマの数倀“リテラル” ずか “マゞックナンバヌ” ずか呌ばれるを倉数に眮き換えるだけでも抵抗を感じるタむプなのだ。䞀蚀で蚀えばプログラミングの才胜がないのだろう。

スポンサヌリンク

 

 

そんなわけで、たったあれだけのスクリプトを曞くだけでも、情けないほどの劎力を消費した。どこでどう苊劎したかを他人に説明するのは案倖困難なものだが、他に躓きの石ずなった原因ずしお、比范的蚀語化しやすいかなず思ったものに、次のようなこずがある。

逆䌝播を求める匏は、簡略であるに越したこずはない。だから Sigmoid レむダの逆䌝播を䞎える匏は、順䌝播における出力偎の倉数を甚いお、次のように蚘述した。出力偎ずいうのは、䞞印で瀺した蚈算ノヌドの右偎ずいうこずだ。前回の゚ントリヌ に瀺した自䜜の蚈算グラフから取り出したものなので、倉数名がテキストP146の図5-22ず異なっおいるが、内容的には同䞀のはずである。

f:id:watto:20170713231205p:plain

䞀方、2乗和誀差の逆䌝播を䞎える匏は、順䌝播の入力偎の倉数を甚いお蚘述した。入力偎ずいうのは、蚈算ノヌドの巊偎ずいうこずだ。テキストに党く同じものはないが、P132 の “z = t**2”、“t = x + y” に぀いおの逆䌝播を瀺した図5-8が、内容的には䌌おいるはずだ。

f:id:watto:20170713231158p:plain

入力偎の倉数だろうず出力偎の倉数だろうず、クラスのむンスタンス倉数内郚倉数ずしお保存するこずはいくらでも可胜なので、䜿いやすいものを䜿えばよい。蚀語化しおしたえばただそれだけのこずだが、やっおる最䞭は、「あれ オレ今䜕を蚈算しおるの」ずわけわかんなくなるこずが、しょっちゅう起きたのだ。

たた結果ずしお、スクリプトに z1*(1  z1)*(z1  t) ずいう内郚倉数 z1 の3乗を蚈算する匏が珟れた。「これなに」おなもんで倧倉気持ち悪く感じたが、間違っおはいないはずだよね

気持ち悪さを少しでも解消しようず思っお、぀かダメを抌すような぀もりで、Excel で同じこずをやっおみようず思い぀いた。Excel を䜿えば内郚倉数の䞀芧化、可芖化ができるはずだ。

事前の予想に反しおこれも少なからず苊劎したが、こんなものができたず結果のスクショを瀺す。

f:id:watto:20170714001923p:plain

セル B2D2重み・バむアス、B4D4入力デヌタ・教垫デヌタ、および h 数倀埮分甚埮小倀が入力デヌタである。

以䞋、蚭定した数匏を瀺す。

セル G1掚定倀=B2*B4+C2*C4+D2

セル I1Sigmoid=1/(1+EXP(-1*G2))

セル K22乗和誀差=0.5*(I2-D4)^2

そしお、䜜業゚リアでセル B2重み W[0]、C2重み W[1]、D2バむアス W[2]のいずれかをそれぞれ ±h だけ倉化させ、䞊掲匏ず同内容の蚈算結果の差を取っおセルG9、I9、K9の数倀埮分倀ずする。

䞀方、逆䌝播法による倀ずしお、セル I10 に=I2*(1-I2)z1(1-z1) に盞圓、セル K10 に =I10*(I2-D4)z1(1-z1)(z1-t) に盞圓ずいう数匏を蚭定した。これらがセル I9、K9 ず小数点以䞋5桁のレベルで䞀臎したのは、前回の Python スクリプトず甚いお蚈算した堎合ず同じだった。

参考のため、前回゚ントリヌ に瀺した蚈算グラフを再掲する。

f:id:watto:20170713095158p:plain

぀たり、もう䞀床短く敎理するず、

シグモむドを埮分するには、z1(1-z1) を掛ければいいのだ。

2乗和誀差を埮分するには、(z1-t) を掛ければいいのだ。

䞡者の合成関数を埮分するには、z1(1-z1) ず (z1-t) を掛ければいいのだ。

それはわかっおいるはずなのだが、なんだろうこの「䜕をやっおるんだ」感は 合成関数の埮分法の公匏の導出を、もう䞀床埩習すればいいのだろうか それもわかっおいる぀もりなのだが 

念のため OR ゲヌトに぀いお、さらに蚈算しおみた。

入力デヌタを0、1、教垫デヌタを1ずした堎合の結果。

f:id:watto:20170713231137p:plain

入力デヌタを1、0、教垫デヌタを1ずした堎合の結果。

f:id:watto:20170713231143p:plain

入力デヌタを1、1、教垫デヌタを1ずした堎合の結果。いずれも前回の Python スクリプトで蚈算した結果ず䞀臎した。

f:id:watto:20170713231232p:plain

なんかどっかいっぱい間違いをやらかしお、間違い同士がたたたた偶然うたく盞殺し合っお、あたかも正しい倀が埗られおいるように芋えるだけで、実は党郚間違っおいた、なんおこずはないよね ね誰に蚊く

この項続く。

れロから䜜るDeep Learning ―Pythonで孊ぶディヌプラヌニングの理論ず実装

れロから䜜るDeep Learning ―Pythonで孊ぶディヌプラヌニングの理論ず実装

Â