Search
Duplicate

Backpropagation (역전파)

각 변수들이 함수 f에 미치는 영향을 찾기 위하여 output에 대한 input의 gradient를 출력값으로부터 거꾸로 계산하는 rule이다. gradient를 얻기 위하여 Computational Graph 내부 모든 변수에 대해 chain rule을 재귀적으로 적용한다. input이 마지막 출력값에 영향을 끼치는 정도를 파악하는 데 쓰인다.

원리

Backpropagation는 computational graph에서 chain rule을 적용하며 진행한다. computational graph 왼쪽에서 오른쪽 노드로 진행되는 forward pass에서 각 노드가 local input을 받아들였을 때, 노드에 따른 output과 그 output에 대한 input의 local gradient를 계산하고 저장한다. 이렇게 저장한 것은 이후 backward pass에서 chain rule을 사용하여 upstream gradient와 저장한 값들을 곱해 각 노드의 input에 대한 gradient를 구하고 그것들을 연결된 이전 노드로 통과시키며 연산한다. 이때 전체 회로의 계산 과정을 모르더라도 완전히 독립적으로 값들을 계산할 수 있다. 이는 Neural Network에서 중요한 개념이며 계산하는 방식이 Computational하다.

관련 용어

Chain Rule

연쇄 법칙이라는 뜻으로 합성 함수를 미분할 때의 계산 공식이다.
fx=fq×qx\frac{\partial f}{\partial x}=\frac{\partial f}{\partial q}\times \frac{\partial q}{\partial x}

Gradient

gradient ∇f는 편미분 값들의 벡터이다. 기존의 수식을 통해 구할 수 있는 지역적인 gradient를 local gradient라고 하고, 뒤에서부터 앞으로 역순으로 넘어오는 gradient를 upstream gradient(global gradient)라고 한다.
f=[fx,fy]=[y,x] ∇f=[\frac{\partial f}{\partial x},\frac{\partial f}{\partial y}]=[y,x]
Gradient 계산 이유 파라미터를 업데이트하여 Neural Networks를 학습하기 위한 목적이다. Gradient는 학습한 Neural Networks를 시각화하는 데 쓰인다. 그러나 Support Vector Machine에서는 굳이 gradient를 업데이트할 필요가 없다. 커널을 이용하여 함수를 합성하는데 SVM은 딱 한 번 일어나기 때문이다.

예시

Basic Example

함수 f=(x+y)zf = (x+y)z 에 대해서 어떤 변수의 gradient를 찾고자 한다. 먼저 함수 f를 computational graph로 나타내고, input값인 x=-2, y=5, z=-4 인 경우 최종 노드를 통과하면 f=-12라는 결과를 얻는다. 편한 계산을 위해 x+yx+y 덧셈 노드를 qq라는 중간 변수로 지정하면, f=qzqz가 된다. q와 z에 대하여 f를 미분을 하면 gradient는 각각 zzqq가 된다.
forward pass를 통해 알 수 있듯이 q와 z에 대한 미분값을 정리하면 z=-4, q=x+y=3 이다.
x와 y에 대한 미분값은 Backpropagation을 통해 구한다. chain rule을 이용해 y에 대한 f의 미분은 q에 대한 f의 미분과 y에 대한 q의 미분의 곱으로 나타낼 수 있다. 이 값들을 계산한 것이 x와 y에 대한 미분값이고 각각 1*(-4) = -4, 1*(-4) = -4 가 된다.

Sigmoid Function (시그모이드 활성함수)

f(w,x)=11+e(w0x0+w1x1+w2)sigmoid function=σ(x)=11+exf(w,x) = \frac{1}{1+e^{-(w_0x_0 + w_1x_1 + w_2)}}\\sigmoid~function = \sigma(x) = \frac{1}{1+e^{-x}}
dσ(x)dx=ex(1+ex)2=(1+ex11+ex)(11+ex)=(1σ(x))σ(x)\hspace{0.3in} \frac{d\sigma(x)}{dx} = \frac{e^{-x}}{(1+e^{-x})^2} = \left( \frac{1 + e^{-x} - 1}{1 + e^{-x}} \right) \left( \frac{1}{1+e^{-x}} \right) = \left( 1 - \sigma(x) \right) \sigma(x)
일련의 computational graph를 하나의 big Node로 대체하여 계산할 수 있다. 위 이미지처럼 특정 연산을 sigmoid gate화하여 sigmoid function을 미분해도 같은 결과가 나온다.

Jacobian Matrix

Jacobian Matrix는 다변수 벡터 함수의 도함수 행렬로, 편미분할 변수가 많고 그 변수들로 이루어진 함수도 많을 때 주로 쓰인다.
fx\frac{\partial f}{\partial x}
벡터를 가질 때의 backpropagation은 Jacobian Matrix를 이용한다. 변수(숫자) backpropagation에서의 gradient의 역할을 Jacobian Matrix가 한다는 것을 제외하고는 모든 흐름이 일치한다.
4096 차원의 벡터에 요소별로(elementwise) 최대값(max)을 취하는 노드를 적용한다. 이때, Jacobian Matrix의 각 행은 입력에 대한 출력의 편미분이다. 대각 행렬이기 때문에 입력 각 요소 첫번째 차원은 오직 출력의 해당 요소에만 영향을 준다. 행렬의 사이즈는 4096*4096이다.

Patterns in Backward Flow

add gate → gradient distributor : local gradient의 값이 1이므로 이전의 gradient를 그대로 전파한다.
max gate → gradient router : 여러 변수 중 가장 큰 하나만 취하므로 통과한다.
multiplication gate → gradient switcher : 값에 따라 gradient의 scale을 조정한다.