K 개발자

자동 미분 본문

인공지능/핸즈온 머신러닝

자동 미분

ddingz 2020. 12. 10. 17:52

수동 미분

미적분을 사용하여 편도함수를 유도
함수가 아주 복잡해지면 번거롭고 실수할 위험이 크다.


유한 차분 근사finite difference approximation

$x_ {0}$에서 함수 $h(x)$의 도함수 ${h}'(x_ {0})$는 그 포인트에서 함수의 기울기 ($x$가 포인트 $x_ {0}$에 무한히 가까워질 때 두 점을 지나는 접선의 기울기)
${h}'(x_ {0})=\lim_{x \to x_ {0}}\frac{h(x)-h(x_ {0})}{x-x_ {0}}=\lim_{\varepsilon \to 0}\frac{h(x_ {0}+\varepsilon)-h(x_ {0})}{\varepsilon}$ (뉴턴 차분몫Newton's difference quotient)
결과가 정확하지는 않다. (다른 미분 방식이 제대로 동작하는지 검사하는 데 좋다.)


전진 모드 자동 미분

입력에서 출력까지 계산 그래프를 따라 진행
두 함수 $u$와 $v$의 곱에 대한 도함수는 $\frac{\partial (u\times v)}{\partial x}=\frac{\partial v}{\partial x}\times u+v\frac{\partial u}{\partial x}$이므로 $0\times x+y\times 1$에 해당하는 위 그래프의 오른쪽 큰 가지를 만들 수 있다.
함수 덧셈의 도함수는 각 함수의 도함수를 더한 것과 같으므로 편도함수 $\frac{\partial g}{\partial x}=0+(0\times x+y\times 1)$를 얻을 수 있다. (y에 대해서도 비슷한 편도함수를 얻을 수 있다.)

이원수를 사용

이원수는 $a+b\varepsilon$ 형태를 가지며 $a$와 $b$는 실수이고 $\varepsilon$은 아주 작은 수로 $\varepsilon^{2}=0$ ($\varepsilon \neq 0$)
$h(a+b\varepsilon)=h(a)+b\times{h}'(a)\varepsilon$으로 쓸 수 있어서 $h(a+\varepsilon)$을 계산하면 한번에 $h(a)$와 도함수 ${h}'(a)$를 얻을 수 있다.
위에서 $h(3+\varepsilon,4)$를 계산하여 출력된 이원수의 첫 번째 항이 $f(3,4)$와 같고 두 번째 항은 $\frac{\partial f}{\partial x}(3,4)$와 같게 된다.
$\frac{\partial f}{\partial y}(3,4)$를 계산하려면 그래프를 다시 실행 ($x=3$, $y=4+\varepsilon$)
전진 모드 자동 미분은 1,000개의 파라미터가 있다면 모든 파라미터에 대한 편도함수를 계산하기 위해 그래프를 1,000번 실행 (입력이 많고 출력이 적은 신경망에 불리)


후진 모드 자동 미분reverse-mode autodiff

먼저 정방향으로 (i.e. 입력에서 출력 방향으로) 그래프를 실행하여 각 노드의 값을 계산
그런 다음 두 번째 역방향으로 (i.e. 출력에서 입력 방향으로) 실행할 때 모든 편도함수를 계산

  • 첫 번째 실행할 때 $x=3$과 $y=4$로 시작해서 모든 노드 값이 계산되었다.
  • 이 값은 각 노드 오른쪽 아래에 표기 (e.g. $x\times x=9$)
  • 각 노드는 구분을 위해 $n_ {1}$에서 $n_ {7}$까지 이름을 붙였다. (출력 노드 $n_ {7}$의 값은 $f(3,4)=n_ {7}=42$)

위 방식의 아이디어는 그래프를 따라 내려오면서 변수 노드에 도달할 때까지 각 노드에 대한 편도함수$f(x,y)$를 계산
미분의 연쇄 법칙chain rule을 사용 $\frac{\partial f}{\partial x}=\frac{\partial f}{\partial n_ {i}}\times \frac{\partial n_ {i}}{\partial x}$
$n_ {7}$이 출력 노드이고 $f=n$이므로 $\frac{\partial f}{\partial n_ {7}}=1$
$\frac{\partial f}{\partial n_ {7}}=1$이고 $n_ {7}=n_ {5}+n_ {6}$이므로 $\frac{\partial n_ {7}}{\partial n_ {5}}=1$이다. 따라서$\frac{\partial f}{\partial n_ {5}}=\frac{\partial f}{\partial n_ {7}}\times\frac{\partial n_{7}}{\partial n_ {5}}=1\times 1=1$
$\frac{\partial f}{\partial n_ {5}}=1$이고 $n_ {5}=n_ {4}\times n_ {2}$이므로 $\frac{\partial n_ {5}}{\partial n_ {4}}=n_ {2}$이다. 따라서 $\frac{\partial f}{\partial n_ {4}}=\frac{\partial f}{\partial n_ {5}}\times\frac{\partial n_ {5}}{\partial n_ {4}}=1\times n_ {2}=4$
이 과정은 그래프 맨 아래에 도달할 때까지 계속되어 $\frac{\partial f}{\partial x}=24$, $\frac{\partial f}{\partial y}=10$을 얻었다.
정방향으로 한 번만 진행하고 출력마다 역방향으로 한 번씩 진행하면 모든 입력에 대한 모든 출력의 편미분을 계산할 수 있기 때문에 입력이 많고 출력이 적은 경우에 유용
신경망은 손실을 최소화하기 때문에 출력(손실)이 하나라 그래프를 두 번만 진행하면 그레이디언트를 계산할 수 있다.
미분 가능한 지점에서만 편도함수를 계산한다면 완전히 미분되지 않는 함수에도 적용 가능

'인공지능 > 핸즈온 머신러닝' 카테고리의 다른 글

합성곱 신경망  (0) 2020.12.28
텐서플로 데이터 API  (0) 2020.12.19
텐서플로란  (0) 2020.12.08
심층 신경망 훈련  (0) 2020.11.26
인공 신경망이란  (0) 2020.11.14
Comments