前回ので1つのニューラルネットワークのニューロン(ノードと言ったりする)を学習させる方法をやりました。今回はそれらをつないだ本当のネットワークの話です。
1つ1つは同じですから、基本的には前回やったことをすべてのニューロンに対して行うだけです。

3入力3出力

今回学習させるのはこんな3入力3出力で3層のネットワークです。ただ、ニューラルなのは最後の2層だけで、1層目は入力された値をそのまま出力するだけです。

Screen Shot 2014-12-02 at 20.30.26

2層目は受け取ったそれぞれの入力を元に出力します。線が多いので見にくいのですが、中央の入出力だけに注目するとこのようになっています。真ん中のレイヤーは入力それぞれに重み付けがあることになりますね。出力は3本に分かれますが、どれも同じ値になります。

Screen Shot 2014-12-02 at 20.32.38

3層目も同じく3つの入力がありますが、出力が1つだけで、これが最終の出力となります。3入力3出力のネットワークですから例えば入力がx(0.2, 0,1, 0.9)に基づいてy(0.8, 0.7, 0.7)といった出力になるわけです。これの学習をさせてみましょう。

最後の層の学習

前回どうやって学習させたか思い出してみましょう。
学習は「出力と教師データにズレがなければしなくていい」ものですよね。つまり、「出力と教師データがズレてるから調整しないといけない」わけです。
実際のズレを元にシグモイド関数の微分を使って、例えば3だけ無駄に大きいってときに「入力をどんだけ変えたら出力を3下げられるか」を計算して、そこから重み付けを変更したわけです。
ということはパラメーターの調整には”ズレ”と”そのパラメーターを変えるとどれだけ誤差が小さくなるか”の2つが必要なわけです。

出力に近い側から調整していきます。
何故かと言うと値を変えたらどのぐらい誤差が小さくなるかを最も計算しやすいからです。
y1を見てみましょう。

Screen Shot 2014-12-02 at 21.11.03

y1 -> E
まず、y1はどれぐらいズレてるんでしょうか。その誤差ってどれぐらい全体の誤差に影響してるんでしょうか。全体の誤差は教師データを大文字のYで表すとしたら

E = (y_1 - Y_1)^2 + (y_2 - Y_2)^2 + (y_3 - Y_3)^2

こうなりますよね。y1はy2やy3に影響しないってのがよくわかります。
じゃあy1が1変わると誤差はどんだけ変わるのかというと

\frac{\partial E}{\partial y_1}=2 y_1 (y_1 - Y_1)

こんな風に簡単になります。
試してみましょう。y1=1でY1=0のときは1多いわけですがその時は。

\frac{\partial E}{\partial y_1}=2 \cdot 1 (1 - 0) = 2

ということになります。これはつまり「yをあと1増やすと誤差が2増える」という意味ですね。
実際はy1=1の誤差は1で、y1=2の誤差は4ですから(誤差は2乗だからね)予想よりも誤差は増えてますがそれは二次曲線で接線の傾きはどんどんきつくなるからですね。

とにかく、これでy1が1変わると誤差がどのぐらい変わるのかが分かりました。
誤差がわかればy1を調整可能です。
y1を操作しているのはs1ですから、今度はs1を1増やしたらy1がどんぐらい増えるのかを知る必要があります。それがわかれば逆にs1のあるべき値がわかりますね。

s1 -> y1
それ考えるのはすごく簡単です。ただのシグモイド関数ですから

\frac{\partial y_1}{\partial s_1} = sigmoid'(s_1)

\frac{\partial y_1}{\partial s_1} = \alpha sigmoid(s_1) (1 - sigmoid(s_1))

となります。

wn -> s1
ここまでは簡単でした。ここからも簡単です。
とうとうs1を1変えたらy1がどれだけ変わるかが分かったので、s1の変化で誤差がどれだけ変わるかを計算できるようになりました。では、s1を変えるにはどうしたらいいかってところでとうとう重み付けが出てきます。
s1ってのはそもそも、ただ入力を合計しただけのものです。

s_1 = w_{0}x_{0} + w_{1}x_{1} + w_{2}x_{2} + w_{3}x_{3}

s_1 = {\displaystyle \sum_{i=0}^{3}} w_{i}x_{i}

x0とw0ってのは、前回やったやつで、x0は常に1です。
さて、じゃあwnが1増えるとs1がどれだけ増えるのかを考えてみましょう。

s_1 = w_{0}x_{0} + w_{1}x_{1} + w_{2}x_{2} + w_{3}x_{3}

\frac{\partial s_1}{\partial w_n}= x_{n}

wnを1増やすとs1がxnだけ増えるという話です。
考えてみれば当たり前な話で、元々 x*wですからx*(w+1)にしたら増えるのはxです。
xが0だと0になります。これは「入力がないんだからwを何にしてもs1に影響なんかないよ」
ってことです。

合体!
ここまででEに与えるy1の影響、y1に与えるs1の影響、s1に与えるwnの影響を計算しました。
ここまでわかると「Eを1減らすにはwnをどれだけ減らせばいいか」がわかります。それは

\frac{\partial E}{\partial w_n}

これですが、それって

\frac{\partial E}{\partial w_n} = \frac{\partial E}{\partial y_1} \frac{\partial y_1}{\partial s_1} \frac{\partial s_1}{\partial w_n}

こういうことです。これは今まで計算してきた3つのものですから。

