자동미분과 이원수
개요
이원수란, 두 실수 $a, b \in \mathbb{R}$에 대해서 다음과 같은 꼴로 표현되는 수를 말한다.
$$ a + b\epsilon, \quad (\epsilon^{2} = 0,\ \epsilon \neq 0) $$
이원수의 덧셈과 곱셈 체계는 자동 미분의 전진모드forward mode를 구현하는데 유용하게 쓰인다.
설명1
자동미분, 특히 전진모드에서는 함수 $f$의 함숫값을 계산할 때 미분계수를 동시에 계산한다. 가령 $y(x) = \ln (x^{2} + \sin x)$의 미분계수를 계산하고 싶다면, 다음과 같은 식으로 계산한다. $\dot{w} = \dfrac{dw}{dx}$라고 하자.
$$ \begin{array}{|l|l|} \hline \textbf{Forward calulations} & \textbf{Derivatives} \\ \hline w_{1} = x & \dot{w}_{1} = 1 \\[0.5em] w_{2} = w_{1}^{2} & \dot{w}_{2} = 2w_{1} = 2x \\[0.5em] w_{3} = \sin w_{1} & \dot{w}_{3} = \cos w_{1} = \cos x \\[0.5em] w_{4} = w_{2} + w_{3} & \dot{w}_{4} = \dot{w}_{2} + \dot{w}_{3} = 2x + \cos x \\[0.5em] w_{5} = \ln (w_{4}) & \dot{w}_{5} = \dfrac{\dot{w}_{4}}{w_{4}} = \dfrac{2x + \cos x}{x^{2} + \sin x} \\[1em] \hline \end{array} $$
이때 이원수의 연산을 이용하면, 함숫값과 미분계수를 자연스럽게 동시에 계산하는 것이 가능하다. 이원수 $a + b\epsilon$을 $(a, b)$와 같이 순서쌍으로 나타내자.
$$ (a, b) + (c, d) = (a + c, b + d) $$
$$ (a, b)(c, d) = (ac, ab+bc) $$
미분가능한 함수 $f : \mathbb{R} \to \mathbb{R}$에 대해서, $$ f(a + b\epsilon) := f(a) + f^{\prime}(a)b\epsilon = \big( f(a), b f^{\prime}(a) \big) $$
$f, g : \mathbb{R} \to \mathbb{R}$에 대해서, $$ (f \circ g)(a + b\epsilon) := f(g(a)) + f^{\prime}(g(a))g^{\prime}(a)b\epsilon = \big( f(g(a)), bf^{\prime}(g(a))g^{\prime}(a) \big) $$
미분
미분할 변수 $x$를 이원수 $(x, 1)$와 같이 나타내고 상수 $\alpha$를 $(\alpha, 0)$과 같이 나타내자. 그러면 이원수의 덧셈은 그 자체로 첫번째 성분은 함숫값, 두번째 성분은 미분계수를 나타낸다. 가령 $x \mapsto x + \alpha$라는 함수(즉 상수 덧셈)를 생각해보자. $x = x_{0}$에서 이 함수의 함숫값은 $x_{0} + \alpha$이고, 미분계수는 $\left. \dfrac{d(x + \alpha)}{dx}\right|_{x = x_{0}} = 1$이다. 이제 이원수로 나타내면 다음과 같다.
$$ (x, 1) + (\alpha, 0) = (x + \alpha, 1) $$
첫번째 성분은 함숫값 $x + \alpha$이고, 두번째 성분은 미분계수 $1$이다. 물론 $x + x$에 대해서도 성립한다.
$$ \dfrac{d(x+x)}{dx} = 2x, \qquad (x, 1) + (x, 1) = (2x, 2) $$
이제 함수 $x \mapsto \alpha x$ (곱셈)를 생각해보자. $x = x_{0}$에서 이 함수의 함숫값은 $\alpha x_{0}$이고, 미분계수는 $\left. \dfrac{d(\alpha x)}{dx} \right|_{x = x_{0}} = \alpha$이다. 이원수로 나타내면 다음과 같다.
$$ (x, 1)(\alpha, 0) = (\alpha x, x\cdot0 + 1\cdot\alpha) = (\alpha x, \alpha) $$
마찬가지로 첫번째 성분은 함숫값, 두번째 성분은 미분계수가 됨을 알 수 있다. 거듭제곱 $x \mapsto x^{2}$에 대해서도 성립한다.
$$ (x, 1)(x, 1) = (x^{2}, 2x) $$
미분가능한 함수 $f$와 함성함수 $f \circ g$에 대입했을 때도 미분계수가 보존된다.
$$ f(x, 1) = \big( f(x), f^{\prime}(x) \big), \qquad (f \circ g)(x, 1) = \big( f(g(x)), f^{\prime}(g(x))g^{\prime}(x) \big) $$
이제 위에서 봤던 예시 $y(x) = \ln (x^{2} + \sin x)$를 다시 보자. 실수 $x$가 아니라 이원수 $(x, 1)$를 대입하여 계산하면 다음과 같다.
$$ \begin{align*} (x, 1)^{2} &= (x^{2}, 2x) \\ \sin(x, 1) &= (\sin x, \cos x) \\ (x, 1)^{2} + \sin(x, 1) &= (x^{2} + \sin x, 2x + \cos x) \\ \ln( (x, 1)^{2} + \sin(x, 1) ) &= \ln(x^{2} + \sin x, 2x + \cos x) \\ &= \Big( \ln(x^{2} + \sin x), (2x + \cos x) \dfrac{1}{x^{2} + \sin x} \Big) \\ &= \Big( \ln(x^{2} + \sin x), \dfrac{2x + \cos x}{x^{2} + \sin x} \Big) \\ \end{align*} $$
실제로 $y$의 도함수를 구해보면 아래와 같으므로, 이원수의 두번째 성분과 같다는 것을 확인할 수 있다.
$$ \dfrac{dy}{dx} = \dfrac{d}{dx} \ln (x^{2} + \sin x) = \dfrac{2x + \cos x}{x^{2} + \sin x} $$
줄리아에서 자동미분을 구현하는 방법은 아래의 같이보기를 참고하라.
같이보기
Mykel J. Kochenderfer, Algorithms for Optimization (2019), p27-32 ↩︎