본문 바로가기

딥러닝

3. CNN - Convolutional Neural Network

 

1. 시작

 

 CNN의 시작을 말할때는 Yann LeCun 교수를 알아야 합니다. 가장 최근에 튜링상을 수상한 분이시고, LeNet을 통해 CNN 개념을 1990년대에 발표하였습니다. CNN의 기본 구조가 이 LeNet에서 거의 다 정립되었습니다. 그리고 딥러닝 하면 가장 먼저 떠올리는 Mnist 데이터셋을 수집한 사람입니다.. 대학원생 시절에 연구를 위해 수집했다고 합니다.

 

2. CNN의 구성요소

 

 CNN에는 많은 장점이 있으나, 먼저 구성 요소들을 아는 것이 좋다. 

 

 - Convolutional Layer (Conv layer)

 - Pooling Layer 

 

 CNN에는 크게 두가지 구성 요소가 있습니다. 사실 CNN 하면 저 두개의 layer를 조합해서 사용하고, 보통 맨마지막 단에 FC layer로 구성을 합니다. 요즘에는 Pooling Layer를 사용하지 않는 경우도 있긴 합니다.

 

3. Conv Layer

 

 CNN 하면 가장 먼저 떠올리는 구조 입니다. Conv layer는 FC layer의 한계를 극복하고자 하는 생각으로 나왔습니다. 가장 대표적인 한계는 2차원 이상의 데이터를 처리하는 데에 있습니다. Mnist 처럼 2차원 이미지는 그 위치 자체가 정보를 줍니다. FC layer는 이 2차원 데이터를 1차원으로 바꾼뒤에 input으로 넣어야 하기 때문에 이러한 정보를 이용하지 못합니다.

 또 2차원 이미지 내에서 예를 들어 모든 픽셀이 x축으로 1픽셀 움직인다고 생각해봅시다. 사람이 인식하는 이미지는 같지만, 이걸 1차원으로 변환해 보면 모든 값들이 다 달라져 있을테고 이럴 경우 FC layer만을 이용한 모델의 경우 처음보는 이미지가 됩니다.

 위와 같은 경우를 어렵게 말하면 FC layer가 topology 변화에 대응하기 어렵다고 말합니다.

 

 Conv Layer는 다음과 같이 작동 합니다.

CS231n Conv layer

 위 그림은 딥러닝 쪽에서 제일 유명한 온라인 강의인 CS231n에서 캡쳐해왔습니다 (출처 : http://cs231n.github.io/convolutional-networks/)

 

 그림과 같이 원래 이미지에 Filter를 옮겨가면서 값을 구하는 것입니다. 보통 filter는 2차원 크기이며, 이 filter가 한칸씩 옮겨갑니다. 원래 이미지에서 Filter의 값을 곱하는 과정을 '합성곱' 이라고 하고 이 합성곱이 영어로 Convolution 입니다. 따라서 Convolutional Layer라고 부르는 것이죠.

 

 Conv Layer의 구성 요소이면서, 하이퍼 파라메터로 사용할 수 있는 것들이 있습니다.

1) Filter size

 Filter라고도 하고, Kernel 이라고도 부릅니다. 보통 2차원의 정사각 행렬 입니다. 3x3 등으로 말입니다. 이 size의 크기가 중요합니다. Filter를 거쳐서 나온 값을 Feature Map이라고 부르는데, 의미를 갖는 Feature Map을 만들기 위해서는 이 size에도 의미가 있어야 하기 때문입니다.

 Filter의 숫자도 하이퍼 파라메터 입니다. 보통 2의 제곱으로 자주 사용합니다. 3*3 크기의 filter 128개 처럼 말입니다.

 

2) Stride

 Filter를 옮기는 크기 입니다. 2차원 이미지에서 Stride가 1*1 이면 한칸씩 움직이는 것입니다. 2*2, 3*3 처럼 좌우, 상하로 같은 크기 만큼 움직일수도 있지만 2*1 처럼 가로는 두칸, 세로로는 한칸씩만 움직이도록 설정할 수도 있습니다. 

 