\frac{\partial E}{\partial w_n} = 2 y_1(y_1 - Y_1) \cdot \alpha sigmoid(s_1)( 1 - sigmoid(s_1) ) \cdot x_{n}

ということになります。3つのものそれぞれに色を付けてみました。

Screen_Shot_2015-01-30_at_18_18_20

完成したこの式は見るとややこしいですが、1個ずつ見ていけば大したことありませんでしたね。
この式を計算するとある数値が計算されます(xnとy1とs1は既に一回ネットワーク動かせば出てくる値で、Y1は教師データですから)。その値ってのは「wnを1増やすと誤差がどれだけ”増えるか”」という値です。3だったなら1増やすと誤差が3増えるわけです。

この値を使ってwnを調整するには

w_n(new) = w_n(old) - \varepsilon \frac{\partial E}{\partial w_n}

と、イプシロンを使ってちょっとずつ動かしていけばいいことになります。
これで最後の層の入力側は全部調整できます。

1つ前の層の学習

では、その1つ前はどうやりましょう。

Screen Shot 2014-12-02 at 22.08.54

 

結局のところ「誤差にどれだけ影響するか」 ってことですよね。
では、上の図のs5っていうニューロンに注目してみましょう。
前回、wnの誤差への影響 を調べましたが、それを簡単にxnの誤差への影響に変えられます。

s_1 = w_{0}x_{0} + w_{1}x_{1} + w_{2}x_{2} + w_{3}x_{3}

\frac{\partial s_1}{\partial w_n}= x_{n}

でしたから、これをxnにすると

\frac{\partial s_1}{\partial x_n}= w_{n}

ということになります。ということはさっきの式をちょっと変えるとこのs5の出力が1変わると誤差がどれだけ変わるのかがわかります。

\frac{\partial E_1}{\partial y_5} = \frac{\partial E_1}{\partial y_1} \frac{\partial y_1}{\partial s_1} \frac{\partial s_1}{\partial x_n}

\frac{\partial E_1}{\partial y_5} = \frac{\partial E_1}{\partial y_1} \frac{\partial y_1}{\partial s_1} w_1

ただし、これは出力y1だけの話です。y2とy3にも影響を及ぼしてしまいます。

\frac{\partial E_2}{\partial y_5} = \frac{\partial E_2}{\partial y_2} \frac{\partial y_2}{\partial s_2} w_2

\frac{\partial E_3}{\partial y_5} = \frac{\partial E_2}{\partial y_1} \frac{\partial y_3}{\partial s_3} w_3

この誤差E1~E3というのは足すとEになります。独立していますからね。
ということは全部合わせた「s5の出力y5が誤差に与える影響」ってのは

\frac{\partial E}{\partial y_5} = \frac{\partial E_1}{\partial y_1} \frac{\partial y_1}{\partial s_1} w_1 + \frac{\partial E_2}{\partial y_2} \frac{\partial y_2}{\partial s_2} w_2 + \frac{\partial E_2}{\partial y_1} \frac{\partial y_3}{\partial s_3} w_3

こうなります。少し見やすくすると
\frac{\partial E}{\partial y_5} = \frac{\partial E_1}{\partial s_1} w_1 + \frac{\partial E_2}{\partial s_2} w_2 + \frac{\partial E_3}{\partial s_3} w_3

これは計算可能ですね。しかも前回計算したはずの値が沢山入っています。
これでy5をどういう風に調整したら誤差が大きくなるか・小さくなるかがわかります。
ここまでくればさっきやったのと全く同じなんです。いま”出力をどうしたら良いか”まではわかってるんですから。

s5のy5への影響は

\frac{\partial y_5}{\partial s_5} = \alpha sigmoid(s_5) (1 - sigmoid(s_5))

です。
s5につながってる入力側の重み付けwnがs5に与える影響は

\frac{\partial s_5}{\partial w_n}= x_{n}

ですよね。
今までのを合計するとこうなります。

\frac{\partial E}{\partial w_n} = \frac{\partial E}{\partial y_5} \frac{\partial y_5}{\partial s_5} \frac{\partial s_5}{\partial w_n}

\frac{\partial E}{\partial w_n} = (\frac{\partial E_1}{\partial s_1} w_1 + \frac{\partial E_2}{\partial s_2} w_2 + \frac{\partial E_3}{\partial s_3} w_3) \cdot \alpha sigmoid(s_5)( 1 - sigmoid(s_5) \cdot w_{n}

これは何かというとs5の入力側のwnが全体の誤差に与える影響です。
あと何をすべきかはわかりますね。これとイプシロンを使ってwnを調整します。
これを2層目全体に行えば2層目は終わりです

伝搬していく

誤差逆伝搬法をコンピューターで計算する時に便利なのは

\frac{\partial E}{\partial w_n} = (\frac{\partial E_1}{\partial s_1} w_1 + \frac{\partial E_2}{\partial s_2} w_2 + \frac{\partial E_3}{\partial s_3} w_3) \cdot \alpha sigmoid(s_5)( 1 - sigmoid(s_5) \cdot w_{n}

における

\frac{\partial E_n}{\partial s_n}

が既に計算済みであるという点です。それを使って自分の出力が誤差に与える影響を調べて入力側の重み付けを調整していくのです。

仮にこれの前にもう1層あったらどうしましょう。
もうみなさんなら出来るはずです。層がどんなにあったとしても次の層が誤差に与える影響ってのはその層の誤差を調整した時に計算するからです。

前へ 人工ニューラルネットワークへ戻る


0 Comments

コメントを残す