본문 바로가기
Deep Learning

[DL - 논문 리뷰] ImageNet Classification with Deep Convolutional Neural Networks(AlexNet)

by JJuOn 2021. 11. 28.

 이번 포스팅에서는 AlexNet이라고 알려져 있는 Alex Krizhevsky가 2012년에 소개한 "ImageNet Classification with Deep Convolutional Neural Networks"를 읽고 정리해 보도록 하겠습니다.

 

 AlexNet은 ILSVRC-2010에서는 top-1 error rate 37.5%, top-5 error rate 17.0%,
ILSVRC-2012에서는 top-1 error rate(validation set) 36.7%, top-5 error rate 15.3%의 성과를 거뒀습니다.


1. Introduction

 이전까지의 데이터셋의 크기는 수만 장 정도로 상대적으로 매우 적었습니다. 그렇기 때문에 MNIST 데이터셋처럼 label을 유지하며 augmentation을 적용시키면 간단한 인식 작업은 잘 수행할 수 있었습니다. 그러나 실제 사물은 이러한 데이터와 매우 다르기 때문에 실제 사물을 인식하는 데에는 더 큰 규모의 데이터셋이 필요하게 됩니다. 이에 ImageNet이라는 2만 2천이 넘는 카테고리에 대해 고해상도의 1500만 장이 넘는 labeled 데이터셋이 등장하게 됩니다.

 

 데이터셋이 커짐에 따라 자연스레 용량이 큰 모델이 필요하게 됩니다. CNN의 용량은 depth나 breadth를 달리하면서 조절되고 이미지 분야에서 성능이 우수합니다. 또한, 일반적인 feedforward network와 다르게 더 적은 connection과 매개변수를 가져가기 때문에 학습시키기 더 쉽습니다.

 

 본 논문에서 기여한 바는 다음과 같습니다.

  1. 가장 큰 CNN중 하나를 학습시켜 ILSVRC-2010과 ILSVRC-2012에서 이전에 없던 성과를 낸 것
  2. Highly-optimized GPU를 이용한 2D conv의 implementation과 CNN을 학습시키기 위한 operation을 공개한 것
  3. 모델의 성능과 학습 시간을 단축시킨 새로운 방법을 여러 사용한 것
  4. 오버 피팅을 방지하기 위한 여러 방법을 사용한 것
  5. 5개의 conv layer와 3개의 fc layer를 사용했는데 conv layer 중 어떤 layer를 제거해도 성능이 확연히 떨어지는 것

 


2. The Dataset

 ImageNet은 22000가지가 넘는 1500만장 이상의 고해상도 데이터셋입니다. ILSVRC에서는 ImageNet의 부분집합 1000가지 카테고리를 사용하며 학습 데이터는 약 120만 장, 검증 데이터는 5만 장, 테스트 데이터는 15만 장으로 이루어져 있습니다.

 

ImageNet에서는 전통적으로 두개의 error rate를 사용합니다.

  1. top-1 error: (정답 label) == (가장 probable 한 label)
  2. top-5 error: (정답 label) in (상위 5 probable한 label)

 ImageNet은 여러 해상도의 이미지로 구성되어있습니다. model에는 일정한 차원의 입력이 들어가야 하기 때문에, 한 이미지에서 가로나 세로 중 작은 쪽을 256픽셀로 줄입니다. 그다음 256x256만큼 CenterCrop하여 모델의 입력으로 사용합니다. 각 픽셀을 Centerize하는 것 외에는 다른 전처리 과정을 하지 않습니다.


3. The Architecture

 위 사진은 network의 모습을 나타낸 것입니다. 5개의 conv layer와 3개의 fc layer로 총 8개의 layer로 구성되어 있습니다. 이번 장에서는 이 network에 사용된 여러 방법들을 중요한 순서대로 소개합니다.

3.1 ReLU Nonlinearity

 보통 뉴런의 출력은 tanh나 sigmoid를 거치곤 합니다. 그러나 이러한 활성 함수는 gradient descent 방법으로 학습할때 saturated되어 학습 속도를 매우 저하시킵니다. 이에 본 논문에서는 non-saturating nonlinearity로 ReLU를 사용합니다.

