개요

Convolution layer은 이미지의 공간적인 구조를 계산하고 싶은 것이다. 이미지의 feature들은 자유변형에 따라서 위치가 크게 변화하지만 서로 상대적인 값은 크게 변화하지 않는 특징이 있다. 따라서 이러한 구조에 대한 정보를 보존하기 위해서 filter와의 convolution연산을 통해서 이미지를 계산하게 된다. 이를 Convoluton layer이라고 한다. 필터는 항상 이미지의 채널과 매칭되어야 한다. 예를 들어서 32 * 32 * 3의 이미지는 3채널 이미지이다. 이때 필터의 가로 세로 크기는 마음대로 할 수 있지만, channel의 개수는 항상 일치시켜야 한다. 위의 경우에서는 m * n * 3의 필터가 필요할 것이다. 여기서 이 채널을 포함한 이 3차원 행렬을 텐서라고 한다. (실제로, 행렬은 2차원 텐서이다.)

Convolution layer.png

주요 용어

Convolution

합성곱 연산은 두 함수 f, g 가운데 하나의 함수를 반전(reverse), 전이(shift)시킨 다음, 다른 하나의 함수와 곱한 결과를 적분하는 것을 의미한다. 다시 말해서 이미지를 겹쳐서 곱한다음 하나의 값으로 합치는 (적분하는)것을 말한다. 컨볼루션레이어의 핵심이자, 이를 통해서 모든 Feature들이 계산되게 된다. 예를 들어서 32 * 32 * 3 과 5 * 5의 필터의 합성곱은 28 * 28 * 1의 activation map을 만들어 낼 것이다. (3 차원 공간에서 필터를 슬라이딩 하면서 곱하여 1차원의 텐서를 만들었다!). 만약 필터가 여러개라면? N개의 필터와의 합성곱은 N개의 채널을 만들어 낼 것이다.

Channel

이미지의 필셀 하나하나는 실수이다. 컬러 사진은 3개의 채널을 합성하여 하나의 이밎를 만들고, 1차원의 흑백 사진은 단순이 명암만 표현할 것이다.

Filter / Kernel

필터는 이미지의 특징을 찾아내긴 위한 파라미터의 집합을 말한다. 전통적인 DNN에서 weight이라고 불리는 것들의 CNN버전이다. 또한 Filter과 kernel의 같은 의미이다. CNN에서 학습의 대상이 되기도 하는 것이며, 필터는 지정된 간격으로 (stride)로 이미지를 순회하며 다음 레이어의 값을 만들어 낸다. 필터의 크기가 F이면 F * F * D의 weights가 하나의 필터당 만들어 지게 된다. 만약 K개의 필터가 존재하면 F * F * D * K개의 weights와 K개의 bias를 가지게 된다. 메모리의 관점에서 이정도의 weights는 충분히 저장할 수 있다. 그러나 만약 이러한 처리를 순차적으로하게 한다면 7개의 중첩된 loop이 필요하다. 즉, 전통적인 순차적인 관점의 프로그램에서는 Convolution layer의 학습이 매우 더디다는 문제가 있다. 이러한 문제를 해결하기 위해서 등장한 방식이 바로 GPUTPU같은 행렬 처리에 특화된 병렬처리기이다.

Stride

필터가 이미지를 계산하는 간격을 말한다. 만약 순회 간격이 1이면 한칸씩 옆으로 이동하며 이미지의 CNN을 계산할 것이고, 2이면 2칸씩 멀어지며 CNN의 계산 결과 값을 도출해 낼 것이다. 입력 데이터가 여러 채널을 갖을 경우 필터는 각 채널을 순회하며 합성곱을 계산한 후, 채널별 피처 맵을 만든다. 그리고 각 채널의 피처 맵을 합산하여 최종 피처맵으로 반환한다. stride를 고려한 최종 결과물의 크기는 (N-F)/stride + 1이 된다.

Padding

Filter와 stride떄문에 feature map의 크기가 입력 데이터보다 작아지는데, 이를 방지하기 위해서 입력 데이터의 가장자리에 지정된 크기 만큼 특정 값으로 채워넣는 것을 말한다. 보통 패딩값으로는 0을 채워 넣는다. 만약 이러한 방식으로 패딩을 제거하면, 2n + 1크기의 필터라면 2n만큼의 spatial dimension이 줄어들게 된다. (최종 결과물의 이미지의 크기가 2n만큼 가로 세로 둘다 줄어들게 된다.)패딩을 적용시키지 않는 것을 VALID라고 Tensorflow에서 해석한다. 또한 Tensorflow에서 0으로 패딩을 채워 넣는 것을 SAME이라고 한다. SAME에서는 2n + 1의 필터에. n만큼의 zero-padding을 함으로써, output크기를 유지시킨다. stride 필터 그리고 패딩을 고려한 최종 크기는 다음과 같이 된다.

(N - F + 2P)/S + 1.

Feature Map / Activation Map

CNN을 통과한 그 값 자체를 말한다. 둘다 같은 대상을 지칭하며, 이미지에 CNN을 적용한 다음 결과를 말한다. CNN은 Input layer에 convolution처리를 하여서 1 feature map -> conv -> 2 feature map... 이런식으로 결과를 만들어 낸다.

Pooling Layer

풀링 레이어는 출력 데이터를 입력으로 받아서 정해진 처리를 하는 레이어를 말한다. 학습의 대상이 되지 않으며, 특정한 범위에서 최대값을 추출해 내거나 최소값을 도출해 낸다. Pooling layer는 출력 결과를 보다 작게 만들음으로써, 훨씬 처리하기 쉽게 만든다. 또한 중복되는 feature들을 제거함으로써 overfitting을 예방한다. 그리고 각각의 activation map이 독립적으로 처리되도록 한다. 또한 feature map에서 특별한 feature들을 추출하는데에도 사용할 수 있다. Pooling layer는 쉽게 말하면 Sampling layer이라고 할 수도 있다. Padding layer도 padding을 가질 수 있다. 그러나 의미는 약간 다른데, SAME은 input과 output의 크기가 stride가 1일때 같다는 것을 말하고, VALID는 padding이 없음을 의미한다.

  1. Max Pooling: 2 * 2 필터와 stride 2를 이용하여 각각의 weight중 가장 큰 값을 가져간다. (꼭 2 * 2일 필요는 없다. 한 예시로 든 것 뿐이다.)
  2. Avg Poolin: 2 * 2 필터와 stride 2를 이용하여 각각의 weight의 평균을 가져간다. (꼭 2 * 2일 필요는 없다. 한 예시로 든 것 뿐이다.)
  3. Min Pooling: 2 * 2 필터와 stride 2를 이용하여 각각의 weight중 가장 작은 값을 가져간다. (꼭 2 * 2일 필요는 없다. 한 예시로 든 것 뿐이다.)