Logical Scribbles
[논문 리뷰] ImageNet Classification with Deep Convolutional Neural Networks(AlexNet) 본문
[논문 리뷰] ImageNet Classification with Deep Convolutional Neural Networks(AlexNet)
KimJake 2023. 11. 15. 19:14이번 포스팅은 AlexNet에 대한 논문이다. 논문 제목은 'ImageNet Classification with Deep Convolutional Neural Networks ' 이고, AlexNet은 VGG를 소개한 포스팅에서 말했듯 세상에 딥러닝의 시대가 도래했음을 알린 모델이기도 하다. 또한 2012년 ILSVRC (ImageNet Large Scale Visual Recognition Challenge)의 우승자이다.
AlexNet은 LeNet-5 등장 이후 약 10년 뒤에 나온 모델이며, 해당 연도 이미지넷 대회에서 경쟁팀 대비 정확도가 약 10% 정도 앞서있는 모델이었다.
이 모델이 AlexNet이라고 이름 붙여진 이유는 Alex Krizhevsky 라는 이름을 가진 딥러닝 대가 제프리 힌튼 교수님의 제자분께서 고안하게 된 모델이기 때문이다.
이제 이 AlexNet의 논문을 읽으며 구조와 특징에 대해 알아보도록 하자.
1. 시대 배경
논문이 쓰여진 시대 이전의 labeled 이미지 데이터의 양은 그리 많지 않았다. 간단한 recognition task는 이러한 적은 데이터의 이미지를 이용하여도 잘 작동하지만(특히 이미지 데이터가 증강 되면 더 잘 작동할 것이다.), 실제 세계에서 물체는 너무나 다양하다. 즉 MNIST와 같은 10진수 이미지를 구별하는 것은 실제 세계에서 마주하는 이미지들과 어느정도 괴리가 있다는 것이다. 그러다가 논문이 쓰여진 2012년 즈음, 엄청난 양의 labeled 이미지 데이터를 모으는 것이 가능해졌다. 대표적인 거대 이미지 데이터셋이 ImageNet이다.
따라서 엄청난 양의 이미지 데이터의 물체에 대해 학습하기 위해서는 많은 양을 학습할 수 있는 모델이 필요했다. 하지만 이러한 다양한 물체의 인식은 엄청난 task이기 때문에, 그들이 원하는 모델은 많은 사전지식이 필요했다. CNN은 실제 세계에서의 이미지를 정답에 가깝게 구별할 수 있는 능력이 있다. CNN은 더 적은 connection과 parameter을 가지고 있어 학습시키기 더 쉽다는 특징이 있다.
CNN의 이러한 장점에도 불구하고 고해상도의 다양한 이미지에 이를 적용하는 것에는 무리가 있었다. 하지만 그 때 당시의 GPU는 large CNN을 학습시키기에 용이했다. AlexNet의 개발에 사용된 GPU는 GTX580로, 3GB 메모리만 가지고 있기 때문에 한 개에 GPU에서 NN을 학습시키에는 한계가 있었고, 따라서 개발자들은 AlexNet을 두 개의 GPU로 학습 시킬 수 있 는 구조로 설계했다.
2. 데이터 전처리
ImageNet 데이터셋을 사용하였다. ImageNet의 데이터 중 1000개의 카테고리 이미지를 사용한다. 총 training 이미지는 약 1,200,000개고, validation 이미지는 50,000개다.
이미지넷 데이터셋은 각기 다른 사이즈의 이미지들로 구성 되어있다. 따라서 연구진은 이미지를 먼저 256*256으로 resizing 한 뒤, 227*227 사이즈로 random crop 하였다. horizontal reflection도 적용하였는데, 이 과정을 통해 1개의 이미지에 대해 2048개의 이미지를 얻을 수 있었다고 한다.
또한 그들은 이미지에서 RGB채널 값을 변화시키는 방법을 사용했다. 원본 이미지에 대해 주성분 분석(PCA)를 적용하였으며, 평균 0, 표준편자 0.1을 갖는 가우시안 랜덤 변수를 곱하고 그 결과를 원본 이미지에 더해주는 방식으로 RGB 채널의 값을 바꾸어 데이터의 수를 늘렸다고 한다.
이 두가지 방법은 데이터의 수를 늘려 Overfitting을 방지하는 효과를 갖는다.
3. 구조
AlexNet의 전체적인 구조를 살펴보기 앞서 AlexNet의 구조가 갖는 특징들에 대해 먼저 알아보도록 하자. 이는 학습에 매우 중요한 영향을 미친다고 한다.
3-1. ReLU Nonlinearity
이때 당시의 standard activation 함수는 tanh와 sigmoid였다고 한다. 이 활성 함수로 Gradient Descent 방식의 학습을 진행할 때, 학습이 느려지는 상황이 발생한다고 한다. (gradient vanishing을 말하는 듯 하다.) 따라서 저자는 ReLU를 사용하여 이를 방지하고자 했다.
위 그림은 논문에서 제시된 그래프인데, 실선은 ReLU를 사용하였을 때의 error rate이다. 25% error rate에 더 적은 Epoch로 도달하는 것을 볼 수 있다.
3-1. Multiple GPUs
앞서 말했듯 이 논문에서는 GTX 580을 이용하여 실험을 진행하였는데, 3GB의 메모리 용량으로는 Network를 학습시키기에 충분하지 않았다고 한다. 따라서 저자는 Network를 두개의 경로로 나누어, 각 경로마다 1개의 GPU를 할당해 주었다. 이후에 AlexNet의 전체적인 구조에 대해서 살펴보겠지만, 이 두개의 GPU로 학습되는 Network를 중간중간 한번씩 공유되게끔 해주어서 학습을 진행하였다.
3-2. Local Response Nomalization
ReLU를 이용한 Network는 saturating이 일어나지 않아 nomalization이 필요없지만, 저자는 특정한 local nomalization이 generalization에 도움이 됨을 발견했다. 이 local nomalization 방법을 Local Response Nomalization이라고 한다.
위의 식이 Local Response Nomalization을 위한 식이다. Notation을 정리해보면 다음과 같다.
- ax,yi : kernsl의 i번째 channel에 있는 (x, y)점에서 값
- N : Total kernel의 수
- bx,yi : LRN을 적용한 결과 값
- k,n,α,β : normalization을 위한 hyperparameter
AlexNet 발표한 논문에서는 hyper-parameter를 k=2,n=5,α=10−4,β=0.75값으로 사용했다고 한다. 특정한 layer에 대해 ReLU 함수를 통과한 인풋에 대해 이 local response nomalization을 진행한다.
3-3. Overlapping Pooling
CNN의 pooling layer는 같은 커널 map에 있는 뉴련의 아웃풋에 대한 summary로 볼 수 있다. 전통적으로 pooling 과정은 non-overlapping하게 적용해 왔었다. 즉, 6*6 사이즈의 이미지에 대해 3*3 사이즈의 pooling을 진행한다고 가정하면 stride를 3으로 적용하여 학습시켜왔던 것이다. 만약 stride의 값이 1이나 2면 어떻게 될까? overlapping pooling이 적용되는 것이다. 저자는 이 overlapping pooling이 학습에 더 효과적임을 알아내었다. 연구진은 3*3 커널에 stride = 2로 pooling을 진행하였다.
3-3. 전체적인 구조
위의 두 사진을 잘 보고 따라오면 되겠다. 참고로 논문의 그림에 인풋 데이터의 사이즈가 224*224로 나와있는데, 이는 틀렸다. 227*227사이즈의 인풋 데이터가 들어간다고 생각해야 한다.
전체적인 구조로 5개의 Convlayer와 3개의 FC layer를 포함하고 있다. FC layer의 마지막 아웃풋은 1000개의 값을 내놓으며, 이것이 최종적으로 Softmax 함수를 통과한다. (이미지 데이터셋의 class가 1000종류이기 떄문이다.)
위의 Convlayer에서 2, 4, 5번째 레이어는 바로 이전의 각각의 GPU에서 연산된 아웃풋을 그대로 사용하는 반면, 3번째 레이어에서는 GPU간의 communication을 통해 이전 layer에서 연산된 2개의 GPU 결과를 모두 받아오도록 만든 것을 확인할 수 있다. (3번째 레이어에서 점선이 교차되어있다.)
FC layer들은 이전 layer의 뉴런을 모두 교차하여 연결되었고, 앞서 설명한 Response Normalization은 Convlayer의 1번째와 2번째 layer에서만 사용되었다. Overlapping Pooling을 진행하는 Max pool과정은 Conv layer의 1번째, 2번째 그리고 마지막인 5번째 layer에서 사용되었다. Activation Function으로 사용된 ReLU는 모든 과정에서 사용되었다.
첫번째 Conv layer에서의 padding은 0이지만, 두번째 Conv layer의 패딩은 2 , 나머지 Conv layer의 패딩은 1로 설정한다.
4. 오버피팅 방지
앞서 데이터 전처리 과정에서의 오버피팅 방지 이외에 한가지 방식을 통해 오버피팅을 추가적으로 방지하였다.
다양한 모델의 예측을 합치는 방식은 효과적이나, 비용과 시간이 너무 많이 소모된다. 따라서 50%의 확률로 뉴런의 작동을 꺼버리고, 뉴런이 역전파 과정에 참여하지 않게 하는 'Dropout'을 사용하였다. 새로운 인풋 데이터가 주어질 때 마다 Network는 다른 구조를 가질 것이고 (학습에 참여하지 않는 뉴런이 50%의 확률로 생기기 때문), 하지만 뉴런들의 가중치는 모두 공유되기 때문에 모델이 더욱 robust 해지는 효과가 있다.
테스트 과정에서는 모든 뉴런을 사용하지만, 각 뉴런의 아웃풋에 0.5를 곱하여 진행하였다.
5. 세부 사항
- SGD를 사용하였다.
- Batch Size = 128
- momentum = 0.9
- weight decay = 0.0005
- 각 layer의 가중치를 평균 0, 표준 편차가 0.01인 가우시안 분포를 따르게 했고 2,4,5번째 Conv layer와 모든 FC layer에 bias를 초기치 1로 설정했다. 나머지 layer은 0으로 설정했다.
- 초기 Learning rate = 0.01 (VGG와 마찬가지로 error 감소가 정체될 때마다 1/10을 곱하였다.)
6. 추가 사항
GPU 1의 커널은 색(RGB) 정보에 민감하지 않게, GPU 2의 커널은 색 정보에 민감하게 설정하였다고 한다.
AlexNet 끝!