home search
Math
Machine Learning
Mathematics for Machine Learning 5.6장: 벡터 연산 - 오차역전파와 자동 미분
2023. 01. 27

이 내용은 책 Mathematics for machine learning(Marc Peter Deisenroth et al.)을 기반으로 하고 있습니다.

5.6: Backpropagation and Automatic Differentiation

5.5장은 공식 몇 가지의 나열이기 때문에 포스팅은 생략하겠습니다.

머신러닝에선 경사하강법(gradient descent)를 실시해 좋은 모델 파라미터를 찾고자 한다. 이때 모델 파라미터에 대해 목적함수의 그래디언트를 계산한다.

하지만 아무리 chain rule이 편리하고 좋아도, 목적함수의 그래디언트를 직접적으로(수식으로) 계산해서 사용하기엔 비효율적이다. 식 자체가 매우 길 뿐더러 모델이 커질수록 더 복잡해지기 때문이다.

그래서 실제로 심층 신경망 모델을 학습시킬 때는 오차역전파(backpropagation) 알고리즘을 사용해 모델의 파라미터에 대한 오차 함수(error func.)의 그래디언트를 계산한다. 학습 시 앞단에서 뒷단으로 계산해나가는 forward와는 반대 방향으로, 즉 최종단에서 나온 에러를 앞단으로 거꾸로(‘back’) 보내준다(‘propagation’) 하여 오차역전파이다.

5.6.1. 심층신경망의 그래디언트

최종 결과물(e.g. 특정 클래스 라벨 등)인 함숫값 $\boldsymbol{y}$는 결국 여러 레벨의 함수의 합성 형태이다. 신경망의 관점에서 보자면 각 함수는 각자의 파라미터를 가진 레이어이고, 함성함수는 레이어를 쌓아 만들었단 뜻이다.

\[\begin{aligned} \boldsymbol{y} &= (f_K \circ f_{K-1} \circ \cdots \circ f_{1})(\boldsymbol{x}) = f_{K}(f_{K-1}(\cdots(f_{1}(\boldsymbol{x}))\cdots)) \\ f_i &= \sigma_i(\boldsymbol{A}_{i-1} f_{i-1} + b_{i-1}) \ (i = 1, \cdots, K) \end{aligned}\]

image

그럼 이제 모델을 훈련시키기 위해선 파라미터 $\boldsymbol{A}_j$와 $\boldsymbol{b}_j$ ($j = 1, \cdots, K-1$) 에 대한 손실 함수 L의 그래디언트를 구해야 한다.

손실함수를 정답과 예측값 사이의 오차의 제곱이라 하면

\[\begin{aligned} L(\boldsymbol{\theta}) = \lVert \boldsymbol{y} - \boldsymbol{f}_K (\boldsymbol{\theta, x}) \rVert ^2 \\ (\boldsymbol{\theta} = {\boldsymbol{A_0, b_0, \cdots, A_{K-1}, b_{K-1}}}) \end{aligned}\]

위 식을 최소로 하는 값을 찾고자 한다.

아래 그림은 L의 그래디언트를 계산하기 위해 backward pass를 하고 있는 모습을 나타내고 있다.

image

위 과정을 진행하기 위해, 각 레이어 $j = 1, \cdots, K-1$ 의 파라미터 $\boldsymbol{\theta}_j = { \boldsymbol{A_j, b_j} }$ 에 대한 L의 편미분을 chain rule을 통해 구해보자.

\[\cfrac{\partial L}{\partial \boldsymbol{\theta}_i} = \cfrac{\partial L}{\partial \boldsymbol{f}_K} \cfrac{\partial \boldsymbol{f}_{K}}{\partial \boldsymbol{f}_{K-1}} \cdots \cfrac{\partial \boldsymbol{f}_{i+2}}{\partial \boldsymbol{f}_{i+1}} \cfrac{\partial \boldsymbol{f}_{i+1}}{\partial \boldsymbol{f}_{i}}\]

