自動微分(Automatic differentiation)の概要|微分をプログラミングする #1
近年の深層学習(DeepLearning)の発展により、プログラミングにおける微分の取り扱いは重要度を増しています。基本的な意味での微分のプログラミング的取り扱いとしてイメージとして挙がりやすいのは、微分した数式を用いる「数式微分(Symbolic differentiation)」と、数値的に関数から近似を行う「数値微分(Numerical differentiation)」ですが、近年では誤差逆伝播における高速化などの必要性から「自動微分(Automatic differentiation)」についても用いられることが多いです。
これらを受け、当シリーズでは「微分をプログラミングする」をテーマに、基本的な内容から発展的な話題まで取り扱っていければと思います。#1では誤差逆伝播などにも用いられている「自動微分(Automatic differentiation)」の概要について確認していきます。
以下、目次になります。
1. 自動微分(Automatic differentiation)の概要
2. 具体例で確認する自動微分
3. まとめ
1. 自動微分(Automatic differentiation)の概要
1節では「自動微分(Automatic differentiation)の概要」について確認します。最初から詳しく確認するのは大変なので、Wikipediaを元に概要をざっくり掴むことを目的とします(https://ja.wikipedia.org/wiki/自動微分)。
まず、上記が冒頭の解説ですが、「複雑な関数を基本的な演算の組み合わせとみなし、連鎖律を繰り返し利用することで微分を実現する考え方」とざっくり掴んでおけば十分だと思います。また、ここで比較として提示されている数式微分と数値微分については、「数式微分は手計算をベースに導出した導関数を元にした実装(高校レベルのイメージ)」、「数値微分はコンピュータを用いて差分処理を行うことで実現する実装(工学部3〜4年が取り扱うイメージ)」ということで、把握しておけば良いかと思います。
また、自動微分の意義としては上記のように、「解析的な視点が必要な数式微分」と「離散化や桁落ちによる精度が低下する可能性のある数値微分」のどちらにおいても難しい、「高次の微分係数を求める問題」や「入力変数の多い関数の偏微分の計算」などの問題を解決することが挙げられています。
自動微分の仕組みとしては上記のように連鎖律(合成関数の微分)を用いた微分の分解を基本原理としています。誤差逆伝播もこちらがベースなので、同様なイメージを持っておくと良いかと思います。ここで、2種類に分けられていますが、連鎖律の右辺において右から計算するか左から計算するかの違いなので、あまり難しく考えないで大丈夫だと思います。
大体の概要は掴めたかと思うので1節はここまでとし、続く2節で具体例を元に自動微分を確認していければと思います。
2. 具体例で確認する自動微分
2節では自動微分について具体例を元に確認していきます。Wikipediaの例を元にを自動微分的に考えてみます。
まず、通常の偏微分だと上記のように計算できますが、数式が高次になるとこのような偏微分をベースにすると大変なので、自動微分的な考え方(ここではボトムアップ型の自動微分を考えます)を導入します。
自動微分をこの問題に適用すると上記のように、中間出力を〜で表すことで(Operations to compute value)、連鎖律の適用を行なっています(Operations to compute derivative)。
ここで行なった計算を図式化したのが上記です。
また、改めて数式で表すと上記のようになります。
Wikipediaの記載では少しわかりづらいですが、上記の対応があることは抑えておきましょう。具体例を元に大まかな流れは確認できましたので2節はここまでとします。
3. まとめ
#1では自動微分(Automatic differentiation)の概要について確認を行いました。
続く#2ではWikipediaについてもう少し確認しつつ、論文などを参照しながら応用文脈における自動微分について確認していければと思います。