ImageNet Classification with Deep Convolutional Neural Networks
0. Abstract
- ImageNet LSVRC-2010에서 1.2m개의 고해상도 이미지에 대해 1000개의 클래스로 분류하기 위해 large, deep convolutional neural network를 학습
- test data에서 이전 SOTA 모델보다 좋은 top-1과 top-5 error rates에서 37.5%와 17.0%를 기록
- `AlexNet`에는 약 6,000만개의 파라미터와 65만 개의 neurons가 5개의 convolutional layers로 구성
- 이에 더해 max-pooling layers와 1000-way softmax로 구성된 3개의 fully-connected layers로 구성
- fully-connected layers의 overfitting을 감소시키기 위해 `dropout` 적용
- 학습 속도를 높이기 위해 `non-saturating neurons`와 convolution 연산에 매우 효율적인 GPU를 사용
1. Introduction
- 수백 만개의 이미지들 중에서 수천 개의 객체를 학습하기 위해선, 학습 용량이 큰 모델이 필요
- object recognition task의 엄청난 수준의 복잡성은 해당 문제가 ImageNet처럼 거대한 데이터셋으로도 정의되지 않는다는 것을 의미
- 따라서 모델은 가지고 있지 않은 데이터에 대해 보완하기 위해 많은 양의 prior knowledge를 가지고 있어야 함
- CNNs 모델들의 용량은 `depth`와 `breadth`를 조절하여 컨트롤할 수 있으며, 이미지의 특성(통계의 stationarity, pixel dependencies의 locality 등)애 대해 강력하고 대부분 올바른 가정을 함
- CNNs 모델들의 local architecture의 효율성을 비롯한 여러 장점들에도 불구하고, 여전히 large scale의 고해상도 이미지에 적용시키기 위해선 매우 expensive
- 다행히도 현재의 GPU는 2D convolution의 고도로 최적화된 구현과 결합하여 매우 거대한 CNN 모델들의 훈련이 가능
- ImageNet과 같은 데이터셋은 이러한 모델들을 overfitting 없이 훈련하기에 충분한 labeled examples를 포함
- 본 논문의 Contributions
- ILSVRC-2010 그리고 ILSVRC-2012에서 사용된 ImageNet의 subsets에 대해서 현재까지 가장 큰 규모의 convolutional neural networks을 훈련
- 해당 데이터셋에서 최고의 결과를 달성
- 현재 사용할 수 있는 메모리 양과 훈련할 수 있는 시간에 의해 네트워크 크기는 제한됨
- 본 논문의경우 GTX 580 3GB GPUs를 통해 5일에서 6일 동안 학습
- 더욱 빠른 GPUs와 더 큰 데이터셋이 있다면 결과는 더 좋아질 수 있음
2. The Dataset
3. The Archiitecture
3.1 ReLU Nonlinearity
- Input $x$에 대한 뉴런의 output $f$에 대한 함수를 모델링할 때는 주로 $f(x) = tanh(x)$ 혹은 $f(x) = (1+e^{-x})^{-1}$과 같은 `saturating nonlinearities`를 사용
- `gradient descent`를 통한 훈련 시간을 고려했을 때, $f(x) = max(0,x)$와 같은 `non-saturating nonlinearity`가 더 빠름
- 이러한 비선형성을 가진 뉴런을 `Rectified Linear Unit(ReLUs)`라고 함
- ReLUs를 통해 학습하는 Deep convolutional neural networks는 $tanh$보다 몇 배 더 빠르게 훈련
💡 saturating vs non-saturating nonlinearities
: `saturating` activation function은 input $x$의 값을 [-1,1], [0,1] 등의 형태로 제한을 한다. 본 논문에서 언급한 `tanh` 혹은 `sigmoid`와 같은 activation function은 각각 [-1,1]과 [0,1]로 input $x$의 출력 값의 범위를 지정하게 된다.
반대로 `non-saturating` activation function은 $\displaystyle \lim_{z \to \infty }f(x) = \infty$를 만족한다. `ReLU`의 경우 $f(x) = max(0,x)$로 `non-saturating` activation function이다.
- 4개의 convolutional layers로 구성된 neural network에서 ReLUs를 사용하는 경우 tanh보다 6배 더 빨리 25%의 training error rate에 도달
- 각 네트워크에 대한 learning rates는 최대한 빠르게 학습하기 위해 독립적으로 구성
- regularization은 적용하지 않음
- 빠른 학습 속도는 대규모 데이터셋에서 학습된 대규모 모델의 성능에 큰 영향을 미침
3.2 Training on Multiple GPUs
- 단일 GTX 580 GPU의 경우 오직 3GB 메모리만 가지고 있기 때문에 네트워크가 학습될 수 있는 최대 크기가 제한
- 1.2 million개의 training examples은 GPU를 통해 모델이 학습하기에 너무 양이 많음
- 본 논문에서 사용하는 `parallelization` 방식은 기본적으로 커널 혹은 뉴런의 절반을 각 GPU에 배치
- GPU는 특정 layers에서만 communicate
- 예를 들어 layer 3의 kernels는 layer 2의 모든 kernal maps을 input으로 사용하지만, layer 4의 kernels은 동일한 GPU에 있는 layer 3의 kernels만 input을 받음
- connectivity의 패턴은 `cross-validation`의 문제이지만, 허용 가능한 계산량 내에서 communication의 양을 정밀하게 조정 가능
- GPU는 특정 layers에서만 communicate
- Multiple GPUs에서의 학습은 top-1/top-5 error rates를 각각 1.7%와 1.2% 감소시킴
- 하나의 GPU에서 각 convolutional layer의 절반의 kernels를 통해 훈련된 네트워크와 비교
- 학습 시간 또한 one-GPU net에 비해 소폭 감소
3.3 Local Response Normalization
- ReLU는 saturating을 방지하기 위한 `input normalization`이 필요 없는 좋은 특성을 가지지만 `local normalization`이 여전히 generalization에 도움을 줌
- $a^i_{x,y}$는 $(x,y)$ 위치에서 kernel $i$를 적용한 값으로, 이후에 ReLU 적용
- $b^i_{x,y}$ : response-normalized activity
- sum은 동일한 spatial position의 $n$개의 `adjacent kernel maps`를 통해 이루어짐
- $N$ : 해당 layer의 총 kernels의 개수
- kernel map의 순서는 훈련이 시작되기 전 임의적으로 결정
- $k, n , \alpha, \beta$ : valindation set을 사용하여 결정되는 하이퍼파라미터 값
- 본 논문에선 $k = 2, n = 5, \alpha = 10^{-4}, \beta = 0.75$를 사용
- $n$ : size of the normalization neighborhood
- 특정 몇몇의 layers에서 ReLU를 적용한 이후에 이러한 normalization 활용
$$ b^i_{x,y} = \frac{a^i_{x,y}}{(k + \alpha \sum_{j=max(0, i-n/2)}^{min(N-1, i+n/2)}(a^i_{x,y})^2)^{\beta}} $$
- `Response normalization`은 top-1/top-5 error rates를 각각 1.4%, 1.2% 감소
💡 Local Response Normalization
: `LRN(Local Response Normalization)`은 현재는 `Batch Normalization`의 등장으로 잘 사용되지 않는 정규화 기법이다. 이는 CNN 커널이 이미지를 스캔할 때 특정 픽셀값이 다른 픽셀에 비해 지나치게 높은 값을 가지고 있어 주변에 큰 영향력을 끼치는 것을 억제시키는 일반화 방법 중 하나이다. `sigmoid`나 `tanh` 같은 활성화 함수는 `saturating nonlinearity` 함수로, 데이터의 속성에 따라 편차가 심하면 saturating이 심해져 `기울기 소실(gradient vanishing)`을 유발할 수 있다. 그러나 ReLU는 `non-saturating nonlinearity` 함수이기 때문에 input data의 정규화가 필요 없다는 장점이 있지만, 양수값을 뉴런에 그대로 전달하기 때문에 너무 큰 값이 전달되면 주변의 낮은 값이 뉴런에 전달되는 것을 막을 수 있다. 즉, convolution 연산이나 pooling 시에 매우 높은 하나의 픽셀 값이 주변의 픽셀에 영향을 미치는 것이다. 따라서 이를 예방하기 위해 같은 activation map의 같은 위치에 있는 픽셀끼리 정규화를 해주는 LRN이 등장했다.
본 논문에서는 LRN을 `측면 억제(later inhibition)`의 형태로 구현된다고 하는데, 이는 강한 자극이 주변의 약한 자극을 전달하는 것을 막는 현상을 말한다. 이에 대한 유명한 그림으로 `헤르만 격자(Herran grid)`가 있다. 해당 그림을 보면 검은 사각형 안에 흰색의 선이 지나고 있는데, 흰색의 선에 집중하지 않으면 회색 점이 보이지만, 흰색 선에 집중하면 다시 회색 점이 보이지 않는다. 이는 흰색으로 둘러싸인 측면에서 억제를 발생시키기 때문에 발생하는 것이다.
3.4 Overlapping Pooling
- CNNs의 `Pooling layers`는 같은 kernel map에 있는 인접한 뉴런 그룹들의 outputs을 요약하는 역할
- 전통적으로는 `overlap`을 하지 않고 `adjacent pooling units`에 의해 요약
- pooling layer는 $s$ pixels씩 떨어져있는(`stride`) pooling units의grid로 구성
- 각 pooling units은 각각의 위치를 중심으로 $(z \times z)$ 크기의 neighborhood를 요약
- $s = z$ : CNN에서 자주 사용하는 전통적인 local pooling
- $s < z$ : `overlapping pooling` → 본 논문에선 $s = 2, z = 3$을 사용
- $s = z = 2$로 설정한 non-overlapping pooling과 비교했을 때 overlapping pooling은 top-1/top-5 eror rates를 각각 0.4%, 0.3% 감소
3.5 Overall Architecture
- 5개의 convolutional layers와 3개의 full-connected layers로 총 8개의 wights와 layers로 구성
- 마지막 fully-connected layer의 output은 1000개의 클래스에 대한 label을 위한 1000-way softmax에 입력
- `multinomial logistic regression`을 최대화하는 손실 함수
- 3번째 convolutional layers는 2번째 layer의 모든 kernel maps(GPU 상관 없이)에 연결
- 2,4,5번째 convolutional layers는 오직 같은 GPU의 이전 layers의 kernel maps에만 연결
- Convolutional layers 구성
- $Conv1$ : (224x224x3) input image에 대해 (11x11x3) kernels 96개(stride=4) + LRN + Max Pooling + ReLU
- $Conv2$ : (5x5x48) kernels 256개 + ReLU + LRN + Max Pooling
- $Conv3$ : (3x3x256) kernels 256개 + ReLU
- $Conv4$ : (3x3x192) kernels 384개 + ReLU
- $Conv5$ : (3x3x192) kernels 256개 + ReLU + Max Pooling
4. Reducing Overfitting
4.1 Data Augmentation
- 이미지 데이터에 대한 overfitting을 감소시키기 위해 가장 쉽고 흔히 사용되는 방법은 `label-preserving transformations`을 사용해 데이터셋의 크기를 늘리는 것
- 두 가지 방법을 통해 `data augmentation`을 수행하며, transformed images는 연산량이 매우 적어 저장 공간에 저장할 필요 없이 바로 연산이 가능
- transformed images는 CPU에서 Python 코드에 의해 생성되며, GPU는 이전 이미지 배치에 대해 학습을 진행
- 이러한 data augmentation 기법은 사실상 계산이 필요 없음
- 첫 번째 방법은 `generating image translations`와 `좌우반전(horizontal reflections)`을 통한 data augmentation
- $(256 \times 256)$ 크기의 images에서 랜덤한 $(224 \times 224)$ `patches`를 추출 및 해당 패치에 대한 horizontal reflections을 통해 모델 학습
- 모델 아키텍처에서 input images의 크기가 $(224 \times 224)$로 표시된 이유
- training set의 크기가 2048배 $(32 \times 32 \times 2 = 2048)$ 증가
- 하지만 이를 통해 생성된 데이터는 물론 상호 의존성이 매우 높음
- horizontal reflection을 수행해도 label에는 변화가 없으므로 label-preserving transformation
- 이 방식이 없었다면 네트워크에 상당한 과적합이 발생하여 훨씬 더 작은 네트워크를 사용해야 함
- 테스트 시에는 모든 이미지 데이터를 2,048배 하는 것이 아닌 $(224 \times 224)$ 크기의 4개의 `corner patches`, 1개의 `center patch`와 각각의 좌우반전까지 총 10개의 patches를 추출
- 10개의 patches들에 대한 모델의 softmax layer에서 만들어진 결과 값을 평균하여 사용
- $(256 \times 256)$ 크기의 images에서 랜덤한 $(224 \times 224)$ `patches`를 추출 및 해당 패치에 대한 horizontal reflections을 통해 모델 학습
💡 AlexNet의 Input size
: 논문에서는 AlexNet의 input image size가 $(224 \times 224 \times 3)$으로 명시되어 있다. 그러나 코드 구현 등을 살펴보면 $(227 \times 227 \times 3)$이 맞다. 아마 논문에서는 실수로 잘못 나타낸 것으로 보인다. 사이즈를 수정할 경우, 위에서 training set의 크기는 1682배 $(27 \times 27 \times 2 = 1682)$ 늘어나는 것이 맞다. 그러나 논문에서 언급하는 2048배의 경우 image size가 $(224 \times 224 \times 3)$이어야 맞는데, 어떤 것이 정답인지는 밝혀진 바가 없다.
- 두 번째 방법은 training images의 `RGB channels`의 `강도(intensities)`를 바꾸어주는 것
- ImageNet training set에 대한 RGB 픽셀 값의 집합에 `PCA`를 수행
- 각 training image에 대하여 PCA를 통해 발견한 principal components에 random variable을 곱한 값을 더해줌
- 이를 통해 원본 이미지 데이터의 주요한 특성은 변하지 않으며, RGB 값을 변화시켜 색상 및 밝기만 변화
- top-1 error rate를 1% 넘게 감소시킴
- $p_i$, $\lambda_i$ : RGB 픽셀 값의 $3x3$ `covariance matrix`의 $i$번째 `eigenvector`와 `eigenvalue`
- $\alpha_i$ : 평균이 0, 표준편차가 0.1인 `Gaussian`에서 추출한 random variable
- 각 $\alpha_i$는 특정 훈련 이미지의 모든 픽셀에 대해 해당 이미지가 다시 훈련에 사용될 때까지 한 번만 도출
$$ I_{xy} = \left [I^R_{xy}, I^G_{xy}, I^B_{xy} \right ]^T + \left [p_1, p_2, p_3 \right]\left [\alpha_1\lambda_1, \alpha_2\lambda_2, \alpha_3\lambda_3 \right]^T $$
4.2 Dropout
- 다양한 모델의 예측값을 결합하는 것은 test errors를 줄이는 매우 성공적인 방법
- 훈련에 몇 일씩 걸리기 때문에 매우 비용이 비쌈
- `dropout`은 훈련 중에는 약 1/2의 비용만 발생하는 매우 효율적인 model combination 기법
- 각 hidden layer 뉴런의 output을 0.5의 확률로 0으로 설정
- 이렇게 dropped out된 뉴런은 forward pass에 기여하지 않으며, `backpropagation`에도 참여 x
- input이 주어질 때마다 신경망은 다른 아키텍처를 샘플링하지만, 모든 아키텍처는 가중치를 공유
- 뉴런들 간의 복잡한 co-adaptations을 감소
- test 시에는 dropout을 적용하지 않으며, 모든 outputs에 0.5를 곱함
- dropout은 처음 두 개의 fully-connected layer에 적용하였으며, converge에 필요한 iteration이 2배 가량 증가
💡 Dropout
: `Dropout`은 임의의 뉴런을 일정 확률로 드랍하여 학습에 참여하지 않도록 하는 방법이다. 데이터를 신경망에 통과시키는 과정인 `feed-forward`에서 해당 뉴런이 생략되며, `back-propagation`에서도 자연스럽게 제외된다. 여기서 드랍되는 노드는 매 미니배치마다 `이항분포(binomial distribution)`을 활용하여 랜덤으로 선정된다. 이 때 노드의 드랍 확률 $p$가 하이퍼파라미터가 되며, 본 논문에서는 0.5를 설정했다.
`추론(inference)` 과정에서는 드랍되는 노드 없이 모든 노드가 항상 추론에 참여하여 모든 단위가 예측 단계에서 고려된다. 이러한 추론 과정에서 가장 중요한 점은 가중치 파라미터 $W$에 확률 $p$를 곱해주어야 한다는 것이다. 이는 각 layer에서 모든 뉴런을 전달받기 때문에 최종 가중치는 훨씬 커질 거지는 것을 방지하기 위해서이다.
5. Details of learning
- `stochastic gradient descent`, `batch size` = 128, `momentum` = 0.9, `weight decay` = 0.0005
- weight decay의 값을 작게 하는 것이 모델 학습에 중요함을 발견
- 본 논문에서의 weight decay는 regularizer 뿐만 아니라 모델의 training error를 감소하는데 기여
- weight $w$에 대한 update rule
- $i$ : iteration
- $v$ : momentum variable
- $\epsilon$ : learning rate
- $\left<\frac{\partial L}{\partial w} |_{w_i} \right>_{D_i}$ : $w$에 대한 손실 함수의 $i$번째 batch $D_i$에 대한 평균으로, $w_i$에서 계산
$$ v_{i+1} := 0.9 \cdot v_i - 0.0005 \cdot \epsilon - \epsilon \cdot \left<\frac{\partial L}{\partial w} |_{wi} \right>_{D_i} $$
$$ w_{i+1} := w_i + v_{i+1} $$
- 각 layer의 가중치를 평균은 0, 표준 편차는 0.01인 가우시안 분포를 통해 초기화
- 2, 4, 5번째 convolutional layers와 fully-connected hidden layers의 neuron biases를 상수 1로 초기화
- 이러한 초기화는 ReLU에 positive inputs을 제공함으로써 초기 학습 속도를 가속
- 나머지 layers의 neuron biases는 상수 0으로 초기화
- validation error rate이 현재의 learning rate에서 개선이 되지 않을 경우 learning rate를 10으로 나누어줌
- 1.2m개의 이미지로 구성된 training set에 대해 약 90 cycles을 통해 네트워크를 학습
- 2개의 NVIDIA GTX 560 3GB GPUs를 통해 약 5~6일 학습
6. Results
- ILSVRC-2010에서 Top-1, Top-5 test set error rates가 각각 37.5%와 17.0%로 기존 best performance의 성능을 앞섬
- $1 CNN$ : 본 논문에서 제시한 CNN 모델의 성능(18.2%)
- $5 CNNs$ : 5개의 비슷한 CNN 모델들의 예측값을 평균(16.4%)
- $1 CNN*$ : 마지막 pooling layer에 6번째 convolutional layer를 추가시켜 전체 ImageNet Fall 2011(1,500만 개의 이미지, 22,000개의 카테고리)를 분류한 후 ILSVRC-2012에서 `fine-tuning`(16.6%)
- $7 CNNs*$ : ImageNet Fall 2011을 통해 사전 학습한 2개의 CNN 모델들과 앞서 언급한 5개의 CNN 모델들의 예측값을 평균(15.3%)
6.1 Qualitative Evaluations
- 첫 번째 convolutional layer에서 $(224 \times 224 \times 3)$ 크기의 input images를 입력받을 때, $(11 \times 11 \times 3)$ 크기의 convolutional filter가 학습되는 것을 나타냄
- 48개의 kernels은 GPU 1에 포함되며, 나머지 48개는 GPU 2에 포함
- GPU 1의 kernels들은 `color-agnostic`하며, GPU 2의 kernels는 `color-specific`
- 이러한 점은 랜덤한 weight initialization에 상관없이 모든 실험 과정에서 발생
- 왼쪽 그림은 ILSVRC-2010 test images에 대해 모델이 가장 적합하다고 여긴 5개의 labels을 포함한 것으로, 빨간색 막대를 통해 실제 label의 probability를 나타냄
- mite와 같은 `top-left`에 위치한 `off-center objects`에 대해서도 네트워크에 의해 인식
- 오른쪽 그림은 5개의 test set 이미지에 대해 training set에서 `Euclidean distance`를 통해 가장 가까운, 즉 비슷하다고 판단된 6개의 이미지를 나타냄
- 마지막 4096-dimensional hidden layer에서 이미지에 의해 유도된 `feature activations`를 고려하여 네트워크의 visual knowledge를 확인
- 두 이미지가 Euclidean distance가 가까운 feature activation vector를 생성하는 경우 신경망의 상위 수준에서는 두 이미지가 유사하다고 간주
7. Discussion
- large, deep convolutinal neural network이 supervised learning 방식을 통해 매우 까다로운 데이터셋에 대해 좋은 결과를 얻어내는 능력이 있음을 보임
- 본 논문의 networks에서 single convolutional layer가 제거되면 성능이 떨어진다는 것에 주목할 필요가 있음
- 어떤 middle layers를 제거할 시 네트워크의 top-1 성능이 약 2% 감소
- 따라서 depth가 좋은 결과를 얻어내는데 중요함
- 실험을 단순화하기 위해 모델 성능에 도움이 될 것이라 생각되는 unsupervised pre-training은사용하지 않음
- network을 더 크게 설계하고, 훈련을 더 길게 한다면 결과는 더 좋아질 것으로 예상됨
Comment
💡 본 논문은 거대한 CNN 모델을 통해 이미지 분류 성능을 향상시킨 첫 번째 모델인 AlexNet에 관한 논문이다. AlexNet은 먼저 `ReLU` 활성화 함수를 통해 학습 속도를 향상시키고, `Multiple GPUs`를 통해 학습 속도 향상 및 하나의 GPU가 가지고 있었던 용량적인 제한을 완화시켰으며, `Local Response Normalization`을 통해 ReLU 활성화 함수를 위한 generalization, 그리고 `Overlapping Pooling` 등을 적용하여 성능을 향상 시켰다. 또한 Overfitting을 감소시키기 위해 랜덤한 patches를 추출한 후 horizontal reflections과 훈련 데이터의 RGB channels에 대한 intensities를 변화시키는 `data augmentation`, 그리고 선택적인 뉴런을 사용하는 `Dropout`을 적용하였다.
지금와서 해당 논문을 보면 모델 구조적인 측면에서 이제는 사용하지 않는 방법들도 있고, 뭔가 특별한 부분은 없다. 그러나 CNN을 활용하여 처음으로 거대한 양의 데이터를 학습시키는데 성공했고, 이를 통해 엄청난 성능 향상을 이끌어낸 첫 논문이기 때문에 의미가 있는 것 같다.
Reference
[1] https://stats.stackexchange.com/questions/174295/what-does-the-term-saturating-nonlinearities-mean
[2] https://unerue.github.io/computer-vision/classifier-alexnet.html