自動微分
自動微分(じどうびぶん、英: automatic differentiation, autodiff, AD)やアルゴリズム微分(英: algorithmic differentiation)とは、プログラムで定義された関数を解析し、関数の値と同時に偏導関数の値を計算するアルゴリズムである。
自動微分は複雑なプログラムであっても加減乗除などの基本的な算術演算や基本的な関数(指数関数・対数関数・三角関数など)のような基本的な演算の組み合わせで構成されていることを利用し、これらの演算に対して合成関数の偏微分の連鎖律を繰り返し適用することによって実現される。自動微分を用いることで偏導関数値を少ない計算量で自動的に求めることができる。
他の微分方式との違い

自動微分は以下のどちらとも異なる。
- 記号微分・数式微分(symbolic differentiation) - 原関数を表す数式から数式処理により導関数を導出する。数式処理システムで実装されている。
- 数値微分(numerical differentiation) - 原関数の値から数値的に微分係数を算出する
記号微分は効率が悪くなりやすく、プログラムで定義された関数から微分表現を導くのは困難であるという問題がある。一方、数値微分では離散化の際の丸め誤差や桁落ちによる精度の低下が問題である。さらに、どちらの手法も計算量や誤差の関係で高次の微分係数を求めることが難しい。また、勾配を用いた最適化で必要となる、多くの入力変数を持つ関数に対する偏微分値の計算を行うには速度が遅い。自動微分はこれらの古典的手法の問題を解決する。[1]
また、自動微分は計算フローを追いかけることで計算できるので、分岐(if文)やループや再帰を含むようなアルゴリズムでも偏微分できる[1]。
合成関数の偏微分の連鎖律
自動微分の基本原理は、合成関数の偏微分の連鎖律を用いた偏微分の分解である。
合成関数の偏微分の連鎖律とは 例として次の関数を考える。
トップダウン型自動微分を用いて偏導関数値を計算するための演算は以下の通りである(関数値を求める時と順番が逆であることに注意)。 関数値を求める関数を記述した元のソースコードから、偏導関数値を計算する処理を含んだプログラムを自動的に生成する手法である。ソースコード変換はあらゆるプログラミング言語で実装でき、コンパイル時の最適化を行いやすいが、自動微分ツールの作成は難しい。
この手法は演算子のオーバーロードがサポートされているプログラミング言語で記述されたソースコードに対してのみ適用可能である。元のソースコードの流れを大きく変更することなく実現できるが、基本データ型の変更などの小さな変更は必要である。
ボトムアップ型自動微分をオペレータオーバーロードで実現するのは容易である。トップダウン型自動微分についても可能であるが、現状のコンパイラではボトムアップ型自動微分と比べると最適化の面で不利である。
自動微分を実装したライブラリなどのソフトウェアが多数存在する。2010年代の第3次人工知能ブームの際にディープラーニングに自動微分が必要なため、TensorFlowやPyTorchなどトップダウン型の自動微分を含むライブラリが多数作られた。
オペレータオーバーローディング
ソフトウェア
脚注
- ^ a b Automatic Differentiation in Machine Learning: a Survey
- ^ 連鎖律(多変数関数の合成関数の微分) | 高校数学の美しい物語
- ^ 合成関数の偏微分における連鎖律(チェインルール)とその証明 | 数学の景色
- ^ a b R.E. Wengert (1964). “A simple automatic derivative evaluation program”. Comm. ACM 7: 463–464. doi:10.1145/355586.364791 .
- ^ Andreas Griewank (2012). “Who Invented the Reverse Mode of Differentiation”. Optimization Stories, Documenta Matematica Extra Volume ISMP: 389–400 .
- ^ Bartholomew-Biggs, Michael; Brown, Steven; Christianson, Bruce; Dixon, Laurence (2000). “Automatic differentiation of algorithms”. Journal of Computational and Applied Mathematics 124 (1-2): 171-190. doi:10.1016/S0377-0427(00)00422-2 .
- ^ autograd/tutorial.md at master · HIPS/autograd
- ^ Derivatives in Theano — Theano 1.1.2+29.g8b2825658.dirty documentation
- ^ 2104.00219 Fast Jacobian-Vector Product for Deep Networks
- ^ Pearlmutter, Barak A. (1994-01-01). “Fast Exact Multiplication by the Hessian”. Neural Computation 6 (1): 147-160. doi:10.1162/neco.1994.6.1.147.
- ^ HIPS/autograd: Efficiently computes derivatives of numpy code.
- ^ “Conv2d — PyTorch 2.3 documentation”. pytorch.org. 2024年7月2日閲覧。
- ^ “MaxPool2d — PyTorch 2.3 documentation”. pytorch.org. 2024年7月6日閲覧。
参考文献
- 久保田, 光一; 伊理, 正夫 (1998). アルゴリズムの自動微分と応用. 現代非線形科学シリーズ. 3. コロナ社. ISBN 978-4339026023
- 伊理正夫、「高速自動微分法(第2回年会特別講演)」『応用数理』 1993年 3巻 1号 p.58-66, doi:10.11540/bjsiam.3.1_58, 日本応用数理学会
- Rall, Louis B. (1981). Automatic Differentiation: Techniques and Applications. Lecture Notes in Computer Science. 120. Springer. ISBN 3-540-10861-0
- Griewank, Andreas; Walther, Andrea (2008). Evaluating Derivatives: Principles and Techniques of Algorithmic Differentiation. Other Titles in Applied Mathematics. 105 (2nd ed.). SIAM. ISBN 978-0-89871-659-7
- Neidinger, Richard (2010). “Introduction to Automatic Differentiation and MATLAB Object-Oriented Programming”. SIAM Review 52 (3): 545–563. doi:10.1137/080743627 2013年3月15日閲覧。.
外部リンク
- 自動微分のページへのリンク