導入
はじめに
勾配法において、損失関数を重みにおいて偏微分しそれを用いて重みを更新します。その手法の一種として以前に数値微分法という微分の定義に基づき、近似を用いることで勾配を求める手法をまとめました。今回は勾配を求める手法の1つとして誤差逆伝播法についてできるだけ丁寧にまとめたいと思います。僕自身その道について未だ初心者であるので同じような方の助けになれば幸いです。
おねがい
本記事は勉強中の筆者が書いたものです。ゆえに少し解釈違いがあったり、文字が違っていたりするかもしれません。そういった場合にはコメントまたは下の問い合わせフォームから教えていただけると幸いです。
また、誤差逆伝播法を学ぶにあたり文章を読むだけでなく手元に紙とペンを用意して数式を書きながら読んでいただければ理解が捗ると思います。
誤差逆伝播法って聞くと…??
僕は未だ自分でモデルを組む等したことがありません。なので誤差逆伝播法についての認識は"勾配を求めるいい感じの方法"ぐらいでしかないです。その認識は実際に使ってみないと変わらないと思うので今のところはこれで良しとします。
大学の講義や教科書でのBackpropの説明はほとんど,「教師あり学習の文脈で多層パーセプトロンを識別器あるいは関数近似器として訓練する」という文脈でなされます.そのため,初学者はBackpropは教師あり学習のためのアルゴリズムであると誤解してしまうケースが多々あるのではないかと思います.しかし後で説明する通り,Backpropは単に損失関数の微分を効率的に計算する手法の1つであって教師あり学習とか教師なし学習とかは関係ありません.
引用元:https://qiita.com/Ugo-Nama/items/04814a13c9ea84978a4c#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB
だそうです。僕は講義で習っておらず、現場でも使っていないのでその誤認はしていないので気を付けます。
ニューラルネットモデル
今回扱うニューラルネットモデルを以下に示します。
今回は、簡略化のために中間層を1層とします。それぞれの変数の定義をします。
- …入力
- …重み
- …活性化関数
→前の層からの出力(x)に重み(w)を掛けたものを全ての矢印において行っている
→先ほど求めたbを活性化関数に引数として渡す。これにより求めたzが次の層へ渡される
- …教師データ
については後述します。
誤差逆伝播法
では、誤差逆伝播法についてやっていきましょう。誤差逆伝播法は簡単に言うと、出力層の重みを更新してから中間層の重みを更新するように、入力層→出力層ではなく、出力層→入力層へと流れていく様子からこの名前が付けられました。バックプロパケーションや誤差逆伝搬法とも呼ばれます。
最終的にバックプロップによって最小化したい損失関数は以下のようになります。
この式の意味するところは損失関数を学習に使うデータ数だけ足して平均したものが目的となる関数であるということです。
この関数を最小化するために勾配を求めます。つまり各データに対する勾配を得なければなりません。求めて平均をとることでが得られます。当然、における勾配も求める必要があります。
を求める
連鎖律を用いて
となるのでそれぞれ分解します。繰り返しになりますが、は間の重みであり、からの入力総和です。
まず、
となります。
次に、
とすると
となり簡単な式になりました!
>ちょっと待ちなさい!っていったいなんなのよ!
ごめんなさいお母さん!!
はとなっているので当然ですね。例えば損失関数を二乗誤差とし、係数など諸々を無視するととなります。ゆえに概要としては結合先で生じた誤差に関する変数といった感じです。
つまり、結合元のニューロンの出力と結合先での誤差を掛けたものであることがわかります。
重みの更新規則は
となります。
以上で重みについては終わりです。次は中間層周りの重みについてです。
を求める
ではを求めていきましょう。数式が一見複雑そうに見えますが、内容としてはこれまでと同様レベルです。一緒に頑張りましょう。
となります。
ここで先ほどと同様に結合先への総和があるので
とします。
よって
となり、先ほど同様簡単な形になりました!
…はい。例のごとくが何を指すのか調査しましょう。k層があるのでΣを用います。
であり、であり、さらにとなります。
これらを用いるとは
となります。
この式と以下の図に着目してみてください。本来のNNは入力層→出力層(左から右)へと処理が為されるのに対し、中間層のを求めるために出力層からと中間層~出力層間の重みを掛け合わせたものを逆方向へ伝達させていることがわかります。
は先ほども述べた通り出力層の誤差です。誤差を逆方向へ伝播させていることから誤差逆伝播法と言います(と思います)。
更新規則を書きます。
ここまで、誤差逆伝播法について数式を交えつつ解説してきました。次はより抽象的に図を主としてイメージを掴みます。
誤差逆伝播法のまとめ
①NNにxを入力し、b,z,a,さらに出力yを得て全て保持しておく
入力し出力を得るのでここは普通に順伝播(左から右)
②教師データtと出力yから出力層の誤差δを計算する。そして逆方向へ伝播し、重みvと乗算しΣ計算することで中間層の誤差を計算する
③δを用いて重みを更新する
さいごに
いかがでしたでしょうか。数式は多かったと思いますが1つ1つ丁寧に追っていけば大学1年生レベルのものであることがわかると思います。誤差逆伝播法を使うと何がメリットで何がデメリットなのかわからないので今後調べていきたいと思います。例えば誤差逆伝播法は"人間っぽい"考え方ではないから別の手法を考えていると研究室の先輩が輪講で言ってたような言ってなかったような…みたいな。
参考文献