Posts List

[머신러닝/딥러닝] 9-2. CNN - 하이퍼파라미터 & Best Architecture

CNN Architecture

혹자는 딥러닝을 LEGO 블럭에 비교하곤 한다. (Andrew Ng도 딥러닝을 LEGO로 자주 비유한다.)
왜냐하면 우리가 작은 LEGO 블럭으로 집도 만들 수 있고 비행기도 만들 수 있듯, 딥러닝도 사용자가 만들기 나름이기 때문이다.

예를 들어 Conv. layer와 Average Pooling을 번갈아 사용하고, Filter 사이즈를 처음에는 크게 했다가 갈수록 작게만들어서 성능이 잘나오면 나만의 CNN 모델인 것이다. 이렇게 하이퍼파라미터를 어떻게 설정하느냐, 혹은 레이어를 어떻게 쌓느냐에 따라 모델의 성능은 천차만별이다. 

[Top-1 Accuracy against Number of Operations]

실제로 전 세계의 딥러닝 대가들이 자기들만의 CNN 구조에 이름을 붙여서 발표하고, Pre-trained model과 소스코드를 open했다. 
※ Pre-trained 모델이 있으면 transfer learning을 통해 전체 네트워크를 학습하는 것이 아니라 일부 네트워크만 내 데이터에 맞게 재학습 할 수 있다.

그리고 위 그래프는 연산량 vs. 성능 vs. 모델의 크기로 모델들을 비교한 것이다. 즉, 그래프의 왼쪽위 (연산량이 적고 성능은 높은 모델)에 위치하고, 원의 크기가 작을수록(무겁지 않은 모델) 좋은 모델이라고 할 수 있다.
※ 참고로 10MB만 넘어도 모바일 플랫폼에 embedding 시키기는 어렵다.

전 세계의 대가들이 개발했음에도 불구하고 모델들 마다 각기 다른 특징을 가진다. 그럼 하이퍼파라미터를 어떻게 설정해야 좋은 CNN 모델이라고 할 수 있을까? 정답은 없다.

얼핏 보더라도 FCN보다 CNN이 더 복잡해서 짐작했지만, CNN은 FCN보다 더 하이퍼파라미터 선택을 훨씬 잘 해줘야 한다. 하지만 아쉽게도 FCN이 그렇듯, CNN도 하이퍼파라미터를 설정하는데 manual은 없다. 그래도 이번시간에는 CNN의 몇몇 중요 하이퍼파라미터를 설정했을 때 어떤 결과를 낳는지 살펴보고, 최적의 하이퍼파라미터를 찾았다고 할 수 있는 유명한 CNN Architecture들에 대해서 알아보도록 하자.


Convolution Layer의 하이퍼파라미터
하이퍼파라미터들의 튜닝에 대해서는 수업시간에 자세히 다루지 않았지만, 공부하다보니 기억해두면 좋을 것 같아 라온피플의 글을 참고하여 작성하였다. 

Convolution layer에서 가장 중요한 파라미터는 역시 Filter(=kernel)과 관련된 파라미터다. 

1) Filter의 크기

Filter의 크기 즉, Feature map의 크기는 convolution layer의 출력영상의 크기와 직결된다.

Filter의 형태는 논문마다 상당히 다른데, 형태를 결정하기 위한 manual이 있다기 보단 학습데이터에 따라 적절하게 선택되어야 한다.

일반적으로 32x32나 28x28와 같은 작은 크기의 입력 영상에는 5x5 필터를 주로 사용하지만, 큰 이미지를 처리할 때나 첫번째 Conv. layer에서는 간혹 11x11나 15x15와 같은 큰 크기의 Filter를 사용하기도 한다. 그리고 때로는 Filter 크기를 레이어마다 다르게 하기도 한다.

실제로 LeCun의 논문에서는 5x5로 동일한 크기의 Filter를 사용했지만,
※ Gradient-based learning applied to document recognition

Krizhevsky의 논문에서는 1층에서는 11x11, 2층에서는 5x5, 3층 이상에서는 3x3크기를 갖는 Filter를 사용했다. 
※ ImagetNet classification with deep convolutional neural network

