산 넘어 산 개발일지

[논문 리뷰] AlexNet(2012) 요약 및 리뷰 본문

논문 리뷰/CV

[논문 리뷰] AlexNet(2012) 요약 및 리뷰

Mountain96 2021. 8. 5. 14:56

서론

배경

  객체탐지를 위해서는 많은 데이터셋, 더 강력한 모델, overfitting을 피하기 위한 발달된 기법이 필요하다. 이 중 데이터셋의 경우 기존에는 적은 양의 데이터셋에만 접근이 가능했지만(2012 기준)했다. 그 중에서도 CIFAR, MNIST와 같은 데이터셋은 현재 인간 수준의 정확성을 달성했지만, 이정도의 사이즈는 현실 세계에서 볼 수 있는 변동성 있는 풍경에 적용하기는 힘들다. 그러나 최근에는 LabelMe, ImageNet과 같은 방대한 데이터셋이 제공되었다. 또한, 강력한 GPU가 등장하면서 CNN을 이미지에 사용하는 것이 가능해졌다.

CNN의 사용

  그러나 수천 수만 가지의 객체들을 이미지들로부터 배우기 위해서는 객체탐지에서 비롯되는 엄청난 복잡성을 해결해야 하는데, 이를 위해서는 방대한 양의 데이터셋만으로는 부족하다. 이에 더해, 이미 보유하고 있는 데이터 뿐만 아니라 우리에게 없는 데이터에 대해서도 적용하기 위해서는 우리의 모델이 방대한 양의 사전지식도 갖추고 있어야 한다. 이를 해결하기 위한 모델 중 하나가 Convolutional Neural Network(CNNs)이다. 

  CNN은 depth(깊이)와 breadth(너비)에 변동을 줌으로써 모델의 크기(capacity)를 조절할 수 있고, 이미지의 본질(nature of images)에 대해서 강력한 추측을 할 수 있다. (CNN의 두 특징 'Stationarity of Statistics'과 'Locality of pixel Dependencies') 이 때문에 일반적인 feedforward neural network보다 CNN이 더 적은 연결과 파라미터가 있고, 결국 훈련하기 더 쉬운 것이다. 그러면서 이론상 최대 성능은 feedforward neural network보다 아주 약간만 떨어진다.

  AlexNet은 5개의 Convolutional Layer와 3개의 FC Layer로 구성되었으며, 이 Convolutional Layer 중 하나라도 제거하면 성능이 저하된다고 기술하고 있다.

환경

  •   GTX 580 3GB 2개

데이터셋

  • ImageNet : 22,000 카테고리에 대한 1500만 개의 이미지를 제공함. 여기서 매년 개최되는 ImageNet Large-Scale Visual Recognition Challeng(ILSVRC)에서 사용하는 데이터셋을 사용. 이 대회는 1000개의 카테고리에 대해 각각 약 1000장의 이미지를 제공함. 그래서 총 120만개의 Training set, 50,000개의 Validation set, 150,000개의 Test set이 제공됨.
  • ImageNet에서 제공되는 이미지는 크기가 다양한 반면, AlexNet은 256x256으로 고정된 크기의 이미지를 필요로 한다. 그렇기 때문에 이미지들을 downscale해줬는데, 먼저 이미지의 짧은 부분을 기준으로 짧은 부분이 256이 되도록 rescale해주고, 256x256사이즈에 맞게 중앙에서 잘라냈다. 이후, Training set에서 zero-centered를 맞춰주기 위해 [각 픽셀]에 [전체 픽셀의 평균] 을 빼주는것 빼고는 별다른 전처리 과정을 거치지 않았다.

본론

데이터 구조

  AlexNet에서 기존의 일반적인 구조에는 없었던 특이한 특성들을 나열했는데, 이는 중요도가 높은 순으로 나열되어 있다.

1. ReLU Nonlinearity

  기존에는 일반적인 활성함수(Activation Function)로 tanh와 sigmoid가 주로 사용되었다. 그러나 AlexNet에서는 방대한 데이터와 깊은 네트워크 구조 때문에 빠르게 학습할 수 있는 능력이 요구된다. 이를 해결하기 위해 ReLU를 사용했는데, ReLU는 tanh에 비해 약 6배 정도 더 빠르게 수렴한다는걸 간단한 실험을 통해 보여준다.

  물론 이런 새로운 활성함수를 고려한게 AlexNet이 처음은 아니다. 기존에도 f(x) = |tanh(x)| 와같은 식이 고안되었으며 이것이 Caltech-101 데이터셋에서 오버피팅을 방지하며 잘 작동한다는 논문이 있었다.(Jarrett et al.) 그러나 AlexNet에서는 오버피팅 방지가 아니라 빠른 학습을 요구하기 때문에 ReLU를 사용하였다.

