[그림 예제] 합성곱 신경망(CNN) 역전파까지 5분만에 이해하기

이미지 출처: http://deeplearning.stanford.edu/

일반적인 신경망에서는 입력 X와 가중치 행렬 W의 행렬곱 연산을 계산하고, 활성화함수를 통과시켜 다음 층으로 출력값을 넘겨준다. 즉 모든 x에 대해서 각각의 가중치 w가 대응되는 구조라고 볼 수 있다.

합성곱 신경망(Convolutional Neural Networks, CNN)에서는 커널(kernel)을 입력 X 상에서 이동하면서, 가중치 행렬인 커널을 여러 번 중복 사용하며 컨볼루션 연산을 진행한다. 위의 자료는 2차원 컨볼루션 연산을 보여주는데, 이 포스팅에서는 컨볼루션 연산부터 컨볼루션의 역전파까지 직관적으로 이해할 수 있도록 1차원 예시로 살펴보자.



우선 크기가 5인 1차원 입력에 크기가 3인 커널이 첫 번째 연산을 수행한다. x1이 w1과 곱해지고, x2가 w2와 곱해지며, x3가 w3와 곱해지고 이들의 합이 출력 o1을 결정한다. 입력의 (x1, x2, x3) 부분과 커널 전체인 (w1, w2, w3)가 요소별(element-wise) 곱을 수행하는 것이다.

커널이 한 칸씩 이동한다면 (즉 stride가 1이라면) 커널은 입력 크기에서 커널 크기를 빼고 1을 더한, 3 만큼의 연산을 수행할 것이다.


두 번째 연산은 커널이 한 칸 이동한 후에 (x2, x3, x4)와 진행된다. 두 번째 출력값인 o2는 w1x2 + w2x3 + w3x4가 된다. 
세 번째 연산도 마찬가지로 진행된다. 커널이 데이터의 처음부터 끝까지 일부분 겹치면서 연산을 모두 마쳤으므로 컨볼루션 연산은 종료된다. 이 결과값들을 살펴보면 모두 o(?) = w1x(?) + w2x(?) + w3x(?) 의 꼴로 표현할 수 있는데, 이를 일반화시켜보면 다음과 같다.


역전파

컨볼루션 연산의 역전파(backpropagation)에 대해서 알아보자. 가중치 행렬인 커널이 여러 번 사용되었기 때문에 손실(loss)에 대한 편미분을 계산하기가 까다롭게 보일 수도 있다.

하지만 위의 예시를 사용해 하나씩 계산해보면, 그 결과가 컨볼루션 연산 형태로 나오기 때문에 이해하거나 기억하기가 쉽다고 볼 수 있다. 다음 그림을 보자.
 

여러 층의 신경망 속에서, 컨볼루션 층에 전체 손실에 대한 편미분값들인 (델타1, 델타2, 델타3)이 역전파되었다고 하자. 우선 커널의 첫 번째 원소인 w1에 대한 편미분값을 구해볼 수 있을 것이다.



어떤 값 A에 대한 w1의 편미분값은, w1이 일정량 변할 때 그 값 A 얼마나 변할지에 대한 지표라고 볼 수 있다. 예를 들어 o1 = w1x1 + w2x2 + w3x3 라는 값에 대해 w1의 변화가 끼치는 영향은, 식 안에서 오직 w1x1라는 부분만 해당되며, 그 값은 x1이 된다. 다시 말해, w1이 '1' 만큼 변한다면, o1는 'x1'만큼 변한다는 뜻이다.

(델타1, 델타2, 델타3)을 곱해서 전체 손실에 대한 w1의 편미분을 구하려면, 우선 그 사이에 있는 (o1, o2, o3)에 대한 w1의 편미분을 구해야한다. 위와 같이 하나씩 구하고 나면, 체인룰(chain rule)을 적용되기 때문에 그냥 곱해주고 더해주면 다음과 같이 원하는 값을 구할 수 있다.


전체 손실에 대한 w1의 편미분값을 구할 수 있었다. 동일한 방법으로 전체 손실에 대한 w2의 편미분값도 구할 수 있다.


위의 두 식 모두 델타1x(?) + 델타2x(?) + 델타3x(?) 형태로 표현되며, 이를 일반화하면 다음과 같은 식이 나온다. 앞서 본 컨볼루션 연산의 결과와 같은 형태를 갖는다는 것을 알 수 있다.



더 깊게 알고 싶다면 다음 링크를 참고하면 좋을 것이다.

댓글 쓰기

0 댓글