logo

自動微分 📂機械学習

自動微分

정의1 2

自動微分automatic differentiationとは、コンピュータプログラムのコードで定義された関数の導関数を求める方法のことを指す。AD、autodiffなどと略されることもある。

説明

自動微分とは、すでに導関数が知られている関数の合成関数の導関数を連鎖律を利用して求めることを指す。簡単に言えば、連鎖律そのものである。連鎖律をプログラムコードで実装したのが自動微分であり、したがって自動微分は微分を数値的に近似する方法とは異なり、微分係数を正確に計算する。ディープラーニングでは誤差逆伝播を用いてニューラルネットワークを最適化する際に使われる。以下の説明を見ると分かるように、自動微分は実際には導関数を計算しない。ただ、すでに知っている導関数を順次加算したり乗算したり、合成するだけである。

計算方法に応じて、大きく前進モードforward mode後退モードreverse modeに分けられる。

f:RnRf : \mathbb{R}^{n} \to \mathbb{R}について

次のような二変数関数ffが与えられたとしよう。

f(x1,x2)=x1x2+sin(x1)+2(x1)2 f(x_{1}, x_{2}) = x_{1}x_{2} + \sin(x_{1}) + 2(x_{1})^{2}

偏導関数fx1\dfrac{\partial f}{\partial x_{1}}は次のように計算される。

fx1=(x1x2)x1+sin(x1)x1+2(x1)2 \dfrac{\partial f}{\partial x_{1}} = \dfrac{\partial (x_{1}x_{2})}{\partial x_{1}} + \dfrac{\partial \sin(x_{1})}{\partial x_{1}} + 2(x_{1})^{2}

このとき各項は以下のようにすでに知っている値である。

(x1x2)x1=x2,sin(x1)x1=cos(x1),2(x1)2x1=4x1 \dfrac{\partial (x_{1}x_{2})}{\partial x_{1}} = x_{2},\qquad \dfrac{\partial \sin(x_{1})}{\partial x_{1}} = \cos(x_{1}),\qquad \dfrac{\partial 2(x_{1})^{2}}{\partial x_{1}} = 4x_{1}

つまり、x1x_{1}x2x_{2}の値が決まれば微分係数はすぐに決定されるのであり、これをプログラムコードで実装しようとすると次のようになる。

前進モード

w1=x1w_{1} = x_{1}w2=x2w_{2} = x_{2}とおいて(x1,x5)=(2,5)(x_{1}, x_{5}) = (2, 5)のとき、ffの微分係数fx1(2,5)\dfrac{\partial f}{\partial x_{1}}(2,5)を求めてみよう。加算したり乗算したり、ある関数に適用するたびに導関数を記録していけばいい。wx1=w˙\dfrac{\partial w}{\partial x_{1}} = \dot{w}と表記しよう。

Forward calulationsDerivativesw1=x1=2w˙1=1w2=x2=5w˙2=0w3=w1w2=10w˙3=w2=5w4=sin(w1)=sin2w˙4=cos2w5=(w1)2=4w˙5=2w1=4w6=2w5=8w˙6=2w˙5=8w7=w3+w4+w6=10+sin2+8=yw˙7=w˙3+w˙4+w˙6=5+cos2+8=y˙ \begin{array}{|l|l|} \hline \textbf{Forward calulations} & \textbf{Derivatives} \\ \hline w_{1} = x_{1} = 2 & \dot{w}_{1} = 1 \\ w_{2} = x_{2} = 5 & \dot{w}_{2} = 0 \\ \hline w_{3} = w_{1}w_{2} = 10 & \dot{w}_{3} = w_{2} = 5 \\ w_{4} = \sin(w_{1}) = \sin 2 & \dot{w}_{4} = \cos 2 \\ w_{5} = (w_{1})^{2} = 4 & \dot{w}_{5} = 2w_{1} = 4 \\ w_{6} = 2w_{5} = 8 & \dot{w}_{6} = 2\dot{w}_{5} = 8 \\ \hline \begin{align*} w_{7} &= w_{3} + w_{4} + w_{6} \\ &= 10 + \sin 2 + 8 \\ &= y \end{align*} & \begin{align*} \dot{w}_{7} &= \dot{w}_{3} + \dot{w}_{4} + \dot{w}_{6} \\ &= 5 + \cos 2 + 8 \\ &= \dot{y} \end{align*} \\ \hline \end{array}

したがってfx1(2,5)=y˙=cos2+13\dfrac{\partial f}{\partial x_{1}}(2,5) = \dot{y} = \cos 2 + 13となる。w7w_{7}を計算する過程でx2x_{2}に対する微分も記録しておけば、勾配f=[x1fx2f]T\nabla f = [\partial_{x_{1}}f \quad \partial_{x_{2}}f]^{T}を得ることができる。

関連項目


  1. Mykel J. Kochenderfer, Algorithms for Optimization (2019), p27-32 ↩︎

  2. https://en.wikipedia.org/wiki/Automatic_differentiation ↩︎