ReLU : solid line, tanh : dahed line

2. Training on Multiple GPUs

  GPU 하나의 메모리가 3GB로 너무 작기 때문에 두 개를 병행하여 사용하였다. 당시 GPU도 서로 다른 GPU의 메모리에 직접 읽고 쓰기가 가능했기 때문에 cross-GPU parallelization에 용이했다. 여기서 적용한 병렬화 전략은 커널(혹은 뉴런)의 절반만큼 각각의 GPU가 담당하게 하는 것이다. 그리고 특정 layer에서만 GPU가 서로 상호작용한다. 만약 이 특정 layer가 layer2이라면 이를 input으로 받는 layer3에서의 뉴런들은 layer2의 모든 kernel map(feature map일 것으로 추정)들로부터 입력을 받는다. 그러나 layer4의 뉴런들은 layer3에서 자신의 GPU에 할당된 부분에서만 kernel map을 입력으로 받는다. 이 상호작용의 패턴을 알아내는 것은 문제가 될 수 있지만, 이를 통해 전체 상호작용의 횟수(?)를 설정할 수 있고, 더 나아가 원하는 연산을 할 때까지 조절할 수 있다.

  두 개의 GPU를 사용하는 기법으 error rate를 top-1에서는 1.7%, top-5에서는 1.2가량 줄였으며, 속도도 하나만 사용하는 것보다 조금 더 빨랐다.

3. Local Response Normlization

  ReLU를 사용하면 별다른 normalization 없이도 saturating을 막을 수 있다. 그러나 ReLU의 특성 상 한 뉴런의 값이 너무 커질 경우 주변의 다른 뉴런들에게 영향을 끼칠 수 있다.(측면 억제(lateral inhibition) : 한 영역에 있는 신경세포가 서로 연결되어 있을 때 자신의 축색이나 자신과 이웃한 신경세포를 매개하는 중간신경세포를 통해 이웃에 있는 신경세포를 억제하려는 경향) 이를 완화하고자 LRN이 나온 것이다.(현재는 잘 쓰이지 않고, 대신 Batch Normalization이 주로 쓰인다) 

  • a^i_x, y : (x,y)에 위치한 픽셀(뉴런)에 i번째 kernel을 적용하고 ReLU를 사용했을 때 나온 activation value.
  • n : 인접하다고 고려할 뉴런의 개수(하이퍼파라미터). n에 따라 j의 범위가 늘어나고 줄어든다.
  • N : 레이어 안에 존재하는 kernel 총 개수

  이 식을 통해 activation의 결과값을 어느정도 완화할 수 있다.  쉽게 말하면 인접한 픽셀(뉴런)끼리 정규화를 해주는 셈이다. AlexNet에서는 k=2, n=5, 알파=1e-4, 베타=0.75를 사용하였다. LRN을 사용하여 top-1의 error rate은 1.4%, top-5의 error-rate은 1.2%만큼 줄었다고 한다.

4. Overlapping Pooling

  일반적으로 CNN에서 Pooling이라 하면 필터가 겹치지 않고 적용된다. 다시 말하자면, stride=pool_size가 되는 것이다. 그러나 AlexNet에서는 이 필터가 겹치도록 설계를 했다. stride=2, pool_size=3으로 설정하여 겹치는 뉴런을 발생시켰고, 그 결과로 top-1 error rate와 top-5 error rate가 각각 0.4%, 0.3% 줄었다고 한다. 저자들은 이 overlapping pooling이 overfit되기 조금 더 어렵게 만든다고 관찰했다고 한다.

