ニューラルネットワークを理解する #9 学習を早めるテクニック「誤差逆伝播法」①

 学習を早めるテクニックの2つ目が「誤差逆伝搬法」です。(なんかかっこいいね)

これは簡単に言ってしまえば微分を効率的に計算することができるような方法です。(勾配法では微分を使って最小値を探すのでした)

計算グラフというのを用いると理解しやすいので、計算グラフのお話からしていきましょう!


計算グラフとは

その名の通り、計算の過程をグラフ化したものです。
これはそんなに難しくありません。

例えば以下のような式を計算グラフにしてみましょう。
100 * 2 = 200


簡単ですね。
入力があって処理があって結果を出すだけです。

計算グラフの利点

計算グラフを利用することで以下のような嬉しいことがあります。
  • 計算の過程が保存される
  • 全体を知らずとも一つのノードに注目するだけで計算できる

ノードとはひとつの⚪︎の処理の部分です。

もう少し複雑な計算グラフを見てみましょう。


画像のように途中の結果はひとつのノードごとに保持されていることがわかりますね。
さらにその前にどんな計算をしたかは知ったこっちゃなくて、ただ入力を処理していくだけです。

そしてこれが微分を効率的に計算できることとつながっているのです!

逆伝搬とは

計算グラフの左から右へ計算を進めていくことを順伝搬と言います。(順番に伝えていく)
逆伝搬はその逆なので、右から左へ進めていくことになります。(出力から入力へ)
そしてこの逆伝搬に計算を進めることで微分を効率的に計算することが可能です。

そしてこのことを理解するためには連鎖律を理解しなければいけません。

連鎖率とは

連鎖率の定義は
ある関数が合成関数で表される場合、その合成関数の微分は、合成関数を構成するそれぞれの関数の微分の積によって表すことができる。


まあよくわかりません。

合成関数というのは複数の関数によって表される関数です。

例えば以下のような関数。

z = t ^ 2

t = x + y


この関数のxに関するzの微分tに関するzの微分xに関するtの微分の積で表せるということです。

xに関するzの微分 =  tに関するzの微分 * xに関するtの微分


式にするとよりわかりやすいです。

∂z / ∂x = ∂z / ∂t * ∂t / ∂x

∂z / ∂x = ∂z / ∂t * ∂t / ∂x (∂t が打ち消しあう)

∂z / ∂x = ∂z / ∂x


上の例で確かめてみましょう。
まずxに関するzの微分 を求めてみます。
z = ( x + y ) ^ 2 = x ^ 2 + 2xy + y ^ 2

これを微分すると
∂z / ∂x = 2(x + y)

これがtに関するzの微分xに関するtの微分の積と一致するはずです。
∂z / ∂t = 2t
∂t / ∂x = 1
2t * 1 = 2t = 2(x + y)

見事一致しました!


長くなってきたので今回はここまで。


コメント