背景
- ニューラルネットの重みなどのパラメータ決定を勾配法で行う
- 勾配法の計算の際に損失関数の微分が必要
- 微分計算の高速化が求められる.
- その高速化のために誤差逆伝播法を用いるのが一般的
- その誤差逆伝播法を数式ではなく,計算グラフから理解してみる.
計算グラフとは
複雑な処理からなる計算を可視化する方法として,計算グラフ(Computational graph)がある.
例えば,という数式を考える.
3つの演算からなり,加算が2つで乗算が1つ.
この式を計算グラフ化すると下図のようになる.
この式の値をもとめるには,入力変数に特定の値を代入して,ノードを順に計算していく.
たとえば,,とすると, 式の値は20になる.
計算グラフの自動微分
アルゴリズムで定義された関数を解析し,微分を計算するアルゴリズムを導出する技術のことを自動微分(Automatic differentiation)という.
計算グラフを使ってその自動微分を計算してみよう.
たとえば上図で,a方向のeの微分や,b方向のeの微分は何だろう.
計算グラフを見ると,直接接続されているノード間では,微分を計算できそうだ.
たとえば,a方向のcの微分や,b方向のcの微分などだ.
これらを図に加えると以下のようになる.
では,直接接続されていないノード間の微分はどう求めるのか?
たとえばaはどうeに影響するのかを追ってみると,
aは1変化したら,上図からcは1変化する.
cが1変化すると,上図からeはd変化する.
結果的に,aが1変化するとeはd変化することになる.
あるノードからあるノードへの微分を求めるときには,道筋の微分係数を合計する.
例えばbに対するeの微分係数は,b→c→eとb→d→eの2つの道筋を考えて,
$$
\frac{\partial e}{\partial b} =
1 * d + 1 * e
$$
となる.
この方法は直観的であり,自動微分の中でもforward-modeと呼ばれる方法だ.
でもニューラルネットの場合,後述するreverse-modeの方が適している.
forward-mode自動微分とreverse-mode自動微分
計算グラフから微分を導く方法には2種類ある.
forward-mode とreverse-modeだ.
どちらも基本原理は連鎖律を用いた微分の分解である.
たとえば,シンプルな合成関数である
に対して連鎖律を適用すると,以下を得る.
$$
\frac{dy}{dx} = \frac{dy}{dw} \frac{dw}{dx}
$$
forward-modeは連鎖律を内側から外側に計算し,
reverse-modeは連鎖律を外側から内側に計算する.
forward-mode自動微分
forward-modeでは,最初に微分を行う入力変数を決めて,全ての中間変数の微分を計算していく.
下図の , , , , の5つの変数の入力変数に対する微分を計算すると,
以下のようになる.
の計算をするときに,既に算出した下流の,を利用している.
このように,下流の計算で上流の結果を利用するのが,forward-modeの特徴となる.
出力変数が多いときにはこのforward-modeを使うのが計算量で有利.
reverse-mode自動微分
reverse-modeでは,1つの出力変数について,全ての中間変数に対する微分を計算していく.
例を考えてみる.
出力変数のeについて,各中間変数に対する微分を計算してみる.
reverse-modeでは計算グラフの後ろ側から計算していくイメージだ.
,の計算をするときに,既に算出した下流の,を利用している.
このように,上流の計算で下流の結果を利用するのが,reverse-modeの特徴となる.
したがって,入力変数が多いときにはこのreverse-modeを使うのが計算量で有利と言える.
ニューラルネットの場合, 微分を得たい入力変数は高次元で,出力変数はスカラーであるので, reverse-modeを利用する.
なお誤差逆伝播法はこのreverse-modeの1例である. これ以降はreverse-modeに限定して話を進める.