5. 모델 구성

  앞서 설명했듯이, 네트워크는 총 8개의 레이어로 구성되어 있으며, 그 중 5개가 Convolutional Layer이고 3개가 FC Layer이다. FC Layer의 마지막 부분은 softmax함수를 사용하여 1000개의 output을 출력한다

  2, 4, 5번째 Convolutional Layer는 이전 레이어에서 같은 GPU에 존재하는 Kernel map에서만 input을 받아들인다. 3 번째 Convolutional Layer에서는 모든 kernel map들로부터 input을 받아들인다. FC Layer의 각 뉴런들은 이전 레이어의 모든 뉴런들과 연결되어 있다.

  이 때, Response-Normlization layer(LRN)이 첫 번째와 두 번째 Layer 다음에 연결되어 있고, Max Pooling Layer도 이 LRN layer다음에 붙어 있다. 또한 Max Pooling Layer는 여기에 더해서 5번째 layer에도 붙어있다. Convolutional Layer와 Fc Layer 모두 ReLU 활성화함수를 사용한다.

  첫 번째 레이어는 224x224x3 이지미를 입력받으며 이를 11x11x3의 96개의 kernel(filter)과 4-stride로 연산한다.  두 번째 레이어는 첫 번째 레이어의 출력결과가 LRN과 MaxPooling을 거쳐 나온 결과물을 입력으로 받으며, 5x5x48 크기의 256개의 필터가 이를 연산한다. 나머지 3, 4, 5번째 Layer들은 서로간에 연결될 때(3->4, 4->5) 특별한 pooling이나 normalization이 사용되지 않았다. 3번째 Layer는 이전 레이어의 출력 결과가 LRN과 MaxPooling을 거친 결과물을 입력으로 받고 3x3x256크기의 384개의 필터가 연산한다. 4번째 Layer는 3x3x192크기의 필터 384개가 연산하며, 5번째 Layer는 3x3x192 크기의 필터 256개가 연산한다. 마지막으로 FC Layer들은 모두 4096개의 뉴런으로 구성되어 있다.

  정리하자면 다음과 같다.

1st layer(Conv)

  - input : 224x224x3

  - filter : 11x11x3. 96개. 4-stride

  - activation : ReLU + LRN + MaxPooling

2nd layer(Conv)

  - filter : 5x5x48. 256개

  - activation : ReLU + LRN + MaxPooling

3rd layer(Conv)

  - filter : 3x3x256. 384개

  - activation : ReLU

  - 유일하게 이전 layer에서 모든 kernel map들과 연결굄

4th layer(Conv)

  - filter : 3x3x192. 384개

  - activation : ReLU

5th layer(Conv)

  - filter : 3x3x192. 256개

  - activation : ReLU

6th layer(FC)

  - Neurons : 4096

  - activation: ReLU

7th layer(FC)

  - Neurons : 4096

  - activation : ReLU

8th layer(FC)

  - Neurons : 1000

  - activation : Softmax

Overfitting 관리

1. Data Augmentation

  Overfitting을 피하기 위한 가장 일반적인 방법 중 하나이다. 이미지를 변형한 뒤 이를 따로 저장하지는 않는다. 이 이미지 변형은 GPU에서 이전 배치에 대한 학습을 진행중일 때, CPU에서 다음 training set 준비를 위해서 진행한다. 이 때문에 효율적이라고 한다.

  첫 번째 변형은 "이동"과 "좌우반전"이다. 이동은 256x256 사이즈의 이미지에서 랜덤으로 224x224 크기의 patch를 잘라낸다. 이런 증강 기법을 사용하지 않으면 overfit에 시달려서 결국 깊은 네트워크를 사용하지 못했을 것이라고 한다. test시에는 224 x 224 patch들을 총 5개(좌상단, 우상단, 우하단, 좌하단 꼭지점에 붙인 4개의 patch와 가운데 patch 1개)와 이를 horiozntal flip하여 총 10개의 patch를 뽑아낸다. 그리고 각 패치들에 대해서 네트워크의 softmax결과를 평균화하여 prediction을 진행한다.

  두 번째 방법은 PCA를 사용한다. 이미지의 각 RGB 픽셀에 PCA를 적용하여 평균=0, 표준편차=0.1을 갖는 랜덤 변수를 곱한 뒤 기존 픽셀에 더해준다. 사실 이부분은 고유벡터와 고유값에 대한 개념이 나와서 정확히 이해하지 못했다. 선형대수를 조금 더 공부하면서 고유벡터와 고유값을 알아볼 필요가 있을 것 같다. 

2. Dropout

  기존에는 여러 모델을 훈련시킨 뒤 이들을 종합하여 예측하는 앙상블 기법이 널리 사용되었으나, 네트워크가 깊고 훈련하는데 몇일이 걸리기 때문에 이 앙상블 기법을 사용하기 어려웠다. 대신, 당시 최신 테크닉인 Dropout을 적용하였는데, 이는 각 뉴런들의 출력결과를 0.5의 확률로 0으로 만드는 것이다. 이렇게 할 경우 0이 된 뉴런은 forward pass시나 backpropagation시에 전혀 기여하지 않는다. Dropout은 뉴런간의 상호의존성을 없애므로 모델이 더 robust해진다. Test시에는 모든 뉴런들을 사용하지만 각각 0.5를 곱해준다. 

  AlexNet에서는 처음 두 개의 FC Layer에 적용하였고, Dropout없이는 Overfitting에 시달렸다고 한다. 그러나 Dropout은 수렴하기 위해 필요한 iteration 수를 약 2배 증가시킨다.

