이 시리즈는 R로 딥러닝을 구현하고 설명하는 것에 목표를 둔 글입니다. 신경망 학습과정 챕터에 이어서 5번째 순서입니다. 이전 글과 내용이 이어집니다. 이전 글들은 이곳에서 찾아 보실 수 있습니다.

#소개

앞선 글에서는 손실 함수의 기울기를 계산해 각 가중치와 편향에 대해 수치미분으로 그 값을 갱신하였습니다. 그러나 이 방식은 작동시간이 너무 길다는 단점이 있습니다. 이번 글에서는 학습 시간을 대폭으로 감소시킬 수 있는 오차역전파법(backward propagation of errors)을 소개할 것입니다. 오차역전파법은 줄여서 역전파라고 부릅니다. 오차역전파법은 가중치와 편향의 기울기를 수치미분이 아닌 다른 방식으로 더 효율적으로 계산하여 학습 시간을 줄입니다. 이제 그 방식을 알아봅시다.

용어 소개

계산그래프: 계산 과정을 그래프로 표시한 것입니다. 계산을 노드와 에지를 사용한 그래프 형태로 표시합니다.

어파인(Affine) 변환: 신경망 순전파 모델에서 계산하는 행렬의 곱 방식을 기하학에서 사용하는 용어입니다.

전치행렬: 전치행렬은 행렬의 행과 열을 서로 바꾼 행렬을 의미합니다. 예를 들면 2행 1열의 전치행렬은 1행 2열의 행렬이 되고 2행 1열의 원소가 1행 2열의 원소로 바뀌게 됩니다.

$$ \overrightarrow{a}= \begin{bmatrix} X Y \end{bmatrix} $$

$$ \overrightarrow{a}^T= \begin{bmatrix} X&Y \end{bmatrix} $$

계산그래프와 연쇄 법칙

역전파에 대해 알아나가기 위한 방법으로는 계산그래프를 통한 방식과 수식을 통한 방식이 있습니다. 수식을 통한 방식으로 이해하는 것도 좋은 방식이지만, 수학을 배우는 것이 아니며, 수식을 통한다면 너무 많은 수식에 당황하게 될 것입니다. 따라서 계산그래프 방식으로 역전파법에 대해 알아 봅시다.

그렇다면 계산그래프가 무엇인지 알아보겠습니다. 간단한 수학 문제를 예로 들어보겠습니다. 슈퍼에서 1개에 100원인 사과 2개를 살 때 총 지불 금액은 얼마일까요? 단 최종 지불 금액에 소비세 10%가 붙습니다. 이 문제를 계산그래프를 통해 어떻게 풀 수 있을까요? 아래의 그림과 같은 그래프 계산을 통해 가능합니다.

계산그래프 그림 5-2

계산그래프의 계산 진행 방식은 순전파(왼쪽에서 오른쪽으로) 방식으로 진행됩니다. 이렇게 계산을 했을 때 수식으로 접근하는 것에 비해 어떤 장점이 있을까요? 계산그래프 방식으로 계산을 진행하는 가장 큰 이유는 미분을 아주 효율적으로 계산할 수 있다는 장점과 중간 계산 결과를 저장할 수 있다는 점입니다. 계산그래프에서 미분을 효과적으로 계산하는 것은 역전파(오른쪽에서 왼쪽으로) 방식으로 계산을 진행하게 될 때 나타납니다.

역전파로 방식이 미분을 어떻게 효율적으로 계산하는지를 예를 들어 보면 다음과 같습니다. 먼저 사과가격이 오를 때 지불 금액의 오르는 값을 알고 싶다고 해봅시다. 이 문제의 해답을 수학적으로 보면 미분이 됩니다. 즉 사과가격의 변동에 따른 지불 금액의 변화는 사과 가격에 대한 지불 금액의 미분으로 나타낼 수 있습니다.

미분이라해서 겁먹을 필요는 전혀 없습니다. 수식을 통해 계산을 할 필요도 없습니다. 다음 그림과 같이 미분을 진행할 수 있기 때문입니다.

역전파 계산그래프

먼저 1값은 변화량이 있음을 의미하는 값입니다. 1이 주어지고 나서 나오는 1.1 값은 최종가격 220원을 도출할 때 사용한 $ 2001.1 $의 값 중 1.1을 곱해서 도출된 값입니다. 왜 1.1을 곱하는지는 다음 글에서 찾아 보실 수 있습니다. 2.2 값 역시 $ 1002 $ 값 중 1.1에 2를 곱해서 나온 값입니다.

계산그래프의 방식으로 수학 공식으로는 어려운 미분을 1 -> 1.1 -> 2.2와 같이 값의 전달로 쉽게 구할 수 있는 것이 계산그래프의 가장 큰 장점입니다. 다음으로는 계산그래프가 미분을 쉽게할 수 있는 원리인 연쇄법칙에 대해 알아봅시다.

연쇄법칙

연쇄법칙이란 합성함수의 미분에 대한 성질로 합성함수의 미분 값은 합성함수를 구성하는 개별 함수들의 곱으로 나타낼 수 있는 것이 그 정의 입니다. 그러나 이러면 어려우니 쉽게 말해 하나의 것을 그것의 구성요소들의 곱으로 나타낼 수 있다는 것만 알아두고 다음의 예를 통해 연쇄법칙에 대해 자세히 알아봅시다.

$ z = t^2, t = x+y $

일 때 x에 대한 z의 미분 값은 다음과 같이 정의할 수 있습니다.

$$ dz/dx = dz/dt*dt/dx $$

위 수식에서 x에 대한 z의 미분 값은 부분적인 미분 값들의 곱으로 정의되었습니다. t에 대한 z의 미분과 x에 대한 t의 미분 두 개별 미분 값들을 살펴보면 dt가 서로 나누어져 본래의 미분 값과 동일한 수식임을 알수 있습니다. 이 과정처럼 하나의 미분 값을 여러개의 개별 미분 값의 곱으로 만드는 것을 연쇄법칙이라 합니다. 아래의 그림은 위 예제를 연쇄법칙을 사용하여 미분한 것입니다.

그림5-8