그렇다면 큰 크기를 갖는 Filter 1개가 좋을까, 아니면 작은 크기를 갖는 filter 여러개를 사용하는 것이 좋을까?

결론부터 말하자면, 작은 크기의 filter를 여러개 사용하는 것이 좋다.

그 이유는 filter를 여러개 중첩함으로써 원하는 특징을 좀 더 찾아낼 수 있기 때문이다. 뿐만 아니라 작은 filter를 여러개 사용하는 것이 연산량도 더 적게 만든다.

2) Filter의 갯수

Feature map의 크기(conv. layer의 출력 이미지 크기)는 Convolution과 Sub-sampling을 반복함으로써 점점 작아진다. 그래서 Feature map의 크기가 작아지는 것을 보상하기 위해 입력단에서 멀어질 수록 filter를 여러개 써서 Channel을 늘리는 것이 일반적이다.

무턱대고 감으로 정할 수도 없고, 어떤 원칙으로 Filter 갯수를 정해야 할까?

먼저 CNN에서 convolution layer의 연산 시간을 살펴보자.

Tc = Np x Nf x Tk

Tc : 각 layer에서의 연산시간

Np : 출력 pixel의 수,  Nf : 전체 feature map의 수,  Tk : 각 Filter당 연산 시간

Filter 갯수를 정할 때 흔히 사용하는 방법은

layer별 연산 시간을 비교적 일정하게 유지시켜서 시스템의 균형을 맞추는 것이다.
이를 위해 일반적으로 각 (layer의 feature map의 수 x pixel 수) 를 일정하게 유지시킨다.

보통 pooling layer를 거치면서 2x2 sub-sampling을 하는데, 이 때 pixcel의 수가 1/4로 줄어든다. 이런 경우 feature map의 수 즉, filter의 갯수를 대략 4배 정도 증가시켜서 시스템의 균형을 맞춘다.

다만 (layer의 feature map의 수 x pixel 수)를 유지하기 위한 상수는 사용자가 지정해줘야하는데, 학습 데이터의 수 및 수행하고자 하는 과제의 복잡도에 따라 결정된다.

3) Stride

Stride도 Feature map의 크기에 영향을 미치는 중요한 파라미터다. 

Stride가 클수록 convolution layer에서 feature map의 크기가 줄어드는데, 그래서 충분히 입력 영상의 큰 단계 즉, 입력단과 가까운 쪽에서만 stride를 1보다 크게 가져가는 것이 일반적이다.

참고로 stride=1로 정하고 pooling을 하는 것과 stride=2로 하고 pooling을 하지 않았을 때 feature map의 축소량은 똑같다. 그럼 어떤 차이점이 있을까?

첫 번째 경우(stride=1 with pooling)에는 모든 입력 영상에 대해 convolution 연산을 수행하고 pooling을 통해 값을 선택적(max, avg 등)으로 고를 수 있지만,

두 번째 경우(stride=2, no pooing)에는 이런 선택의 기회조차 사라진다. 즉, 이미지 전체를 살펴보지 못하기 때문에 feature를 찾기 힘든 상황이 발생한다.

그러므로 큰 영상에 대해 연산량을 줄이는 목적이 아니라면 stride=1로 하고 pooling을 통해 적절한 sub-sampling 과정을 가지는 것이 결과가 좋다.

4) zero-padding

일반적으로 convolution 연산 역시 경계처리 문제로 인해 feature map을 작게 만든다. 

zero-padding은 이미지가 작아지는 것을 피하기 위해 입력의 경계면에 0을 추가하는 것을 말한다. zero-padding을 하면 위 그림과 같이 출력되는 feature map도 입력 이미지와 같은 크기를 가질 수 있다.

그럼 zero-padding을 왜 할까? 

단순하게 영상의 크기를 동일하게 유지하는 장점 외에도,
경계면의 정보까지 살릴 수 있어 일반적으로 zero-padding 했을때의 결과가 좀 더 좋다.

지금까지 Filter의 크기, 갯수, stride, zero-padding을 살펴봤는데, 이 파라미터들은 CNN의 구조를 결정하는 중요한 하이퍼파라미터이다.
물론 위 파라미터 외에도 실제로 CNN을 설계할 떄는 고려해야 할 요인이 더 있지만, 가장 결정적이다고 할 수 있는 convolution layer구조를 결정하는 파라미터들은 확실히 기억해두도록 하자.