학습 세부사항

사용한 optimizer : Stochastic Gradient Descent(SGD) + momentum(0.9)

배치 사이즈 : 128

weight decay : 0.0005

 

이 방식으로 W를 업데이트하며, 이 때 i는 iteration, v는 momentum 변수, e는 learning rate이다. 마지막 <dl/dw>식은 i번재 batch에서 W_i를 사용하여 구한 gradient들의 평균이다.

  초기화 방법으로는 표준편차=0.01이 적용된 zero-mean Gaussian distribution을 각 layer에 적용했다. 2, 4, 5번째 convolutional layer와 앞의 두 FC layer에는 neuron bias로 1을 설정했다. 이렇게 bias를 1로 주면 ReLU에 positive input을 주는 효과가 있기 때문에 초기 학습을 더 가속화시키는 효과가 있다고 한다. 나머지 layer들의 bias는 0으로 설정했다.

  Learning rate은 validation error가 현재의 learning rate에서 더이상 감소하지 않을 경우 1/10만큼 감소시켰다. 초기 learning rate은 0.01이였으며, 학습이 끝날 때까지 총 3번 감소하여 최종적인 learning rate은 0.00001이였다.

  훈련횟수는 약 90cycle(epochs)였다.


결론

실험 결과

  ILSVRC-2010 대회 때의 모델들과 CNN을 사용한 AlexNet을 비교한 결과이다. sparse coding은 6개의 sparse-coding model들로부터 나온 predict 결과를 평균하여 예측하는 방식이다. SIFT + FVs 는 Fisher Vectors(FVs)로부터 훈련된 두 개의 분류기로 predict한 것들의 평균으로 예측하는 방식이다.

  이는 ILSVRC-2012 대회 때 AlexNet(CNN)을 적용한 결과인데, Validation set과 Test set을 predict 했을 때 정확도 차이가 0.1%이하로 발생했기 때문에 크게 의미가 없다고 판단하여 두 지표를 같이 사용하고 비교했다고 한다.  1 CNN은 CNN모델을 하나 썼을 경우이고, 5 CNN은 5개의 CNN모델을 사용하고 그 평균을 사용하여 예측했을 때의 결과이다. 그 밑의 1 CNN*은 하나의 CNN모델에 추가로 6개의 convolutional layer를 붙인 모델이다. 이 경우, 바로 ILSVRC-2012를 훈련하지 않고, ImageNet Fall 2011데이터(1500만개의 이미지, 22000개의 카테고리)로 훈련을 한 뒤, ILSVRC-2012로 fine-tuning한 결과이다. 밑의 7 CNNs*는 1 CNN* 7개의 모델을 돌려 그 평균을 사용하여 예측한 결과일 것이다.

Qualitative Evaluations

이는 첫 번째 레이어에서 나타난 feature map인데, 위 3줄은 첫 번째 GPU에서, 아래 3줄은 두 번째 GPU에서 나타나는 모습이다. 첫 번째 GPU에서는 color가 거의 인코딩되어 있지 않지만, 두 번째 GPU에서는 color가 인코딩되어 있는 모습을 볼 수 있다.

  좌측 사진은 이미지와 그 밑에 정답 레이블이 표시되어 있고, 그 밑에는 모델이 예측한 top-5 label이 그래프로 주어진다. 그 중 빨간 그래프가 정답 레이블에 해당하는 그래프이다. 이를 보면 물체가 꼭 중앙에 있지 않더라도, 다시 말하면 위치에 상관없이 분류를 잘 해내는 것을 알 수 있다. 또한, 오분류한 대표적인 예시 중 grille과 cherry는 사람이 보기에도 애매한 구석이 있다.

  모델의 visual knowledge를 보다 더 깊이 관찰하기 위해 마지막 FC layer들의 4096-dimensional layer의 feature activation을 살펴보았다. 좌측 사진은 가장 왼쪽의 column이 test set에서 뽑은 것들이고, 나머지는 train set에서 뽑은 이미지들이다. 여기서 test set에서 뽑은 사진들을 각각 모델에 넣고, 4096-layer에서의 feature activation을 기준으로 가장 근사한 것들을 뽑은 것이다(근사한 기준은 L2 사용). 보면 픽셀 단위로는 test set과 train set이 전혀 다르지만(색이나 포즈라던가), 그럼에도 불구하고 같은 부류라고 판단하는 것을 볼 수 있다. 이를 통해 단순히 픽셀이 아닌, 더 고차원적인 근거로 분류한다는 것을 알 수 있다.

