誤差逆伝播法のための計算グラフまとめ 赤本5章の復習 その1

ディープラーニング学習の赤本こと「ゼロから作る DeepLearning」の5章の復習です。

誤差逆伝播法は何が嬉しいのか。
計算グラフは何が嬉しいのか。
このあたりを理解してみようと思います。

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装  

この記事で書いてあること

  • 計算グラフは何が嬉しいのか
  • 計算グラフの書き方

この記事でさらっとしか書いていないこと

  • フォワードモード微分とリバースモード微分の比較

要は微分をする時に順伝播方向と逆伝播方向との2択がありますが、 なぜ逆伝播の方が良いのかという話です。  

tl;dr 計算グラフは何が嬉しいのか

誤差逆伝播法を使うことで計算にかかる時間を大幅に短縮することができるのですが、この誤差逆伝播法を直感的に理解し、簡単に計算する方法として計算グラフというものがあります。

計算グラフ自体の何が嬉しいのかというと、誤差の順伝播や逆伝播を考える時に、 ただ数式でやっていくのではなく、マッピングすることで視覚的に連鎖律や微分の流れを理解しやすくなることです。  

復習

少し復習になりますが、 そもそも今ぼくたちが何を求めたいのでしょうか。

それは、「『損失関数』に対する『重みパラメータ』の更新の指標」なわけです。
これの前提にあるのが、大まかに言うと以下の2点になるかと思います。

  • 損失関数を最小値(=0)に近づけたい
  • そうなる時の重みパラメータを知りたい

つまり、


この値が

  • 負になる時→その重みパラメータを正の方向に更新
  • 正になるとき→その重みパラメータを負の方向へ更新

のような操作をするわけですね。  

フォワードモード微分とリバースモード微分をさらっと

つまり、誤差逆伝播法は何が嬉しいのかという話のことです。
コレに関しては、以下の記事がわかりやすいので参考にしてみてください。
結構重要です。

【参考】計算グラフの微積分:バックプロパゲーションを理解する | コンピュータサイエンス | POSTD  

めっちゃ要約すると、 入力がn個で、出力が1個のモデルがあり、 「出力に対する入力の微分」を求めたい時に、 順伝播だととn回マッピングする必要がありますが、 逆伝播だと1回のマッピングで済むわけです。
つまり、n倍の速さで計算ができるというわけです。  

ここまでは理論の話です。  

実装の話

  計算グラフの話に行く前に数値微分の話を少しします。  

数値微分のメリット

シンプルで実装が簡単 →つまり実装や計算のミスが起きにくい

数値微分のデメリット

計算に時間がかかる →これは次回の記事で詳しく見てみます

計算グラフのメリット

  • 局所的な計算ができる
    • →つまりモデルの中身の複雑性は気にせずに最終的な出力に対する微分をどのノードにでも適用できる
  • 途中の計算の結果を全て保持することができる
  • TensorBoardのGRAPHSを理解できるようになる
    • →性能の良いモデルを実装できるようになる

計算グラフのデメリット

  • 数値微分に比べると実装がやや複雑になる
    • →そこで理論的に、プログラム的にミスを犯す可能性が高くなる。

計算グラフの作り方

計算グラフというのはこんなやつのことです。
上の右向きの細い矢印が順伝播、左向きの矢印が逆伝播を表しています。

この図は、y=f(x)というレイヤを表しており、 上位レイヤから流れてくるEをxで微分した値がxの下に記述されます。

主に使うのは以下の3つです。
これらを組み合わせて使います。  

右から左へそのまま伝播させます。
 

値を入れ替えて伝播させます。

 

内積

行列の内積の場合はこんな感じになります。
 

\dfrac {\partial L} {\partial W}=X^{T}\cdot \left( \dfrac {\partial L} {\partial Y}\right)
\dfrac {\partial L} {\partial X}=\dfrac {\partial L} {\partial Y}\cdot W^{T}  

ここで、最後の内積の計算グラフの導出を簡単に示します。

まず①について。

②について。
 

他にもいくつかあるようです。
以下の記事を参考にしてみてください。

【参考】誤差逆伝播法等に用いる 計算グラフ の基本パーツ – Qiita  

具体例

 具体例としてtanhを見てみましょう。
計算グラフはこんな感じになります。

これを実際に計算グラフを使って求めてみます。
ちょっと式変形して右辺の変数が1つになるようにします。

 y=\tanh \left( x\right) =\dfrac {e^{x}-e^{-x}} {e^{x}+e^{-x}} =1-\dfrac {2} {e^{2x}+1}

またこの両端の式を式変形すると

 e^{2x}+1=\dfrac {2} {1-y}  e^{2x} = \dfrac {1+y} {1-y} を導出できるのでこれを利用してy’をyの式で書いてみます。

という感じでy’をyの式で書くことができました。

これを実際に1から計算グラフで書いてみると以下のようになります。

右から順々に誤差を求めていき、左端にたどり着きます。
ここでは式の中にxが含まれていますが、上述したような式変形を行うとちゃんと1-y^{2}になるのがわかるかと思います。

次回の記事ではプログラムの観点から見ていきます。

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装