Rectified Linear Unit(ReLU)

아래 그래프를 보면 tanh를 사용했을 때 보다 ReLU를 사용했을 때 수렴 속도가 개선된 것을 확인할 수 있습니다.

ReLU(solid line) vs tanh(dashed line)

 다른 논문(Jarreet et al)에서는 nonlinearity로 |tanh(x)|를 사용하기도 했는데, 이 경우는 오버피팅을 예방하기 위해 사용하였고, 본 논문에서 집중하고자 하는 것은 수렴 속도를 가속하는 것이기 때문에 경우가 다르다고 합니다.

3.2 Training on Multiple GPUs

 하나의 GTX 580 GPU는 3GB밖에 메모리가 없기 때문에 본 논문에서는 하나의 network를 두개의 GPU에 나눠서 학습시켰습니다. GPU parallelization은 커널을 반으로 나누어 각각 하나의 GPU에 할당하는 건데, 추가로 두 GPU 간의 communication은 특정 layer에서만 발생하도록 했습니다. 그래서 layer 3에서는 layer 2의 모든 kernel map을 받아 올 수 있지만 layer 4는 같은 GPU의 입력만 받아오게 됩니다.

3.3 Local Response Normalization

 ReLU는 saturating을 방지하기 위한 input normalization이 필요하지 않다는 특징을 가집니다. 그러나 아래 Local Normalization이 일반화에 도움이 됩니다.

Local Response Normalization

a^i_(x,y)는 i번째 커널의 (x,y) 위치의 출력이 ReLU를 통과한 것입니다. sum은 n만큼의 인접한 커널에서 이루어집니다. 이러한 종류의 response normalization은 lateral inhibition을 구현한 형태라는데, 다른 커널에서 계산된 출력과 경쟁을 일으키는 것입니다. 아래 이미지는 lateral inhibition의 예인 헤르만 격자입니다.

상수 k,n,α,β은 hyper-parameter으로, 본 논문에서는 k=2, n=5, α=0.0001, β=0.75로 설정했습니다.

3.4 Overlapping Pooling

 CNN에서의 pooling layer는 같은 커널 맵에서의 이웃 뉴런들의 summary를 제공합니다. 보통, pooling layer는 overlap하지 않습니다. pooling layer의 커널 사이즈를 z, stride를 s라고 할 때, s=z이면 보통의 overlap하지 않는 pooling layer로 해석될 수 있습니다. 그러나 본 논문에서는 z=3, s=2로 하여 overlapping pooling을 구성했습니다. 그로 인해 overfitting이 덜 발생하게 되었습니다. 

3.5 Overall Architecture

 위에서 설명한 대로 network는 5개의 conv layer와 3개의 fully-connected layer로 구성되어있습니다. 2,4,5번째 conv layer들은 같은 GPU에서만 연결되도록 구성되어있습니다. 3번째 conv layer는 2번째 conv layer의 모든 커널 맵에 연결되어 있습니다. Response-normalization layer는 1번째와 2번째 conv layer 뒤에 위치합니다. Max-pooling layer는 1,2,5번째 conv layer뒤에 위치합니다. ReLU는 모든 conv layer와 fc layer뒤에 위치합니다.

 

 이번에는 각각의 layer를 하나하나 살펴보겠습니다.

  1. Conv layer1: 224x224x3의 입력 이미지를 11x11x3 크기의 stride가 4인 96개의 커널로 출력합니다.
  2. Conv layer2: conv layer1의 출력을 response-normalize, pooling을 거치고 5x5x48 크기의 256개의 커널로 출력합니다.
  3. Conv layer3: conv layer2의 출력을 response-normalize, pooling을 3x3x256 크기의 384개의 커널로 출력합니다.
  4. Conv layer4: conv layer3의 출력을 3x3x192 크기의 384개의 커널로 출력합니다.
  5. Conv layer5: conv layer4의 출력을 3x3x192 크기의 256개의 커널로 출력합니다.
  6. FC layer1: conv layer5의 출력을 pooling을 거치고 4096개로 출력합니다. 
  7. FC layer2: fc layer1의 출력을 4096개로 출력합니다.
  8. FC layer3: fc layer2의 출력을 1000개로 출력합니다.

