logo

자동 미분 📂머신러닝

자동 미분

정의1 2

자동 미분automatic differentiation이란, 컴퓨터 프로그래밍 코드로 정의된 함수의 도함수를 구하는 방법을 말한다. AD, autodiff 등으로 줄여 부른다.

설명

자동 미분은 이미 도함수가 알려진 함수들의 합성 함수의 도함수를 연쇄법칙을 이용해서 구하는 것을 말한다. 쉽게 말해서 연쇄법칙 그 자체이다. 연쇄법칙을 프로그래밍 코드로 구현한 것이 자동미분이며, 따라서 자동 미분은 미분을 수치적으로 근사하는 방법과 달리, 미분 계수를 정확하게 계산한다. 딥러닝에서 오차 역전파로 신경망을 최적화할 때 쓰인다. 아래의 설명을 보면 알겠지만, 자동미분은 실제로 도함수를 계산하지 않는다. 그저 이미 알고 있는 도함수를 순차적으로 더하거나 곱하고, 합성할 뿐이다.

계산하는 방법에 따라 크게 전진 모드forward mode후진 모드reverse mode로 구분된다.

$f : \mathbb{R}^{n} \to \mathbb{R}$에 대하여

다음과 같은 이변수 함수 $f$가 주어졌다고 하자.

$$ f(x_{1}, x_{2}) = x_{1}x_{2} + \sin(x_{1}) + 2(x_{1})^{2} $$

편도함수 $\dfrac{\partial f}{\partial x_{1}}$는 다음과 같이 계산된다.

$$ \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} $$

이때 각 항은 아래와 같이 이미 알고 있는 값이다.

$$ \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} $$

즉 $x_{1}$와 $x_{2}$의 값이 정해지면 미분계수는 바로 결정되는 것인데, 이를 프로그래밍 코드로 구현하려고 하면 다음과 같다.

전진 모드

$w_{1} = x_{1}$, $w_{2} = x_{2}$로 두고 $(x_{1}, x_{5}) = (2, 5)$일 때 $f$의 미분계수 $\dfrac{\partial f}{\partial x_{1}}(2,5)$를 구해보자. 더하거나 곱하거나 어떤 함수에 적용할 때 마다 도함수를 기록해나가면 된다. $\dfrac{\partial w}{\partial x_{1}} = \dot{w}$이라 표기하자.

$$ \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} $$

따라서 $\dfrac{\partial f}{\partial x_{1}}(2,5) = \dot{y} = \cos 2 + 13$이다. $w_{7}$을 계산하는 과정에서 $x_{2}$에 대한 미분도 기록해뒀다면 그래디언트 $\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 ↩︎