前回ので1つのニューラルネットワークのニューロン(ノードと言ったりする)を学習させる方法をやりました。今回はそれらをつないだ本当のネットワークの話です。
1つ1つは同じですから、基本的には前回やったことをすべてのニューロンに対して行うだけです。
3入力3出力
今回学習させるのはこんな3入力3出力で3層のネットワークです。ただ、ニューラルなのは最後の2層だけで、1層目は入力された値をそのまま出力するだけです。
2層目は受け取ったそれぞれの入力を元に出力します。線が多いので見にくいのですが、中央の入出力だけに注目するとこのようになっています。真ん中のレイヤーは入力それぞれに重み付けがあることになりますね。出力は3本に分かれますが、どれも同じ値になります。
3層目も同じく3つの入力がありますが、出力が1つだけで、これが最終の出力となります。3入力3出力のネットワークですから例えば入力がx(0.2, 0,1, 0.9)に基づいてy(0.8, 0.7, 0.7)といった出力になるわけです。これの学習をさせてみましょう。
最後の層の学習
前回どうやって学習させたか思い出してみましょう。
学習は「出力と教師データにズレがなければしなくていい」ものですよね。つまり、「出力と教師データがズレてるから調整しないといけない」わけです。
実際のズレを元にシグモイド関数の微分を使って、例えば3だけ無駄に大きいってときに「入力をどんだけ変えたら出力を3下げられるか」を計算して、そこから重み付けを変更したわけです。
ということはパラメーターの調整には”ズレ”と”そのパラメーターを変えるとどれだけ誤差が小さくなるか”の2つが必要なわけです。
出力に近い側から調整していきます。
何故かと言うと値を変えたらどのぐらい誤差が小さくなるかを最も計算しやすいからです。
y1を見てみましょう。
y1 -> E
まず、y1はどれぐらいズレてるんでしょうか。その誤差ってどれぐらい全体の誤差に影響してるんでしょうか。全体の誤差は教師データを大文字のYで表すとしたら
こうなりますよね。y1はy2やy3に影響しないってのがよくわかります。
じゃあy1が1変わると誤差はどんだけ変わるのかというと
こんな風に簡単になります。
試してみましょう。y1=1でY1=0のときは1多いわけですがその時は。
ということになります。これはつまり「yをあと1増やすと誤差が2増える」という意味ですね。
実際はy1=1の誤差は1で、y1=2の誤差は4ですから(誤差は2乗だからね)予想よりも誤差は増えてますがそれは二次曲線で接線の傾きはどんどんきつくなるからですね。
とにかく、これでy1が1変わると誤差がどのぐらい変わるのかが分かりました。
誤差がわかればy1を調整可能です。
y1を操作しているのはs1ですから、今度はs1を1増やしたらy1がどんぐらい増えるのかを知る必要があります。それがわかれば逆にs1のあるべき値がわかりますね。
s1 -> y1
それ考えるのはすごく簡単です。ただのシグモイド関数ですから
となります。
wn -> s1
ここまでは簡単でした。ここからも簡単です。
とうとうs1を1変えたらy1がどれだけ変わるかが分かったので、s1の変化で誤差がどれだけ変わるかを計算できるようになりました。では、s1を変えるにはどうしたらいいかってところでとうとう重み付けが出てきます。
s1ってのはそもそも、ただ入力を合計しただけのものです。
x0とw0ってのは、前回やったやつで、x0は常に1です。
さて、じゃあwnが1増えるとs1がどれだけ増えるのかを考えてみましょう。
wnを1増やすとs1がxnだけ増えるという話です。
考えてみれば当たり前な話で、元々 x*wですからx*(w+1)にしたら増えるのはxです。
xが0だと0になります。これは「入力がないんだからwを何にしてもs1に影響なんかないよ」
ってことです。
合体!
ここまででEに与えるy1の影響、y1に与えるs1の影響、s1に与えるwnの影響を計算しました。
ここまでわかると「Eを1減らすにはwnをどれだけ減らせばいいか」がわかります。それは
これですが、それって
こういうことです。これは今まで計算してきた3つのものですから。
ということになります。3つのものそれぞれに色を付けてみました。
完成したこの式は見るとややこしいですが、1個ずつ見ていけば大したことありませんでしたね。
この式を計算するとある数値が計算されます(xnとy1とs1は既に一回ネットワーク動かせば出てくる値で、Y1は教師データですから)。その値ってのは「wnを1増やすと誤差がどれだけ”増えるか”」という値です。3だったなら1増やすと誤差が3増えるわけです。
この値を使ってwnを調整するには
と、イプシロンを使ってちょっとずつ動かしていけばいいことになります。
これで最後の層の入力側は全部調整できます。
1つ前の層の学習
では、その1つ前はどうやりましょう。
結局のところ「誤差にどれだけ影響するか」 ってことですよね。
では、上の図のs5っていうニューロンに注目してみましょう。
前回、wnの誤差への影響 を調べましたが、それを簡単にxnの誤差への影響に変えられます。
でしたから、これをxnにすると
ということになります。ということはさっきの式をちょっと変えるとこのs5の出力が1変わると誤差がどれだけ変わるのかがわかります。
ただし、これは出力y1だけの話です。y2とy3にも影響を及ぼしてしまいます。
この誤差E1~E3というのは足すとEになります。独立していますからね。
ということは全部合わせた「s5の出力y5が誤差に与える影響」ってのは
こうなります。少し見やすくすると
これは計算可能ですね。しかも前回計算したはずの値が沢山入っています。
これでy5をどういう風に調整したら誤差が大きくなるか・小さくなるかがわかります。
ここまでくればさっきやったのと全く同じなんです。いま”出力をどうしたら良いか”まではわかってるんですから。
s5のy5への影響は
です。
s5につながってる入力側の重み付けwnがs5に与える影響は
ですよね。
今までのを合計するとこうなります。
これは何かというとs5の入力側のwnが全体の誤差に与える影響です。
あと何をすべきかはわかりますね。これとイプシロンを使ってwnを調整します。
これを2層目全体に行えば2層目は終わりです
伝搬していく
誤差逆伝搬法をコンピューターで計算する時に便利なのは
における
が既に計算済みであるという点です。それを使って自分の出力が誤差に与える影響を調べて入力側の重み付けを調整していくのです。
仮にこれの前にもう1層あったらどうしましょう。
もうみなさんなら出来るはずです。層がどんなにあったとしても次の層が誤差に与える影響ってのはその層の誤差を調整した時に計算するからです。