Best Architecture

그럼 지금부터 CNN 하이퍼파라미터를 잘 튜닝했거나, 획기적인 방법으로 높은 성능을 보인 CNN 구조들에서 살펴보자. 

ImageNet

여기서 한가지 의문을 가질 수 있다. 

"이 모델이 더 좋은지 어떻게 상대적으로 판단하지?"

그래서 이쪽(?) 세계에서 벤치마크로 사용할 수 있는 영상 데이터베이스가 있는데 그것이 바로 ImageNet이다.

ImageNet은 세계 최대의 영상 데이터베이스며, 약 22,000종류로 불류가 가능한 1,500만장의  영상데이터가 확보되어 있어 컴퓨터 비전을 연구하는 사람들이 벤치마크로 사용하고 있다. 

모든 이미지에는 Label이 붙어 있어서 머신러닝을 연구하거나 자신이 만든 프로그램의 성능을 평가할 때 많이 사용한다. 심지어 저작권을 주장하지 않기 때문에 누구나 편안하게 다운로드 해서 사용할 수 있다.

ILSVRC

ImageNet Large Scale Visual Recognition Challenge의 약어로, ImageNet 영상을 기반으로 한 컴퓨터 비전 분야의 세계적인 경진대회다. 

우리가 알고 있는 유명한 모델들은 ILSVRC에서 발표된, 혹은 Top ranking인 모델인 경우가 대다수다. (그러다 보니 학술대회로 착각하는 사람도 많다.)

※ 대회 분야는 classification / single-object localization / object detection으로 나뉜다.

Best Architectures

1) LeNet

CNN의 대가 Yann LeCun이 1990년대에 발표한 구조로 처음으로 CNN이라는 개념을 성공적으로 도입했다. 이 때는 우편번호나 숫자 등 손글씨를 인식하기 위해 자연어처리의 대가 Yoshua Bengio와 함께 공동연구를 진행하였다. 앞 글에서 LeNet에 대해서 다루었기 때문에 네트워크 구조에 대한 자세한 설명은 생략한다.

2) AlexNet

2012년에 딥러닝 사상 처음으로 ILSVRC에서 우승 하면서, 딥러닝 열기에 가속화를 시킨 기념비적인 네트워크다.(Alex Krizhevsky, Geoffrey Hinton, ImageNet Classification with Deep Convolutional Neural Networks) 

AlexNet 전까지는 학습하기 쉬운 수준의 작고 단순한 형태의 모델이 위주였는데 AlexNet의 등장으로 깊은 CNN 구조가 주목받게 되었다. 물론 이 시기에 GPGPU(General Purpose GPU)의 등장도 큰 역할을 했다. 
※ 2012년 이전 이미지 분류의 최강자는 SVM이었다.
GPGPU : 기존 GPU의 역할은 그래픽 처리였는데, GPU로 일반적인 산술 연산을 병럴로 처리 할 수 있도록 한 기술. 딥러닝의 수십만개의 파라미터 학습 속도의 직접적인 향상 효과가 있다.

AlexNet은 당시 가장 큰 규모의 CNN모델이었으며, Conv5 + FC3으로 구성된 7 layer neural Net이었다. LeNet과 유사하지만 Conv+Pooling의 일반적인 구조와 달리 Conv+Conv 구조를 사용한 점이 차별점이다.

3) ResNet

CNN을 더 deep 하게 만들면 성능이 좋아지지 않을까? 분명 들 수 있는 질문이다. 하지만 아쉽게도 CNN에서는 ReLU나 Batch normalization을 아무리 적용해도 일정 layer 수를 넘으면 gradient vanishing 문제가 생긴다. 그래서 대부분의 딥러닝 구조는 깊어도 20 layers를 크게 벗어나지 않았다.

이 한계를 돌파하고자 한 모델이 ResNet(Residual Net)이다. ResNet은 당시 Microsoft의 Kaiming He에 의해서 설계된 네트워크로 ILSVRC 2015에서 우승했다.
(현재 Kaiming He는 Facebook으로 자리를 옮겼다.)