4. Reducing Overfitting

 AlexNet의 매개변수의 개수는 6000만 개에 달한다고 합니다. 이에 본 논문에서는 오버피팅을 방지하기 위한 두 가지 방법을 소개합니다

4.1 Data Augmentation

 오버피팅을 줄이기 위한 가장 쉬운 방법은 데이터의 수를 증가시키는 것입니다. 본 논문에서는 두 가지의 augmentation을 데이터에 적용했습니다.

 

 첫번째는 2장에서 만들어진 256x256 이미지를 224x224 크기로 RandomResizedCrop하고 RandomHorizontalFlip을 적용시킨 것입니다. 그렇게 되면 하나의 이미지에서 2048장의 이미지를 얻을 수 있게 됩니다. 모델을 테스트할 때는 좌측 상단, 좌측 하단, 우측 상단, 우측 하단, 중앙의 5가지 위치에서 224x224 크기의 이미지를 얻고, RandomHorizontalFlip을 적용시켜 총 10가지의 이미지를 얻고 각각의 이미지로부터 얻은 softmax 값의 평균으로 최종 label을 결정합니다.

 

 두번째는 학습 이미지에서 RGB 채널의 강도(intensity)를 바꾼 것입니다. 특히 본 논문에서는 RGB 픽셀 값에 PCA를 적용했습니다.

위 값을 각각 RGB 이미지 픽셀에 더함

여기서 p_i와 λ_i는 3x3 RGB 픽셀의 covariance matrix의 i번째 eigenvector와 eigenvalue입니다. 그리고 α_i는 평균이 0이고 표준편차가 0.1인 가우시안에서 추출한 랜덤 변수입니다.

4.2 Dropout

 본 논문에서는 또한 Dropout을 적용하여 학습 시간을 매우 단축시켰습니다. Dropout이란 은닉층의 neuron에서 발생하는 출력을 0.5의 확률로 0으로 하는 것입니다. 0을 출력한 뉴런은 역전파에 참여하지 않습니다. 그래서 매번 입력에 따라 활성화되는 뉴런이 달라지고 이로 인해 뉴런 간의 복잡한 co-adaptation을 줄이게 됩니다. 그래서 여러 뉴런 간의 조합에서도 확실한 특징만을 학습하게 됩니다. 테스트 단계에서는 모든 뉴런의 출력을 사용하지만 0.5를 곱한 값을 사용합니다. AlexNet에서는 처음 두 fc layer뒤에 dropout을 적용했습니다.


5. Details of learning

 이번 장에서는 학습에 관련된 여러 hyper-parameter와 weight 및 bias 초기화 방법 등이 소개되었습니다.

  • Optimizer: Stochastic Gradient Descent
  • Batch size: 128
  • Momentum: 0.9
  • Weight decay: 0.0005
  • Weight initialization: Gaussian distribution of μ=0, σ=0.01
  • Bias initialization: 2nd, 4th, 5th conv layers, fc layers -> 1 / 1st, 3rd conv layers -> 0
  • Initial learning rate: 0.01
  • Epochs: roughly 90

 학습의 사용된 momentum은 규제항 뿐만 아니라 모델의 training error를 줄이는 데도 사용되었습니다. 아래 식에 의해서 weight가 갱신됩니다.

The update rule for weight w

 

Bias를 1로 초기화 한 layer는 ReLU에 양수가 들어가게 하여 학습을 가속시키기 위함입니다.

learning rate는 모든 layer에 대해 공통적으로 적용되나, 현재 learning rate에서 validation error가 개선되지 않는다면 현재 lr에 10을 나눠주었습니다. 그 결과 학습 종료까지 3번 감소했습니다. 

 


 본 논문의 구현은 GitHub에서 확인할 수 있습니다.

References

[1] https://papers.nips.cc/paper/2012/hash/c399862d3b9d6b76c8436e924a68c45b-Abstract.html

[2] https://deep-learning-study.tistory.com/376

[3] https://en.wikipedia.org/wiki/Lateral_inhibition

댓글