ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [AlexNet] ImageNet Classification with Deep Convolutional Neural Networks (2012)
    Deep learning/Research papers 2019. 9. 14. 20:56

    https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf

    저자: Alex Krizhevsky, Ilya Sutskever, Geoffrey E. Hinton

    1. Introduction

    사물 인식 (object recognition) 문제에서 머신러닝이 사용된다. 최근까지의 데이터셋은 크기가 작았다. MNIST 같은 과제에서는 만개 정도의 데이터셋도 훌륭한 성능을 낼 수 있지만, 사물인식에서는 훨씬 큰 데이터셋이 필요하다. 백만 단위 이상의 데이터셋은 최근에서야 등장했다.

    백만개 이상의 이미지에서 천개 이상의 사물을 인식하려면 모델의 학습 용량 (learning capacity)이 더 커야 한다. 사물 인식에서는 백만 단위 데이터셋으로도 데이터가 가진 복잡도를 표현하기에 부족하기 때문에, 모델이 선행 지식 (prior knowledge)을 반영해서 이러한 부족함을 보충해야 한다.

    CNN이 이런 모델이 될 수 있다. fully-connected layer 에 비해서 CNN은 훨씬 적은 parameter로도 좋은 성능을 낼 수 있다. 하지만 여전히 높은 해상도의 이미지를 학습하기는 힘들다. 다행히 현대 GPU가 이런 문제를 보완해줄 수 있다.

     

    2. The Dataset

    ImageNet 데이터셋은 2만 2천개의 카테고리에서 천 오백만개의 태깅된 (labeled) 높은 해상도 이미지로 이루어져 있다. ILSVRC (ImageNet Large-Scale Visual Recognition Challenge) 은 이중 일부인 1000개 카테고리의 이미지만으로 이루어져 있다. 대략 백 이십만개의 training, 5만개의 validation, 십오만개의 test 이미지로 구성된다. ImageNet의 이미지들은 해상도가 다양하기 때문에, 논문의 모델에서는 256 * 256 으로 해상도를 낮춰서 통일했다.

     

    3. The Architecture

    논문의 network는 위의 그림과 같다. 총 8개의 layer - 5개의 convolution, 3개의 fully-connected layer로 구성되어 있다.

     

    3.1 ReLU Nonlinearity

    보통은 tanh를 사용하지만, ReLU가 경사 하강 (gradient descent) 에서 더 빠르다. 25% training error에 도달하는데 훨씬 적은 반복 (iteration) 만 필요하다.

     

    3.2 Training on Multiple GPUs

    학습에 사용된 GPU는 GTX580 3GB 이다. 이 GPU로는 백 이십 만개의 training 데이터를 감당할 수 없어서 2개의 GPU로 나누었다. 한 개의 GPU만으로 kernel 수를 반으로 줄여서 학습할 때와 비교해서, 2개의 GPU를 사용한 것이 top-1, top-5 error 에서 각각 1.7%, 1.2% 에러를 줄였다.

     

    3.3 Local Response Normalization

    ReLU는 input을 normalization을 하지 않아도 된다는 장점이 있다. 그럼에도 불구하고, 국지적 (local) normalization이 일반화(?)에 도움이 되는 것으로 보인다.

    ReLU를 적용하고 난 후에 아래와 같이 normalization을 실행한다.

    \[b^{i}_{x,y}=a^{i}_{x,y}/(k+\alpha\sum_{min(N-1,i+n/2)}^{j=max(0,i-n/2)}(a^{j}_{x,y})^2)^{\beta}\]

    \(a\): ReLU의 결과값

    \(i\): i번째 kernal

    \(n\): normalize를 실행할 주변 (adjacent) kernel 의 개수

    \(N\): 전체 kernel 수

     

    \(k,n,\alpha,\beta\)는 hyper-parameter다. 이 논문에서는 \(k=2, n=5,\alpha=10^{-4}, \beta=0.75\)를 적용했다.

    이러한 normalization 과정은 실제 neuron들에서 발견되는 측면 억제 (lateral inhibition - 다른 kernel의 결과값들을 억누르는 것(?)) 를 구현하는 것이다.

    이 normalization으로 top-1, top-5 error를 각각 1.4%, 1.2% 낮추었다.

     

    3.4 Overlapping Pooling

    전통적으로 pooling은 겹치지 않게 수행됐다. 좀 더 정확히 말하자면, pooling layer는 z * z pooling grid unit 공간의 픽셀들을 요약하는 역할을 한다고 여겨졌다. s=z로 두면 일반적인 pooling을 수행하지만, s < z로 두면 overlap pooling 을 수행하게 된다. 여기서는 s=2, z=3을 사용해서 top-1, top-5 error를 각각 0.4%, 0.3% 낮추었다. 실험에서 pooling 영역을 겹치는 것이 overfit을 (적지만) 좀 더 어렵게 만드는 것을 관찰 할 수 있었다.

     

    3.5 Overall Architecture

    처음 5개는 convolutional, 나머지 3개는 fully-connected layer 이다. 결과 (output)는 1000-way softmax layer 이다.

    2,4,5번째 layer는 같은 GPU에 있는 직전 layer와만 연결된다. 3번째 convolutional layer는 두번째 layer 전체와 연결된다. fully-connected layer는 모두 직전 layer 전체와 연결된다. Response-normalization layer는 1,2번째 layer 뒤에 붙는다. Max-pooling layer는 Response-normalization layer 뒤와 5번째 layer 뒤에 적용된다. ReLU는 모든 layer에 적용됐다.

    첫번째 convolutional layer filter는 224 * 224 * 3 input 이미지를 96개의 11 * 11 * 3, stride 4 (수용영역 (receptive field)의 중간값과의 거리) 이다.

    두번째 convolutional layer는 256개의 5 * 5 * 48 kernel 을 사용했다.

    3,4,5번째 convolutional layer는 pooling, normalization 를 사용하지 않았다.

    3번째는 384개의 3 * 3 * 256 kernel 을 사용했다.

    4번째는 384개의 3 * 3 * 192 kernel 을 사용했다.

    5번째는 256개의 3 * 3 * 192 kernel 을 사용했다.

    fully-connected layer는 4096개의 neuron을 각각 가지고 있다.

     

     

    4 Reducing Overfitting

    논문의 neural network는 60만개의 parameter를 가지고 있다. 하지만 ILSVRC는 1000개 클래스를 가지고 있으므로 overfitting을 피하기가 어렵다. 아래 방법들로 overfitting을 해소하려 한다.

     

    4.1 Data Augmentation

    label을 보존한 상태에서 가짜 데이터를 만들었다. 두가지 방법을 사용했는데, 둘 다 계산이 많이 들지 않으므로 disk에 저장하지 않고 메모리에 바로 처리했다. GPU가 training을 진행하는 동안 CPU를 사옹해 가짜 데이터를 만들었다.

    첫번째 방법은 수평으로 반사되는 이미지를 만드는 것. 랜덤하게 224 * 224 패치와 수평 반사 (horizontal reflection) 이미지를 256 * 256 이미지로 부터 만들어 낸다. 이 방법으로 training set 을 2048배로 불렸다. test 할 때는 이미지에서 224 * 224 패치를 다섯 개 (사방 코너와 중간) 만들고 각각 수평 반사 이미지를 더해서 총 10개의 이미지를 network에 돌린 후 network softmax layer 결과를 평균 내서 prediction 했다. (이게 논문에서 사용한 neural network가 226 * 226 input을 가지는 이유라고 함)

    두번째 방법은 RGB intensity를 조절하는 것이다. RGB pixel에 PCA를 적용했다. principal component에 아래와 같이 eigenvalue를 조금 수정한 값을 더했다. (p, λ는 eigenvector, eigenvalue)

    \[I_{xy}=[I^{R}_{xy},I^{G}_{xy},I^{B}_{xy}]^{T} + [p_1,p_2,p_3][\alpha_1\lambda_1,\alpha_2\lambda_2,\alpha_3\lambda_3]^T\]

    이 방법으로 top-1 error rate가 1% 이상 줄었다.

     

    4.2 Dropout

    0.5 의 확률 (반반?) 로 hidden neuron의 output을 0으로 만든다. 선택된 neuron들은 forward, backward 계산 할 때 모두 생략된다. input이 들어올 때마다 생략할 neuron을 sample 하므로 매번 다른 구조 (architecture)를 가지게 되지만 weight는 공유하게 된다. 이렇게 하면 한 neuron이 다른 neuron에 의존적인 관계를 형성하는 것을 막아서 더 강건한 (robust) feature를 만들어내게 된다. test 할 때는 모든 neuron의 output에 0.5 (적당한 추정치로 geometric mean을 선택) 를 곱해서 사용한다. 논문에서 사용된 neural network에서는 처음 두개의 fully-connected layers에 dropout 이 적용됐다.

     

    5 Details of learning

    stochastic gradient descent를 사용해서 training 했다. batch size는 128, momentum은 0.9, weight decay는 0.0005를 사용. weight decay가 모델에서 중요한 역할을 수행했는데, 단지 regularizer의 역할 뿐만 아니라 training error를 줄이는 역할을 했다. 아래와 같이 w를 업데이트 한다.

    \begin{align} v_{i+1} &= 0.9 \cdot v_i - 0.0005 \cdot \epsilon \cdot w_i - \epsilon \cdot \langle \frac{\partial L}{\partial w} \vert w_{i} \rangle_{_{D_i}} \\ w_{i+1} &= w_i+v_{i+1} \end{align}

    i는 iteration index, v는 momentum variable, ε는 learning rate, \(\langle \frac{\partial L}{\partial w} \vert w_{i} \rangle_{_{D_i}}\)는 i번째 반복 중 batch D의 w에 대한 도함수의 평균이다.

    layer의 초기화는 평균 0, sd 0.01 의 Gaussian distribution으로 수행했다. bias는 2,4,5번째 layer와 fully-connected hidden layer는 1로 초기화 했는데, 이를 통해 ReLU에 양수 input을 넣어 학습을 가속화 시켰다. 나머지 bias는 0으로 초기화했다.

    모든 layer에 같은 learning rate를 적용했다. learning rate를 경험치 (heuristic) 로 직접 조정했다. validation error rate가 증가하지 않으면 learning rate를 10으로 나누었다. 0.01로 시작해서 학습이 끝날 때까지 총 3번 learning rate가 줄어들었다.

    1.2백만 이미지에 대해 90cycle을 학습했고, NVIDIA GTX 580 3GB GPU 두개로 5~6일 정도 걸렸다.

     

    6 Results

    ILSVRC-2010, 2012에서 모두 기존 결과들을 큰 폭으로 뛰어넘는 결과를 보여주었다.

     

    6.1 Qualitative Evaluations

    위의 그림은 두 개의 GPU에 나눠서 진행한 kernel 들이다. 각각 방향, 색깔을 대표하는 것을 볼 수 있다.

     

     

    마지막 4096 차원의 hidden layer를 관찰 했을 때, 비슷한 벡터는 비슷한 이미지를 보였다. 위의 그림에서 첫번째 열이 test set에서 가져온 그림이고 이와 비슷한 벡터를 training set에서 6개 가져온 것이다. 같은 사물 그림이 선택된 것을 알 수 있다.

    댓글

Designed by Tistory.