Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

Python DeepLearningに再挑戦 12 誤差逆伝播法

概要

Python DeepLearningに再挑戦 12 誤差逆伝播

参考書籍

誤差逆伝播

誤差逆伝播法->重みパラメータの勾配の計算を効率よく行う手法。数式と計算グラフで理解を進める。

計算グラフで解く

簡単な問題1個100円のりんごを2個買う場合の支払う金額を求めよ。消費税は10%とする。

f:id:riikku:20161223071037p:plain

これが計算グラフらしい。

簡単な問題2 りんご1個100円、みかん1個150円 りんご2個、みかん3個購入。消費税10%。

f:id:riikku:20161223072247p:plain

ポイント * 計算グラフを構築する * 計算グラフ上で計算を左から右へ進める->これを順伝播という。(forward propagation) * 右から左へ -> 逆伝播(backward propagation)

局所的な計算

計算グラフの特徴は、局所的な計算を伝播することによって、最終的な結果を得ることができる点。全体の計算結果とは関係なく、自分に関する情報だけから次の結果を出力することができる。

局所的な計算=比較的単純な計算を伝播することにより、全体を構成する複雑な計算の結果を得られることができる。

なぜ計算グラフで解くのか?

  • 局所的な計算によって問題を単純化できる。
  • 最大の理由は、逆方向の伝播によって微分を効率よく計算できる点

例えば、りんごの値段が値上がりした場合、最終的な支払い金額にどのように影響するかを知りたいとする。これは「りんごの値段に関する支払い金額の微分」を求めることに相当する。りんごの値段をx、支払い金額をLとした場合、∂L/∂x を求めることと同じ意味になる。

りんごの問題の例でいうと、逆伝播で微分を求められる。以下の図を参照。

f:id:riikku:20161223074758p:plain

リンゴの値段に関する微分だけを求めましたが、「消費税に関する支払 金額の微分」や「リンゴの個数に関する支払金額の微分」も同様の手順で求めること ができます。そして、その際には、途中まで求めた微分(途中まで流れた微分)の結 果を共有することができ、効率良く複数の微分を計算することができるのです。この ように、計算グラフの利点は、順伝播と逆伝播によって、各変数の微分の値を効率良 く求めることができる点にあります。

確かに!!これはプログラミング全体にも適応できそうなグラフだな。

連鎖率・計算グラフの逆伝播

局所的な微分を伝達する原理は、連鎖率(chain rule)によるもの。 chainer ってここから来てるのかなぁ(^ ^)

y=f(x)という計算があるとして、この計算の逆伝播は以下の通り。

f:id:riikku:20161223075850p:plain

信号Eに対して、ノードの局所的な微分を乗算して、それを次のノード(逆伝播の次のノードのため、1つ前のノード)に伝達していく。

例えば、y=f(x)=x*2 だった場合、微分は、∂y/∂x = 2x になる。E2xを前のノードに渡す。

こっちの方が効率が良いらしい。それは連鎖率の原理から説明できるとのこと。

連鎖律とは

まず合成関数について知る必要がある。合成関数とは、複数の関数によって構成される関数のこと。

z = (x+y)**2 という式は、z = t**2、t = x + yのように2つの式で構成される。

連鎖律は、合成関数の微分についての性質であり、定義は以下の通り。

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

∂z/∂x = ∂z/∂t * ∂t/∂x 
-> ∂z/∂x = ∂z/<s>∂t </s>* <s>∂t</s>/∂x 
-> ∂z/∂x = ∂z/∂x 

連鎖率を使って、微分 ∂z/∂xを求めてみる。

局所的な微分を先に求める。

∂z/∂t = 2t
∂t/∂x = 1

最終的に求めたい、∂z/∂x は微分の積で計算できる。

∂z/∂x = ∂x/∂t * ∂t/∂x = 2t * 1 = 2(x+y)

連鎖律と計算グラフ

f:id:riikku:20161223094939p:plain

連鎖律(合成関数の微分の積)を利用して、微分を前のノードに渡していくと、微分が計算できる。 確かに、数式がかなりシンプルになるかも。

逆伝播

f:id:riikku:20161223104229p:plain

f:id:riikku:20161223104238p:plain

加算、乗算の時で、逆伝播が違う。加算の時は、合成関数の掛け合わせが一旦リセットされる。 乗算の時は、合成関数の掛け合わせが続く