이미지 출처: 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 만큼의 연산을 수행할 것이다.
세 번째 연산도 마찬가지로 진행된다. 커널이 데이터의 처음부터 끝까지 일부분 겹치면서 연산을 모두 마쳤으므로 컨볼루션 연산은 종료된다. 이 결과값들을 살펴보면 모두 o(?) = w1x(?) + w2x(?) + w3x(?) 의 꼴로 표현할 수 있는데, 이를 일반화시켜보면 다음과 같다.
역전파
하지만 위의 예시를 사용해 하나씩 계산해보면, 그 결과가 컨볼루션 연산 형태로
나오기 때문에 이해하거나 기억하기가 쉽다고 볼 수 있다. 다음 그림을 보자.
어떤 값 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의 편미분값도 구할 수 있다.
- 2차원 커널 가지고 놀기: Image kernels explained visually
- 스탠퍼드 cs231n 강의 노트: CNN의 구조 (한글 버전) (원어 버전)
- 스탠퍼드 cs231n 강의 영상: NN(역전파), CNN(컨볼루션)
2 댓글
그림으로 진짜 깔끔하게 잘 설명하셨네요. 잘 보고 갑니다
답글삭제감사합니다 :)
삭제