Discussion

  저자는 크고 깊은 CNN이 방대한 데이터셋을 분류하는데 있어서 비지도 학습만으로 뛰어난 성과를 보였으며, convolutional layer 중 하나라도 없앨 경우 성능이 크게 떨어진다는 것을 이유로 모델의 깊이가 그만큼 중요하다고 강조하고 있다.

  또한 학습 이전에 비지도학습으로 미리 학습을 했더라면(unsupervised pre-training) 성능이 더 좋았을 것이라고 가정하고 있다. 또한 충분한 컴퓨팅 파워가 있다면 네트워크의 사이즈(깊이)를 더 늘림으로써 더욱 뛰어난 성능을 발휘할 것이라고 한다. 궁극적으로는, 굉장히 크고 깊은 네트워크를 개발하여 이를 영상에 사용함으로써 정적인 이미지에서는 볼 수 없는 다양한 요소들을 분류에 사용할 수 있기를 기대한다고 한다.


리뷰

  처음으로 논문을 처음부터 끝까지 찬찬히 읽고 요약을 해봤다. AlexNet은 Deep Neural Network를 사용하여 성공한 첫 사례라는 점에서 큰 의미를 지닌다. CNN을 사용했다는 점도 놀랍다. 아마 당시에는 데이터셋이 방대해지면 모델들의 성능이 높아질 것이라고 기다리는 성향이 많았을(?) 것 같다. 그러나 AlexNet의 저자들은 모델을 더 깊게 만들어서 한계를 극복하고자 했다. 모델을 깊게 만드는 것은 일부 사람들도 한 번쯤 생각해 봤을 법하지만, 소모되는 훈련 시간과 Overfit문제 때문에 좌절했을 것 같다. 여기서는 GPU의 한계를 병렬로 처리함으로써 해결했다는 점, 그리고 Overfit 문제도 Dropout, Data Augmentation으로 해결했다는 점이 특별할 것 같다.(물론 지금은 너무나도 일반적인 방법들이다) 또 한편으로는 Dropout이 이 때 고안되지 않았으면 이를 어떻게 해결했을지도 궁금하다. 

  모델 측면에서 보자면 CNN을 사용하면서 LRN을 사용했다는 점이 놀랍다. LRN은 인체학적 지식에서 영감을 얻어 만들었을 것 같은데, 아무래도 AI는 인간을 모방하는 것이다 보니, 인체학적 지식을 접목시킴으로써 큰 발전을 할 수 있지 않을까 싶다. 이 LRN으로 ReLU의 단점을 어느 정도 극복했고, CNN이 하나라도 줄어들면 정확도가 떨어진다는 점에서 모델의 깊이도 중요하다는 점을 증명했다. 하나 궁금한건, 만약 5개가 아니라 6개, 7개의 CNN을 사용했다면 어떤 효과가 있었을지, 성능이 더 좋아졌을지 아니면 지나치게 overfitting됐을지가 궁금하다. Convolutional Layer을 5개 사용했을 때 효과를 봤다면 6, 7개도 사용해봤을 법 한데 왜 이 부분은 기술이 안되어있는지도 조금은 의아하다. 또한, 마지막 결과를 낼 때 앙상블 기법으로 성능을 조금 더 끌어올리는 것도 인상깊었다. 시간이 조금 걸리더라도 보다 나은 성능을 위해 앙상블은 꼭 필요한 기법인 것 같다.(캐글에서도 자주 쓰인다고 하니까..)

  그리고 마지막으로 궁금한 건 optimizer부분이다. SGD를 썼다고 했으나 momentum을 사용한 것으로 보아 순수한 SGD난 아닐 것이다. Momentum 기법을 쓴 것이 아닌가? 근데 간혹 다른 리뷰들에서 SGD를 사용했다고만 기술한 것을 봤기 때문에 내가 무언갈 놓치고 있거나 이해를 잘못 한건 아닌가 싶다. 또한 CNN의 두 가지 큰 특징 'Stationarity of Statistics'과 'Locality of pixel Dependencies'이 궁금한데 이것도 이해해놓으면 좋을 것 같다.


Reference

https://papers.nips.cc/paper/2012/file/c399862d3b9d6b76c8436e924a68c45b-Paper.pdf

Comments