3) Padding

 Filter size와 Stride의 값을 고려해보면 일반적으로 Conv layer를 지나간 이미지의 크기가 작아집니다. 예를 들어 Filter size가 3*3, Stride가 2*2라면, Filter가 가로 세로로 두칸씩 움직이기 때문에 이미지가 거의 반으로 작아집니다. 이미지 크기에 변화가 있어도 상관이 없는 경우도 있지만, 이미지의 크기가 유지되었으면 할 수도 있습니다.

 

 이럴 때 사용하는 것이 Padding 입니다. Filter size와 Stride를 고려해서 Filter를 거치고 나서도 이미지 크기가 변하지 않도록 임의로 원본 이미지 주위에 특정 값들을 채워넣습니다. 일반적으로 원본 이미지 주위에 '0'을 채워줍니다. 이것을 zero padding 이라고 합니다.

 

 Filter, Stride 크기를 알면 원본 이미지보다 이미지가 얼마나 작아질지 알 수 있고, 이에 따라 Padding을 얼만큼 해줘야 하는지도 계산할 수 있습니다. 다만 우리가 사용하는 딥러닝 Framework 들에서는 padding을 해준다고 입력하면 알아서 계산해주니 걱정할 필요는 없습니다.

 

 원본 이미지가 커지고 0을 값으로 채워주면, Conv layer에서 추출된 Feature Map의 값도 달라지는 것이 아니냐? 라고 할 수 있습니다. 맞는 말이긴 하지만 계산에 별로 영향을 주지 않고, Conv Layer가 이러한 0값을 이미지의 외각으로 인식하는 효과가 있기 때문에, 특별한 경우가 아니라면 padding으로 인해서 학습이 어려워 지는 경우는 생각하지 않습니다.

 

4. Pooling Layer

 

 Pooling은 조금 특별한 layer 입니다. 

CS231n Pooling layer

 보시다시피 보통 이미지의 크기를 줄이는 용도로 사용합니다. Downsampling의 역할을 하는 layer 입니다. 이러한 샘플링은 이미지 크기는 작게 하면서도, 정보량의 손실은 거의 없다고 보고 사용합니다. 224 x 224 이미지가 112 x 112 이미지로 변하면서, 데이터의 크기는 작아집니다. 그 후에 Conv layer 또는 FC layer의 크기를 사용했을 때 추출 할 수 있는 Feature가 비슷할 수 있습니다. 이럴 경우 연산량에서 이득을 볼 수 있습니다. 학습 속도가 빨라지거나, 더욱더 layer를 쌓아서 모델의 성능을 높일 수 있게 됩니다.

 

 Pooling 하는 방법도 꾸준히 연구가 되고 있는 분야 입니다. 그러나 일반적으로 사용하는 방법은 max pool, min pool 등이 있습니다. Conv layer 처럼 Filter를 거치면서 그 Filter 안에서 가장 큰 값, 또는 가장 작은 값을 가져오는 것 입니다. 그 중에서도 Max pooling이 더 많이 사용 됩니다. 사람의 눈으로 봤을때 위의 그림처럼 max pooling을 한다면 크게 차이가 없어 보이기 때문 입니다. 그리고 모델의 성능도 괜찮았기 때문이죠.

 

5. Conv Layer를 사용한 딥러닝 구조

 

 초기의 CNN은 Conv layer와 Pooling layer를 순차적으로 사용하는 경우가 많았습니다. 하드웨어의 속도 등을 고려했을때, 몇년 전만 하더라도 지금보다 사용할 수 있는 연산량이 적었습니다. 그래서 원본 이미지에 Conv layer를 사용한 뒤, pooling. 그리고 filter의 갯수를 늘린 Conv layer, pooling... 이런식으로 반복해서 말입니다.

 

 그러나 많은 연구를 통해서 CNN에 사용하는 구조들이 추가가 되고, 연산량도 늘어나면서 구조가 조금씩 바뀌기 시작합니다. 그 중 pooling에 대해서 얘기하면, pooling을 사용함으로써 정보량은 거의 손실이 없고 연산량은 줄어듭니다. 그러나 여기서 발생하는 정보량의 손실도 막고자 하여 pooling layer를 사용하지 않는 추세 입니다. 그리고 Pooling 처럼 이미지 크기를 줄이기 위해서 Conv layer를 변형 시켜서 사용합니다.

 

 Padding을 사용하는 이유가 이미지 크기를 보존하기 위해서 였는데, padding을 사용하지 않고, 다른 파라메터를 조정함으로써 Pooling layer 같은 역할을 하는 Conv layer를 사용하는 것 입니다. 이럴 경우 이미지 크기는 작아지는데, 그러면서 정말 정보량이 손실이 되지 않도록 학습이 되는 것 입니다. 

 

 그 외에 Convolutional Layer의 발전 단계는 다음글에서 이어가도록 하겠습니다.