합성곱 신경망(CNN)은 Convolution Neural Networks의 줄임말로, 인간의 시신경을 모방하여 만든 딥러닝 구조 중 하나이다. 이미지 처리에 탁월하며, ANN, DNN과 다르게 이미지의 공간적인 정보를 유지한다.
먼저 다음과 같은 3x3의 이미지가 있다고 하자.
우리가 일반적인 ANN, DNN 딥러닝 모델로 해당 이미지를 분석한다고 하면 Flatten 층을 거쳐 다음과 같이 1차원의 데이터로 평탄화가 될 것이다. 이 데이터에 각 가중치를 곱하여 은닉층으로 결과값이 전달되고, 최종적으로 출력층에서 Classfiy를 할 것이다. 하지만 이미지 특성상 각 픽셀간의 밀접한 상관관계가 있을텐데, 해당 알고리즘은 이러한 공간적인 구조를 무시한 채 분석을 한다는 것을 알 수 있다. 이러한 점을 방지하고자, 이미지 특성 상 공간적인 특성을 유지하고자 나온 딥러닝 모델이 Convolution Layer이다.
원래 밀집층의 뉴런은 다음과 같이 모든 뉴런에 가중치를 곱한 후 절편을 더한 하나의 출력값이다. 즉 뉴런의 개수와 출력값의 개수가 동일하다.
하지만 합성곱에서는 다음과 같이 가중치 w1~w3과 처음 특성 3개를 곱한 후 절편을 더하여 한 개의 출력을 만든다. 그 다음은 이 전과 똑같은 가중치 w1~w3와 2~4번째 특성을 곱한 후 절편을 더하여 또다른 한 개의 출력을 만든다. 여기에서 중요한 것은 첫 번째 합성곱에서 사용된 가중치 w1~w3을 두 번째 합성곱의 계산에서도 사용했다는 것이다. 이렇게 한 칸씩 아래로 이동하면서 출력을 만들며, 이 과정을 끝까지 한다면 다음과 같이 된다.
물론 가중치의 개수는 w1~w3처럼 3개를 선택해도 되고, 더욱 많은 가중치를 선택해도 된다. 즉 하이퍼파라미터이다. 이를 합성곱 신경망에서는 뉴런이라고도 부르지만, 보통 filter 혹은 kernel이라고 부른다.
4x4의 입력이 있다하자. 커널의 크기를 2x2으로 지정한다 하면 다음과 같을 것이다.
입력이 2차원이라면 커널도 반드시 2차원이여야 한다. 처음은 입력값의 첫 부분에 해당 필터를 씌운다.
후에는 sliding을 하여 다음과 같은 입력값의 부분에 kernel을 계산할 것이다.
이 과정을 반복해가면 다음과 같은 출력값이 만들어질 것이다.
밀집층에서 여러 개의 뉴런을 사용하듯이, 합성곱 층에서도 다음과 같이 여러 개의 kernel을 사용할 수 있다. (4, 4)의 입력값에 (3, 3)의 커널을 사용한다면 (2, 2)의 feature map이 나온다. 이것이 3개로 겹치며 최종적으로 (2, 2, 3) 크기의 feature map이 된다.
입력값에 kernel을 씌운 후 나오는 결과를 feature map(특성 맵)이라고 부른다. 이 과정을 인공 신경망의 구조로 나타내면 다음과 같다,
(4, 4) 크기의 입력에 (3, 3) 크기의 커널을 적용하면 (2, 2) 크기의 피처맵이 만들어졌다. 하지만 만약 커널의 크기는 그대로 (3, 3)이지만, 출력의 크기. 즉 피처맵의 크기가 입력과 동일하게 (4, 4)로 만들려면 어떻게 해야 할까?
입력값과 동일한 크기의 출력을 만들고 싶다면 마치 더 큰 입력에 합성곱하는 척을 해야한다. 예를 들어 실제 입력 크기는 (4, 4)이지만, (6, 6)처럼 다룬다고 가정해보자. 다음과 같이 (6, 6) 크기의 입력에 (3, 3) 크기의 커널로 합성곱을 하였을 때 출력의 크기는 어떻게 될까??
실제 (4, 4) 크기의 입력값 주위에 0을 채워넣은 후, (6, 6) 크기로 만든 후 진행해보자.
다음과 같이 16번의 연산을 통하여 (4, 4) 크기의 feature map을 만들 수 있다.
이렇게 입력 주위를 가상의 원소로 채우는 것을 Padding이라고 한다. 실제 입력값이 아니기 때문에 패딩은 0으로 채운다. 그러면 (4, 4) 크기의 입력값은 위와 같이 (6, 6) 크기의 입력값으로 된다.
패딩의 역할은 순전히 커널이 씌워지는 횟수를 늘려주는 것밖에는 없다. 그렇기 때문에 계산에도 영향을 미치지 않는다
이렇게 입력과 피처맵의 크기를 동일하게 만들기 위해 주위를 0으로 패딩하는 것을 same padding이라고 한다. 일반적으로 합성곱 신경망에서는 새임 패딩이 가장 많이 사용된다.
이러한 패딩 없이 순수한 입력에서 피처맵을 만드는 경우를 Valid Padding이라 한다.
만약 (4, 4) 크기의 입력에서 패딩 없이 합성곱을 한다면 다음과 같은 4번의 계산이 이루어진다.
왼쪽 위 모서리의 3을 포함한 양 끝 네 모서리는 커널이 단 한 번밖에 계산이 되지 않는다.하지만 가운데에 있는 4, 8, 5, 1은 4번의 계산에 포함된다. 즉 이미지 계산에 불균형이 이루어질 수 있다. 패딩을 진행하면 이러한 불균형을 감소할 수 있다.스트라이드는 kernel의 이동 크기를 의미한다. 즉 현재까지 진행한 스트라이드의 크기는 1이였다. 스트라이드의 크기가 2인 경우는 다음과 같다.
대부분 스트라이드는 1로 설정하여, strides 매개변수는 잘 사용하지 않는다.
풀링(Pooling)은 합성곱 층에서 만든 피처맵의 크기를 줄이는 역할이다. 하지만 피처맵의 개수는 줄이지 않는다. 예를 들어, (2, 2, 3)의 피처맵이 있다. 여기에 (2, 2) 크기로 풀링을 적용하면 (1, 1, 3)이 된다.
커널을 찍은 영역에서 가장 큰 값을 고르거나, 평균값을 계산한다. 이를 각각 최대 풀링과 평균 풀링이라 한다.
다음은 (4, 4) 크기의 피처맵에 (2, 2) 최대 풀링을 적용한 것이다.
최대 풀링은 가장 큰 값을 고르기 때문에 첫 번째 (2, 2) 영역에서 9를 고르고, 그 다음은 7, 8, 6을 고른 후 (2, 2)의 출력을 만든다. 피처맵이 여러 개라면 동일한 작업을 반복한다.
풀링에서는 영역을 겹치지 않고 이동을 한다. 풀링 크기가 (2, 2)라면 스트라이드가 2인 셈이다. 풀링의 크기는 보통 정방형의 크기로 설정한다.
위와 같이 (4, 4)의 입력, (3, 3)의 커널이 있다.
Same Padding이므로, 입력의 크기를 (6, 6)으로 늘려준다.
커널의 개수는 3개이므로, 각 커널을 계산한 (4, 4, 3)의 피처맵을 생성한다.
밀집층과 마찬가지로 합성곱 층에서도 활성화 함수를 적용한다. 합성곱 층은 보통 렐루 함수를 많이 사용한다.
(2, 2)의 최대 풀링을 진행한다. 풀링을 진행하면서 특성의 가로, 세로의 크기를 줄인다. 특성의 개수는 건들지 않는다. 즉 (4, 4, 3)의 피처맵에 (2, 2)의 최대 풀링을 진행하면 (2, 2, 3)의 피처맵이 생성된다.
(2, 2, 3)의 피처맵을 Flatting하면 12개의 특성을 가진 1차원 배열으로 된다. 이것이 출력층의 입력이 된다.