Books/밑바닥부터 시작하는 딥러닝1

[Books] 오차역전파란? Backpropagation

언킴 2022. 3. 7. 17:31
반응형

오차 역전파는 딥러닝의 기초라고 할 수 있다. 이전까지 우리는 수치 미분을 통해 기울기를 구해 학습했지만, 이 방법은 매우 시간이 오래 걸린다. 그렇기에 딥러닝에서는 가중치의 기울기를 효율적으로 계산하는 오차역전파법(backpropagation)을 사용한다. 

 

위와 같이 왼쪽에서 오른쪽으로 노드$^{\mathsf{node}}$에서 엣지$^{\mathsf{edge}}$를 거쳐 계산이 되는 방식을 순전파(forward propagaction)이라고 한다. 그 반대로 진행하는 것을 우리는 역전파라고 부른다. 역전파는 순전파와 달리 굵은 선을 표시하며 이 전파는 '국소적 미분'을 전달하고 아래의 수치는 미분 값을 의미한다. 

여기서 '국소적 미분'을 전달하는 원리는 연쇄법칙(chain rule)에 따라 전달하게 된다. 연쇄법칙은 여러 함수로 구성된 함수를 의미한다. 합성 함수의 미분에 대한 성질을 의미하고, 합성 함수의 미분은 합성 함수를 구성하는 각 함수의 미분의 곱으로 나타낼 수 있다. 연쇄법칙의 수식은 다음과 같다. 

 

\[ \frac{\partial z}{\partial x} = \frac{\partial z}{\partial t} \frac{\partial t }{\partial x} \]

 

연쇄법칙을 이용해 아래 수식의 미분을 계산해보자. 

 

$ z = t^2 $

 

$ t = x + y $

 

\[ \frac{\partial z }{\partial x} = \frac{\partial z}{\partial t} \frac{\partial t }{\partial x} \]

 

\[ \frac{\partial z}{\partial t} = 2t \]

 

\[ \frac{\partial t }{\partial x} = 1 \]

 

\[ \frac{\partial z}{\partial x} = \frac{\partial z}{\partial t} \frac{\partial t}{\partial x} = 2t \cdot 1 = 2(x+y) \]

 

 

 

 

덧셈 노드의 역전파

역전파를 전달하는 방법은 덧셈 혹은 곱셈 등 여러가지가 존재하는데, 여기서는 덧셈 노드와 곱셈 노드에 대해서 다루었다. 일단 먼저 덧셈 노드의 역전파에 대해서 알아보자. 식 $z = x + y$가 있다고 하자. 그렇다면 $z$의 해석적 미분은 다음과 같다. 

 

\[ \frac{\partial z}{\partial x} = 1 \]

 

\[ \frac{\partial z}{ \partial y} = 1 \]

 

그렇다면 역전파의 경우 1만 곱해서 전달하기 때문에 값 자체의 차이가 없을 것이다. 덧셈 노드의 역전파는 입력 신호를 다음 노드로 출력할 뿐 다음 노드에 그 값을 그대로 전달한다. 

 

곱셈 노드의 역전파

곱셈 노드의 역전파를 알아보기 위해서 $z = xy$과 같은 식이 있다고 가정하자. 이 식의 해석적 미분은 다음과 같다. 

 

\[ \frac{\partial z}{\partial x} = y \]

 

\[ \frac{\partial z}{\partial y} = x \]

 

곱셈 노드의 역전파는 서로 변수를 바꾼 값을 곱해서 보내준다. 덧셈 노드의 역전파와 곱셈 노드의 역전파는 다음과 같은 예시로 쉽게 이해할 수 있다. 

곱셈노드로 된 부분은 역전파를 보낼때 100 * 1.1 과 2 * 1.1 처럼 서로 값을 바꾸어서 역전파로 보내주게 된다. 

 

이 내용에 대한 덧셈 노드, 곱셉 노드 코드는 여기를 참고하면 된다. 

 

활성화 함수 역전파

이 챕터에서는 ReLU와 Sigmoid 계층을 구현할 것이다. 

 

ReLU

활성화 함수로 사용되는 ReLU의 수식은 다음과 같다. 

 

\[ y  = \begin{cases} x (x > 0) \\ \\ 0 (x \ge 0) \end{cases} \]

 

$x$에 대한 $y$의 미분은 다음과 같이 정의할 수 있다. 

 

\[ \frac{\partial y}{\partial x}  = \begin{cases} 1 (x > 0) \\ \\ 0 (x \ge 0) \end{cases} \]

 

 

코드는 여기를 참고하면 된다. 

 

 

Sigmoid

Sigmoid함수는 ReLU와는 달리 exp와 나눗셈이 존재한다. Sigmoid는 아래와 같은 순전파 형태를 지닌다. 

1 단계 

'/' 노드는 $y = \frac{1}{x}$을 미분한 것으로 해석할 수 있다. 

 

 

\[ \frac{\partial y}{\partial x} = -\frac{1}{x^2} \] 

\[ = -y^2 \]

 

이에 따르면 흘러온 전파에 $-y^2$을 곱해서 아래로 전달한다. 

 

2 단계

+ 노드는 위에서 설명했기에 넘어간다. 

 

3 단계

'exp'노드는 $y = exp(x)$ 연산을 수행하며, 지수함수의 경우 미분해도 그 값 그대로이기 때문에 다음과 같은 수식으로 표현할 수 있다. 

 

\[ \frac{\partial y}{\partial x} = \exp(x) \]

 

4 단계

$\times $ 노드 역시 설명했기에 넘어간다. 

 

총 4가지 단계를 거치면 다음과 같은 수식으로 계산 그래프를 그릴 수 있다.

 

 

 

마지막으로 출력된 $ \frac{\partial L}{\partial y} y^2 \exp(-x) $는 다음과 같이 정리해서 쓸 수 있다. [코드]

 

\[ \begin{equation} \label{eq1} \begin{split} \frac{\partial L }{\partial y} y^2 \exp(-x) & = \frac{\partial L }{\partial y} \frac{1}{(1 + \exp(-x))^2} \exp(-x) \\ & \\ & = \frac{\partial L}{\partial y} \frac{1}{1 + \exp(-x)} \frac{\exp(-x)}{1 + \exp(-x)} \\ & \\ & = \frac{\partial L}{\partial y} y(1-y) \end{split} \end{equation} \]

 

 

추가적인 내용은 여기를 참고하면 된다. 

 

연습코드