1. 들어가며
지난 글에서는 Translation Invariant 네트워크를 만드는 과정을 살펴봤습니다. Fully Connected Network(FCN)로 강아지와 고양이 이미지를 구분하는 과정을 따라가 보았죠. 이 과정에서 FCN에서는 필연적으로 데이터의 위치 의존성을 가질 수밖에 없음을 알 수 있었습니다. 이를 해결하기 위해 다양한 방법을 살펴봤는데요. 대표적으로 Convolution과 Pooling 연산을 도입하였습니다. 이렇게 Convolution과 Pooling 연산을 조합하여 구성한 네트워크가 Convolutional Neural Network (CNN) 임을 살펴봤죠. 이번 글에서는 Convolutional Neural Network 의 주요 구성 연산인 Convolution과 Pooling에 대해 좀 더 자세히 살펴봅니다.
먼저 Convolution에 관하여 다음 순서로 살펴보겠습니다.
- 내적 연산을 사용한 필터와 이미지 유사도 측정 방법
- Stride와 Pooling의 개념과 의미
- 여러 개의 필터를 적용한 Convolution 연산 과정
다음으로 Pooling에 관하여 다음 순서로 살펴보겠습니다.
- Pooling 연산 방법
- Pooling 연산의 필요성
- Pooling 연산의 특성
이렇게 Convolution 연산을 거쳐 나온 결괏값을 Feature Map이라고 부릅니다. 마지막으로 Feature Map의 특성에 대해 살펴보겠습니다.
2. 공통 표현
본격적으로 시작하기에 앞서, 이번 글에서 공통적으로 사용할 표현을 정리하겠습니다.
첫 번째로, 모든 입력 또는 결과의 형태는 직사각형 또는 직육면체 형태로 표현했습니다.
(width, height) 형태의 2차원 정보는 직사각형으로 표현했습니다. (width, height, channel) 형태의 3차원 정보는 직육면체 형태로 표현했습니다.
두 번째로, 각 도형의 내부는 ‘값’으로 채워져 있다고 가정합니다. 예를 들어 RGB 채널 이미지는 픽셀값이 채워진 직육면체로 표현합니다.
세 번째로, 2차원 정보에서 width x height는 해상도(Resolution)이라고 표현합니다.
3. Convolution
이제 본격적으로 Convolutional Neural Network (CNN)에서의 Convolution 연산에 관해 살펴보겠습니다.
3-1. Convolution 연산 방법
Convolution 연산을 적용한 이유는 이미지에 해당 필터의 정보가 얼마나 포함되어 있는지를 측정하기 위함입니다. 따라서 Convolution 연산의 요구사항은 다음과 같습니다.
- 연산 결과가 이미지와 필터의 ‘유사한 정도’를 의미할 것.
- 결과 형태가 하나의 값으로 나올 것.
이러한 요구사항을 만족하는 연산 방법 중 하나는 벡터의 ‘내적’입니다. 이미지와 필터를 각각 벡터로 표현하여 내적 연산을 하면 다음과 같이 표현됩니다.
내적의 결과는 하나의 값 형태로 나오므로 두 번째 조건을 만족합니다. 또한 두 벡터의 크기가 동일하다면, 그 결괏값은 두 벡터의 방향이 비슷할수록 크게 나옵니다.
따라서 내적 결괏값의 크기는 이미지와 필터의 벡터 방향의 유사한 정도에 비례한다고 할 수 있습니다. 따라서 첫 번째 조건을 만족합니다. 그럼 이미지와 필터를 벡터로 생각하고 내적을 계산해 보겠습니다. 연산 과정은 다음과 같습니다.
먼저 이미지를 채널별로 한 장씩 분리해 줍니다. 예를 들어 RGB 이미지였다면 세장의 1 채널 (width, height) 이미지로 분리해 줍니다. 그리고 각각의 1 채널 이미지를 1열로 펼쳐줍니다. 그럼 위 그림의 오른쪽 검정~연회색 직사각형과 같이 나오게 됩니다. 이들은 1열로 펼쳐진 값들이므로 벡터처럼 연산할 수 있습니다. 이제 필터도 동일한 과정으로 한 줄씩 펼쳐서 각각의 펼쳐진 이미지와 짝지어 줍니다. 그리고 각각의 이미지와 필터를 내적 하여 값을 구합니다. 이렇게 구해진 값들을 모두 더해 최종 값으로 구합니다. 이렇게 이미지와 필터 간의 채널별 내적 연산 후 모두 더하는 방법을 Convolution 연산이라고 합니다.
이 과정에서 하나의 중요한 교훈을 얻을 수 있습니다. 바로 Convolution 연산을 위해서는 이미지와 필터의 채널 개수가 같아야 한다는 것입니다. 왜냐하면 내적 계산을 하기 위해서는 채널별로 1열로 펼친 뒤 줄 세워야 하죠. 이때 줄 세운 이미지와 필터의 개수가 같아야 하기 때문입니다.
3-2. 하나의 Convolution 필터와 연산하기
위에서는 필터와 동일한 Resolution 만큼의 일부 이미지에 대해 Convolution 연산이 적용되는 과정을 살펴봤습니다. 이제 이러한 연산을 한 장의 이미지 전체에 대해 적용하는 과정을 살펴보겠습니다. 먼저 이미지의 왼쪽 상단부터 Convolution 연산을 수행해 줍니다.
3-1에서 살펴본 바와 같이 이 연산의 결과는 하나의 ‘값’ 형태로 나오게 됩니다. 이제 이미지 전체에 Convolution 연산을 적용해 보겠습니다. 동일한 과정을 위, 아래, 좌, 우로 이동하며 적용해 줍니다. 이렇게 위, 아래, 좌, 우로 동일한 Convolution 필터를 이동해 가며 연산하는 방법을 ‘Sliding Window’ 방식이라고 합니다. Sliding Window 연산의 결과는 다음과 같이 2차원 형태의 값이 나오게 됩니다.
이렇게 나온 결과는 특징을 맵 형태로 추출했다는 의미로 Feature Map이라고 합니다. 이 Feature Map의 사이즈는 필터를 얼마나 멀리씩 건너뛰며 이동할지에 따라 달라질 겁니다. 이렇게 Sliding Window 방식에서 건너뛰는 정도를 ‘Stride’라고 합니다.
Stride가 클수록 Convolution 연산을 듬성듬성하게 되므로 결과 Feature Map의 사이즈는 작을 겁니다. 반대로 Stride가 작을수록 Convolution 연산을 빽빽하게 하게 되므로 결과 Feature Map의 사이즈가 커질 것입니다.
이때 결과 Feature Map 사이즈는 입력 이미지와 동일하게 유지될 수 있을까요? Stride를 가장 작은 1로 연산한다고 상상해 보죠. 아래 그림과 같이 Stride=1로 계산하더라도 Feature Map의 사이즈는 입력 이미지의 사이즈보다는 작아질 수밖에 없습니다.
그럼 Convolution 연산 후에도 결과 Feature Map이 입력 이미지의 사이즈를 유지할 수는 없을까요? Convolution 연산을 하기 전 입력 이미지 가장자리에 임의의 값 (보통은 0)을 채워 넣어 사이즈를 맞춰주면 됩니다. 이렇게 입력 이미지의 가장자리에 값을 채워주는 방법을 ‘Padding’이라고 합니다. 보통은 Convolution 연산 후의 결과 Feature Map 사이즈를 연산 전과 동일하게 유지하기 위한 목적으로 수행합니다.
3-3. 여러 Convolution 필터와 연산하기
Convolution 연산을 사용하는 이유는 입력 정보에 필터 정보가 얼마나 포함되어 있는지를 확인하기 위함이라고 했습니다. 따라서 최대한 다양한 필터를 적용해야 합니다.
쉬운 예시를 생각해 보죠.⃝ , △, X 모양의 필터를 하나의 이미지에 적용한다고 상상해 보겠습니다. 그 결과 ⃝, △, X 정보가 이미지에 얼마나 포함되어 있는지를 측정할 수 있습니다.
이제 3-2에서 살펴본 동일한 연산 방법을 다양한 필터에 대해 적용해 보겠습니다. 하나의 필터와 연산 결과로 하나의 Feature Map이 나왔죠. 따라서 적용하는 필터의 개수와 동일한 Feature Map들이 연산 결과로 나온다는 것을 알 수 있습니다. 이렇게 나온 Feature Map들을 모두 합쳐 (width, height, channel) 형태로 하나의 Feature Map을 구성해 줍니다. 이렇게 나온 3차원 형태의 Feature Map이 Convolution 연산의 최종 결과물이 됩니다.
지금까지의 Convolution 연산의 특징은 다음과 같습니다.
- Padding을 추가해주지 않는 이상 보통은 Convolution 결과물은 입력보다 Resolution이 줄어든다.
- Feature Map 개수(channel 수)는 적용한 필터의 개수와 동일하다.
- 보통은 입력 Feature Map 개수보다 결과 Feature Map 개수가 더 많다.
이러한 특징으로 인해 Convolution 연산을 수행할수록 결과 Feature Map은 얇고 긴 직육면체 형태가 됩니다.
4. Pooling
다음으로 Pooling 연산에 대해 살펴보겠습니다. 먼저 Pooling 연산 방법을 살펴보고 필요성과 특징에 대해 정리해 봅니다.
4-1. Pooling 연산 방법
먼저 Pooling 연산 방법을 살펴보겠습니다. Pool은 ‘모으다’라는 의미를 갖고 있습니다. 따라서 Pooling이란 결괏값을 하나로 모으는 방법임을 알 수 있습니다. 여러 값을 하나의 값으로 모으는 방법에는 다양한 방법이 있습니다. 대표적으로 최댓값, 최솟값, 평균값을 사용할 수 있습니다. 실제로 이 세 가지는 대표적인 Pooling 방법들입니다. 각각 Max Pooling, Min Pooling, Average Pooling이라고 합니다. 각 Pooling 연산은 입력 데이터의 최대값,최소값,평균값을 구하는 방법으로 이루어집니다.
4-2. Pooling 연산이 필요한 이유
다음으로 Pooling 연산이 필요한 이유를 생각해 보겠습니다.
입력 이미지가 강아지인지 고양이인지 구분해야 하는 CNN의 입장에서 생각해 보겠습니다. 5×5 입력에 대해 3×3 필터로 convolution 연산을 수행하여 3×3 Feature Map이 나온 상황을 상상해 보겠습니다.
이때 각 Feature Map의 값은 해당 필터의 정보가 입력에 ‘얼마큼’ 포함되어 있는지를 의미합니다. 또한 Feature Map에서 해당 값의 위치는 해당 필터의 정보가 입력 정보의 ‘어디에’ 있는지를 의미합니다. 그런데 강아지인지 고양이인지만 판단하면 되는 CNN의 입장에서 생각해 보죠. CNN의 입장에서는 ‘어디에’ 그리고 ‘얼마큼’ 같은 정보는 중요하지 않습니다. 이 CNN에게는 그저 입력 이미지에 있는 게 강아지인지 고양이인지만 알면 됩니다. 이렇게 입력에서 가장 중요한 정보만 추출하기 위한 연산을 Pooling이라고 할 수 있습니다.
4-3. Pooling 연산의 특징
Pooling 연산은 다음과 같이 이루어집니다.
먼저 입력 정보를 채널별로 분리합니다. 이렇게 분리된 (w, h)의 2차원 정보에 각각 Pooling 연산을 적용합니다. 이때 Convolution과 마찬가지로 Sliding Window 방식으로 Pooling을 수행합니다. 여기서 Pooling 연산의 특징을 알 수 있습니다.
첫 번째 특징은 Pooling 연산 후 Resolution이 줄어든다는 것입니다. 그 결과 전체 연산량이 줄어든다는 장점이 있습니다.
두 번째 특징은 Pooling 연산은 채널별로 이루어지므로, 채널 개수는 유지된다는 것입니다.
세 번째 특징은 Pooling 연산 결과 위치 정보가 사라진다는 것입니다. 대푯값을 추출하는 과정에서 이 대푯값이 어느 위치에 있었는지 상관없이 진행되기 때문입니다. 대푯값이 첫 번째 위치에 있었든 네 번째 위치에 있었든 결괏값이 같다는 의미죠.
네 번째 특징은 Pooling 연산은 학습할 파라미터가 없다는 것입니다. 최댓값, 평균값 등 지정된 연산만 수행하기 때문이죠. 파라미터가 학습되며 필터의 모양이 결정되는 Convolution 연산과 비교되는 차이점입니다.
Pooling 연산의 특징을 정리하면 다음과 같습니다.
- Resolution이 줄어들어 연산량이 작아진다.
- Channel 개수가 유지된다.
- 위지 정보가 사라진다.
- 학습할 파라미터가 없다.
5. Convolutional Neural Network에서 Feature map의 의미
CNN에서는 Convolution 연산 결과 나온 Feature Map이 매우 중요한 역할을 합니다. 이미지 분류를 위한 CNN의 경우를 생각해 보죠. 이때는 최종적으로 나온 Feature Map에 Fully Connected Layer를 연결하여 최종 클래스를 판단합니다. 따라서 최종 Feature Map에는 입력 이미지에 대한 압축된 핵심 정보가 모두 포함되어 있다고 할 수 있습니다.
그렇다면 Feature Map은 어떠한 의미를 갖고 있을까요?
5-1. 연산 단계별 Feature Map의 의미
입력 이미지에 대해 Convolution 연산을 두 번 연속으로 수행한다고 상상해 보겠습니다.
단순하게 생각하기 위해 두 번의 Convolution에서 사용되는 필터 사이즈는 모두 동일하다고 가정하겠습니다. 첫 번째 Convolution 연산은 RGB 이미지에 대해 이루어집니다. 입력 이미지에 대해 하나의 Convolution 필터와 연산을 수행하면 하나의 Feature map이 나오게 됩니다. 이러한 연산을 n1개의 필터에 적용했다고 가정하겠습니다.
5-1-1. 첫 번째 연산
첫 번째 Convolution 연산의 결과물은 (w1, h1, n1) 형태의 Feature Map이 되었습니다. 바로 이어서 두 번째 Convolution 연산을 수행하겠습니다. 이번에는 이미지에 대해 Convolution 연산을 수행하지 않습니다. 첫 번째 Convolution 연산의 결과물인 Feature Map_1에 대해 Convolution 연산을 수행해야 합니다. 입력과 필터의 채널 수를 맞춰줘야 하므로 두 번째 Convolution 필터의 채널 수는 n1이 되어야 합니다.
동일한 방법으로 연산하여 이번에는 (w2, h2, n2)의 Feature Map을 얻었다고 가정하겠습니다. 이제 각각의 Convolution 연산에서 사용된 필터와 결과물인 Feature Map의 의미에 대해 생각해 보겠습니다. 첫 번째 Convolution 연산에서 나온 n번째 Feature Map은 이미지와 n번째 필터의 ‘유사도 맵’을 의미했습니다.
5-1-2. 두 번째 연산
두 번째 연산을 보겠습니다.
두 번째 연산에서의 필터 각각은 n1개의 채널을 갖습니다. 이때는 하나의 필터가 첫 번째 convolution 연산에서의 n1개 필터 정보를 모두 포함하고 있다고 할 수 있습니다. 즉 두 번째 convolution의 필터 하나는 첫 번째 convolution의 n1개 필터들의 ‘조합’입니다.
그리고 이렇게 나온 두 번째 feature map은 두 번째 필터들과의 ‘유사도 맵’을 의미합니다.
이때 두 번째 필터 각각은 첫 번째 Convolution 필터보다 훨씬 복잡한 정보를 의미합니다. 첫 번째 convolution의 모든 필터들을 조합한 정보이기 때문이죠.
5-1-3. 정리
따라서 이렇게 정리할 수 있습니다.
첫 번째 feature map은 하나의 필터에 대한 유사도 맵을 의미 하므로 비교적 단순한 정보를 갖습니다.
반면 두 번째 feature map은 첫 번째보다 더 복잡한 정보를 갖는다고 할 수 있습니다.
이러한 이유로 단계별 Convolution 연산 결과 Feature Map의 이름을 구분하여 부릅니다.
- 초기 Convolution 연산 결과 Feature Map은 ‘Low Level Feature’라고 합니다.
- 중기 Convolution 연산 결과 Feature Map은 ‘Mid Level Feature’라고 합니다.
- 말기 Convolution 연산 결과 Feature Map은 ‘High Level Feature’라고 합니다.
이를 강아지를 인식하기 위한 convolution 연산으로 비유적으로 표현하면 다음과 같습니다.
- Low Level Feature : 직선, 곡선, 원 등이 포함되었는지를 의미
- Mid Level Feature : 눈, 코, 입, 귀 등이 포함되었는지를 의미
- High Level Feature : 달마시안, 푸들이 포함되었는지를 의미
5-2. 정보 관점에서 Feature Map의 의미
이번에는 Feature Map이 포함하고 있는 정보의 관점에서 생각해 보겠습니다.
5×5의 입력에 대해 연속으로 두 번의 Convolution 연산을 수행한다고 상상해 보겠습니다. 이때 필터는 3×3으로, stride는 1로 적용했다고 가정하겠습니다. 연산 결과는 다음과 같습니다.
이때 두 번의 Convolution 연산 후 나온 Feature 값 하나가 의미하는 바를 생각해 보겠습니다. 이 값 하나는 두 번의 Convolution 연산을 거치면서 첫 번째 입력인 5×5 형태의 모든 정보가 압축된 결과입니다. 따라서 Convolution 연산을 수행할수록 Feature Map의 값은 앞선 정보들을 압축한 정보를 갖습니다. 이때 압축된 정보들의 범위를 ‘Receptive field (수용 영역)’이라고 합니다.
6. 마무리
이번 글에서는 Convolutional Neural Network 의 주요 구성 연산에 대해 자세히 살펴봤습니다.
먼저 Convolution 연산에 대해 살펴봤는데요. 내적 연산을 사용하여 필터와 이미지의 유사도를 측정하는 과정을 살펴봤습니다. 이렇게 필터와 이미지의 내적 연산을 하는 과정에서 고민해야 하는 Stride와 Padding 요소에 대해서도 알아봤습니다. 최종적으로 여러 개의 필터를 사용한 Convolution 연산의 과정을 알 수 있었죠.
다음으로 Pooling 연산에 대해서도 살펴봤습니다. Pooling의 연산 방법, 필요성, 특징에 대해 알 수 있었습니다. 이렇게 나온 연산 결과물은 Feature Map이라고 불렀죠.
Feature Map의 특성에 대해서도 살펴봤습니다. Convolution 연산 단계별로 Feature Map은 다른 특성을 갖습니다.
따라서 부르는 용어도 조금씩 다른데요. 단계별 Feature Map의 특성에 대해 살펴봤습니다.
마지막으로 정보의 관점에서 Feature Map이 갖는 의미에 대해 살펴봤습니다.
원래 댓글 안다는데 글 너무 잘 쓰셔서 댓글 남깁니다.
덕분에 CNN 완벽하게 이해하고 갑니다.
감사합니다.
제 글이 도움이 되었다니 좋네요! 좋은 하루 되세요!