Tech Blog
Convolutional Neural Networks (CNN) 본문
컴퓨터 비전(Computer Vision) 이란 인간의 시각에 해당하는 기능을 컴퓨터와 같은 기계로 모사할 수 있도록 연구하고 이를 구현하는 인공지능의 주요 분야 중 하나입니다. 본 글에서는 컴퓨터 비전 분야의 가장 대표적인 모델인 CNN을 소개하고자 합니다.
1. CNN이란?
CNN의 등장 배경
CNN은 MLP의 한계로 등장하게됩니다. MLP는 입력 데이터로 1차원 벡터만 사용이 가능하므로, 이미지 데이터와 같이 2차원 이상의 데이터가 들어온다면 평탄화 하는 과정을 거쳐야 합니다. 이미지를 단순히 1차원으로 바꾸면 이미지 내 사물 간의 거리 관계 또는 색의 변화와 같이 2차원 상에서 가지는 정보를 포기해야 합니다. 즉, 공간 정보 (Spatial Information)가 무너지므로, 차원을 평탄화 하지 않고, 공간적 정보를 보존하며 이미지 처리에 특화된 딥러닝 모델인 CNN이 등장하게 됩니다.
CNN에 대하여
CNN을 요약하자면 Convolution과 Pooling을 반복하여 상위 Feature를 구성하는 기법이라고 할 수 있습니다.
CNN은 크게 다음과 같이 구성되어있습니다.
- Convolutional Layer
- Pooling Layer
- 분류기 (Classifier): Fully-connected layer
Convolution은 Filter를 이용하여 Local 영역에서의 특정 Feature를 얻는 과정이며, Pooling은 추출한 Feature의 유의미한 정보를 유지하며 Dimension을 줄이는 과정입니다.
위의 그림처럼 Convolution층과 Pooling 층을 반복하다가, 마지막은 Fully-connected layer 로 학습합니다. 세 가지의 과정을 하나하나씩 살펴보도록 하겠습니다.
2. Convolution 층
Convolution 층의 연산은 CNN을 구현하는 핵심 연산으로, filter를 이용하여 Local 영역에서의 특정 Feature를 얻는 과정으로, convolution filter가 목적 이미지 위를 미끄러지듯 움직이며 연산을 진행합니다.
위와 같이 Filter 가 Image 위에서 위치를 옮겨가며 연산합니다. 이 때 convolution 연산을 사용하는데, 필터와 이미지 데이터에서 대응하는 원소끼리 곱한 후 그 값들을 모두 더해주는 연산입니다. 예를 들어, 결과값인 Feature map의 첫번쨰 원소를 계산해보면, 1*1 + 0*1 + 1*1 + 0*0 + 1*1 + 0*1 + 1*0 + 0*0 + 1*1 = 4 입니다.
2차원이미지 데이터 (행렬의 각 원소는 해당 위치의이미지 픽셀값) 와 Convolution 커널은 행렬로 표현이 가능하며, Convolution 연산은 2차원 상에서 연산이 이루어지므로 이미지 데이터를 변형 없이 그대로 사용 가능합니다.
컬러이미지의 Convolution 연산
각 채널별로 Convolution 연산을 수행하고 각 결과를 더해서 하나의 Feature Map을 생성합니다. 따라서 (입력 채널 크기) == (Filter 채널 크기) 가 같아야 합니다. 예를들어 (5x5x3) 크기의 이미지라면 filter의 채널사이즈 또한 3이어야 합니다.
여러 Convolution filter의 연산
지금까지 kernel (filter) 을 한 개만 사용하였고, Feature Map 도 한개가 나왔습니다. 여기서 커널을 여러개 사용한다면 Feature Map도 여러개 생성됩니다. 예를 들어 6개의 5x5x3 filter를 사용하면 6개의 독립된 feature map (activation map)을 얻게됩니다. 연산은 컴퓨터가 해주지만, 커널 연산 확장 (커널을 여러개 두는 것), 즉 커널의 개수 설정은 인간이 해주며, CNN의 성격을 결정하는 것이므로 더 중요한 하이퍼파라미터입니다.
위의 그림을 보면 32x32x3의 입력 이미지에 6개의 5x5x3 필터를 적용하여, 28x28x6의 아웃풋이 나왔고, 채널의 사이즈가 같은 5x5x6 필터를 10개 적용시켜 24x24x10 의 아웃풋이 나오는 것을 확인할 수 있습니다.
지금까지 사용한 커널들은 모두 학습 가능한 커널입니다. 즉 커널 행렬의 각 값들이 가중치 (Weight)라는 것입니다. 이러한 커널들로 이루어진 Layer를 Convolutional Layer라고 부르며, 이 Layer들을 쌓아서 CNN을 구성하게됩니다.
stride (보폭)
stride는 Convolution 연산 과정을 조절하기 위한 Hyperparameter로, 커널이 이미지 내에서 이동하는 칸수를 조절합니다. 지금까지 Convolution 연산에서 보여준 예시는 모두 1칸이며 다음의 그림은 Stride가 2칸일 경우의 예시입니다.
stride=2 일 때
패딩 (Padding)
패딩은 합성곱 연산 수행 전, 입력 데이터 주변을 특정 값으로 채워서 늘리는 작업으로, 일반적으로 zero-padding을 사용합니다. 지금까지 예시는 Convolution 연산 결과 Feature Map 사이즈가 계속 줄어들었습니다. 하지만 Padding을 추가하여 Feature Map 사이즈가 줄어드는 현상을 방지할 수 있습니다. 이처럼 아웃풋 사이즈를 유지하거나, 사이즈를 정수로 나누어 떨어지도록 나오게 하기 위해 사용합니다. 또, 이미지의 테두리 정보도 균일하게 활용이 가능해지게 됩니다.
* output size 계산
(N * 2P -F) / stride + 1
output size는 이미지 사이즈 N, 필터 사이즈 F, 패딩 사이즈 P, stride 값을 알면 위와 같이 계산할 수 있습니다.
Concolutional Layer 활성화 함수
Convolution 연산은 모두 곱셈과 덧셈으로만 이루어진 선형 연산 입니다. 따라서 FC Layer 처럼 비선형성을 추가하기 위해 활성화 함수를 사용합니다. CNN은 주로 ReLU 함수를 사용합니다.
Convolution layer의 역할
convolution layer는 이미지가 가지는 특정 Feature를 뽑아내도록 커널을 학습하며, 커널에 따라 추출하는 Feature를 다르게 학습하게 됩니다. 이미지 내의 대각선, 원형, 색조 등등이 이러한 Feature에 해당하며, 갈수록 저수준 → 고수준의 feature로 뽑아내도록 하는 역할을 합니다.
Convolutional Layer 의의
왜 이미지 특징을 잘 뽑아내는가?
Convolution 연산은 하나의 커널이 픽셀 간의 정보를 보게 만듭니다. 즉, 하나의 커널이 이미지 전체 영역을 보고 학습하므로, 커널 하나가 이미지 전체를 돌아다니면서 연산을 하게되어, 연속적으로 변하는 정보를 잡아내기에 유리합니다.
Parameter Sharing
커널이 가진 Parameter를 이미지의 모든 영역에서 공유합니다. FC layer는 하나의 선마다 가중치를 갖고있어 하나의 픽셀마다 가중치가 다르게 되는 것에 반해, Convolution 레이어는 커널의 사이즈에 따라 가중치 개수가 결정되고, 이미지 모든 영역에서 공평하게 연결되므로 가충치 개수가 줄어들게 됩니다. 따라서 Parameter 개수를 FC Layer에 비해 극적으로 줄일 수 있게 되어 과적합 방지에 유리합니다.
3. Pooling 층 연산
pooling layer는 CNN에서 거의 항상 같이 쓰이는 Layer 입니다. Feature map에서 특정 값을 뽑아내는 작업으로, 의미있는 feature를 살리며 feature map의 크기를 줄입니다. 주로 Feature Map의 사이즈를 줄여서 Parameter 개수를 줄여 과적합을 조절하는 역할을 합니다. 각각의 feature map은 독립적으로 pooling 진행됩니다.
위의 그림과 같이 pooling 층에는 대표적으로 Max pooling과 Average pooling이 있습니다.
max pooilng
각 영역에서 최대값을 뽑아내어 새로운 Feature Map을 구성
average pooling
각 영역의 평균값을 계산하여 새로운 Feature Map 구성
방법은 간단합니다. 각 영역에서 최댓값과 평균값을 계산하여 Feature Map을 구성하는 것입니다. 두 방법 중에서는 일반적으로 Max Pooling을 많이 사용하는데, Feature Map에 존재하는 Feature 중 가장 영향력이 큰 Feature만 사용하는 효과를 얻을 수 있게됩니다.
Global Pooling
추가 Pooling 방법으로, Global Average Pooling과 Global Max Pooling이 있습니다. Global Average Pooling은 전체 Feature Map에서 하나의 평균값을 계산합니다. Global Max Pooling은 전체 Feature Map에서 하나의 최대값을 계산합니다. 둘 다 마찬가지로 채널 별로 연산하며, 이 방법들 중에서는 분류기 학습 단계에서 1차원으로 변형시켜주는 방법으로 Global Average Pooling을 많이 사용합니다.
4. 분류기
CNN은 일반적으로 이미지 분류 목적으로 사용합니다. Convolution 층에서 결과로 나온 Feature Map을 최종적으로는 Fully-connected Layer에 통과시켜 분류를 수행합니다. 이를 위해 Feature Map을 1차원으로 변형시키는데, 1차원 변형은 flatten이나, Global Average Pooling을 사용할 수 있습니다.
5. CNN의 특징
지금까지 CNN에 대해서 알아보았습니다. CNN은 각 레이어의 입/출력 이미지의 형상을 유지하여 이미지의 공간 정보 유지 및 근접 픽셀과의 관계를 파악할 수 있다는 특징이 있었습니다.
또 다른 특징으로는 Translation Invariance한 특징을 파악할 수 있다는 점입니다.
위의 그림 처럼 입력의 위치가 변해도 출력은 변하지 않는다는 뜻입니다.
마지막으로, Fully Connected Layer 대비 적은 Parameter 사용하므로, 과적합을 방지할 수 있다는 특징이 있었습니다.
지금까지 사용했던 CNN 관련 용여들 중 혼동이 올 수도 있으니, 용어 정리를 끝으로 마무리짓도록 하겠습니다.
용어 정리
- kernel = filter
- pooling = subsampling
- feature map = activation map
- 비슷한 개념이지만 다음과 같은 차이점이 존재합니다.
- feature map: convolution layer
- activation map: convolution layer + activation function