위 식을 보면, 우변의 맨 첫 항은 맨 마지막 레이어에서의 손실함수의 편미분, 맨 마지막 항은 해당 레이어의 파라미터에 대한 이전 레이어의 편미분이다. 그리고 그 사이의 항들은 이전 레이어에 대한 그 다음 레이어의 편미분이다.

위 식과 아래 그림을 엮어 잘 살펴보면, 해당 레이어에서 계산할 값은 우변 맨 마지막 두 항의 chain rule 뿐이란 것을 알 수 있다. 이미

\[\cfrac{\partial L}{\partial \boldsymbol{f}_{K}} \cfrac{\partial \boldsymbol{f}_{K}}{\partial \boldsymbol{f}_{K-1}} \cdots \cfrac{\partial \boldsymbol{f}_{i+2}}{\partial \boldsymbol{f}_{i+1}}\]

까지는 이전 레이어에서 $\cfrac{\partial L}{\partial \boldsymbol{\theta}_{i+1}}$을 구할 때 계산된 내용이다.

image

5.6.2. 자동 미분(Automatic Differentiation)

자동 미분(Automatic Differentiation, AD)은 컴퓨터 프로그램에서 함수의 미분을 평가하는 일련의 기법들이다. 앞장에서 본 오차역전파가 자동 미분의 일종이다.

컴퓨터 프로그램이 기본 연산(e.g. 덧셈, 뺄셈, 곱셈, 나눗셈 등)과 기본 함수(e.g. exp, log, sin, cos 등)의 연속으로 계산을 수행함을 이용한다. 이런 연산에 연쇄법칙(chain rule)을 반복적으로 적용함으로써, 임의의 순서의 미분을 정확하고 자동적으로 계산할 수 있다.

자동미분은 Symbolic differentiation, Numerical differentiation과는 다르다. Symbolic differentiation은 수학적 표현(식)을 컴퓨터 프로그램으로 변환하기 매우 어려우며, 비효율적 코드가 만들어질 수도 있다. Numerical differentiation은 반올림 오차를 야기할 수 있다. 두 미분법은 고차 미분에서 에러와 복잡도가 증가할 수 있고, 다수의 입력에 대한 편미분(그래디언트 기반 최적화에 필요함)을 계산하기엔 느리다.

image

입력 $x$ 과 출력 $y$ , 그리고 그 사이의 중간 변수들 $a, b$ 의 데이터 흐름 $x \rightarrow a \rightarrow b \rightarrow y$ 가 있다고 해보자. 연쇄법칙을 이용해 $dy/dx$를 구하면

\[\cfrac{\mathrm{d} y}{\mathrm{d} x} = \cfrac{\mathrm{d} y}{\mathrm{d} b} \cfrac{\mathrm{d} b}{\mathrm{d} a} \cfrac{\mathrm{d} a}{\mathrm{d} x}\]

이다. 위 식을 아래와 같이 두 경우로 묶어볼 수 있다.

\[\begin{align} \cfrac{\mathrm{d} y}{\mathrm{d} x} = \left( \cfrac{\mathrm{d} y}{\mathrm{d} b} \cfrac{\mathrm{d} b}{\mathrm{d} a} \right) \cfrac{\mathrm{d} a}{\mathrm{d} x} \\ \cfrac{\mathrm{d} y}{\mathrm{d} x} = \cfrac{\mathrm{d} y}{\mathrm{d} b} \left( \cfrac{\mathrm{d} b}{\mathrm{d} a} \cfrac{\mathrm{d} a}{\mathrm{d} x}\right) \end{align}\]

식 (1)과 같이 그래디언트의 흐름이 데이터 흐름의 왼쪽에서 오른쪽으로 향하는, 즉 순방향을 자동 미분에서 forward mode라고 한다. 식 (2)는 반대로 reverse mode이다. Reverse mode는 이전 장에서 본 오차역전파에 해당한다. 신경망에선 입력 데이터의 차원(dimensionality)가 출력(label)의 차원보다 훨씬 크기 때문에, reverse mode의 연산이 forward 보다 가볍다.


Reference

Wikipedia, “Automatic differentiation

arrow_upward arrow_downward
loading