ResNet은 깊은 layer를 갖기 위한 skip connection을 제안한다.

FC network관점에서 봤을 때, 일반적으로 l번째 layer가 l+2번째 layer로 이동하기 위해선 l+1번째 layer를 거쳐야 한다. 하지만 ResNet의 skip connection은 l+1번째 레이어가 큰 의미를 갖지 않을 때 뛰어넘을 수 있는 기능을한다.

즉, 위 예제에서 back propagation 할 때 W(l+2)의 gradient가 매우 작더라도 h(l)의 gradient를 고려할 수 있어 gradient vanishing 현상을 방지할 수 있다.

이 과정을 일반화 하면 위 그림으로 나타낼 수 있고, skip connection이 포함된 block을 Residual block이라 한다. 그리고 ResNet은 여러개의 Residual block이 연결된 network이다.

실제로 ResNet-3434 layer를 가진 CNN구조이며, 34 layer는 16개의 residual block으로 묶여 있다.

이렇게 network를 설계하면 얻는 이점은 ① 깊은 네트워크를 구성함으로써 높은 성능을 기대할 수 있고, ② layer를 몇층이나 써야할지 모를때, 깊은 네트워크를 설계하더라도 residual block으로 인해 불필요한 layer를 skip할 수 있어 학습이 가능하게 한다.

※ 참고로 2년뒤 ResNet의 아이디어를 발전시킨 DenseNet 이 발표되기도 했다.

4) Inception Net

ILSVRC 2014에서 우승한 GoogLeNet은 Inception module을 가졌다 해서 Inception Nets라고도 불린다.

앞서설명한 ResNet(2015)이 등장하기 전에도 네트워크의 성능을 올리기 위해 네트워크의 깊이를 늘리고자 했지만 gradient vanishing문제를 해결하지 못했었다. 그래서 Google은 네트워크의 깊이를 깊게 하는 것이 아니라 폭을 키움으로써 파라미터 수를 증가시고자 했고 그 결과물이 바로 Inception Net이다.

Inception Net은 기본적으로 MLP의 개념을 차용했다. MLP의 개념을 차용 했다는 것은, Convolution 연산을 연속적으로 하는 것이 아니라 위 그림처럼 병렬 Convolution 연산 후에 FC Layer를 거친다는것을 의미한다. 

이 개념을 일반화 시켜 3종류의 크기를 가는 filter의 convolution 연산 결과를 FC layer에 연결시켰고, 한개의 단위로 인식했다. 그리고 이 module의 이름을 Inception module이라 부르기 시작한다. 

※ 참고로 1x1 convolution은 ① FC layer 입력 이미지 크기를 맞추기 위한 것도 있지만 ② 차원을 축소해 간접적인 pooling 효과를 얻는것, 그리고 ③ non-linearity를 확보함으로써 비선형적 관계에 대한 예측을 더 용이하게 하기 위해서 존재한다.

실제로 Inception Net-v1은 위와 같이 9개의 Inception module을 가지는 네트워크다. 한가지 특이한점이 보이는데 중간에 2개의 auxiliary(보조) classifier가 존재한다. (노란색 softmax classifier)

이 보조 분류기는 최종 분류기의 loss가 입력단까지 전파되지 못 할 것을 대비해서 local feature를 이용해 중간 분류를 하는 역할이다. 그래서 학습 시 최종 loss는 3개 분류기의 weighted sum으로 인식하고 back propagation을 수행한다.

이후로도 Inception Net은 Batch normalization원리를 차용한 Inception-v2(2015), Factorization을 추가한 Inception-v3(2016), ResNet의 원리를 응용한 Inception-v4(2017)로 발전하는 모습을 보인다.


지금까지 ImageNet 경진대회라 불리는 ILSVRC 에서 우승한 ArchitectureSiamese Architecture 를 살펴보았다. 이 외에도 또 새로운 CNN 모델이 계속해서 발표되고 있는데, 확실히 딥러닝을 LEGO블럭에 비교할 만큼 무궁무진한 가능성이 보인다.

다음 포스팅에서는 CNN기술을 활용해 할 수 있는 다양한 테크닉들에 대해서 알아보도록 하자.

댓글 쓰기

0 댓글