'ImageNet Classification with Deep Convolutional Neural Networks' 논문을 바탕으로 Alex Net에 대한 전반적인 내용을 소개하는 자료입니다.
간단한 객체 인식(object recognition) 모델을 학습하기 위해서는 수 만장의 라벨링된 데이터셋으로도 데이터 증강 등을 이용하면 충분하다. 하지만, 현실의 데이터는 매우 가변적이기에 훨씬 큰 데이터셋은 불가피하다. 최근에는 대용량 이미지 데이터를 수집하기 수월해졌기에 100만 여 장의 LabelMe나 22,000개 이상의 카테고리로 라벨링된 천 오백만 개의 고해상도 이미지 데이터셋인 ImageNet이 만들어질 수 있었다.
그러나 수 백만 장의 이미지에서 수 천 여개의 객체를 학습하기 위해서는 많은 양의 데이터만으로는 그 복잡성을 특정하기에 역부족이다. 따라서, 이미지 데이터에대한 사전 지식을 녹여낼 수있는 모델이 필요하다. 그리고 CNN은 통계량들의 정상성과 픽셀 간의 지역적 의존성을 고려할 수 있으므로 이에 적합한 모델이다. 이론적으로, 비슷한 크기의 FFNN에 비해 cNN은 파라미터 개수와 셀 간 연결이 훨씬 적어 학습이 쉽다.
물론 CNN 구조가 간단하더라도 대용량 고해상도 이미지를 다루는 것은 역시나 자원이 많이 소모된다. 본 논문에서는 이 문제를 GPU 병렬 처리를 통해 해결한다. 최근 GPU는 2D convolution 처리에 최적화 되었기에 매우 큰 CNN 모델을 심각한 오버피팅 없이 학습하기에 충분히 강려크하기 때문이다.
ImageNet은 22,000여 개의 카테고리로 라벨링된 천 오백만 여개의 고해상도 이미지로 구성되며, AWS의 크라우드 소싱 툴(AMT)을 이용해 수집됐으며 사람이 라벨링했다. 이 논문에서는 ILSVRC(ImageNet Large-Scale Visual Recognition Challenge)-2010과 ILSVRC-2012로 실험을 했다. 전자는 test 셋을 사용할 수 있었으며, 후자는 대회 중이었기에 사용할 수 없었다고 한다. ILSVRC은
1000여 개의 카테고리가 각각 1000여 개의 이미지로 분류된 데이터에 대한 대회이다.
Data size of ILSVRC-2010
Train size : 1,200,000
Validation size : 50,000
Test size : 150,000
ILSVRC은 top-1과 top-5라는 두 가지 error를 사용한다. top-1은 가장 가능성이 큰 레이블에 대한 에러이며, top-5는 상위 5개 예측 레이블에 대한 에러이다.
출력층 활성화 함수의 표준적인 방법은 tanh나 sigmoid를 사용하는 것이었지만, (이러한 saturating nonlinearity는) 경사 하강법에 대한 시간이 오래 걸린다. 따라서, relu(와 같은 non-saturating nonlinearity)를 사용하는 것이 효율적이다.
cf) saturating nonlinearity 함수는 어떤 입력 x가 무한대로 갈 때 함수값이 어떤 범위 내에서만 움직이는 것을 의미
non-saturating nonlinearity 함수는 어떤 입력 x가 무한대로 갈 때 함수값이 무한대로 가는 것을 의미
본 논문에서는 4개의 convolutional layer를 갖는 모델로 간한한 실험을 했는데, error가 25% 이하로 떨어질 때까지 걸리는 iteration이 relu가 훨씬 적었다.
물론 ReLU 함수는 nomalization 없이도 학습이 잘 이루어지게 됩니다. 만약 특정 weight의 기울기가 0에 근접해버리면 더이상 학습이 이루어지지 않을 것입니다(논문에서는 saturating이라고 표현). 하지만 ReLU 함수의 특성 상 그럴 일이 잘 없기 때문에 입력값을 nomalization할 필요가 없습니다. 하지만 논문에서는 여전히 일반화를 잘 시키고 위해 local normalization을 시도했습니다. 그 식은 다음과 같습니다.
위 식에서 alpha, beta, n, k는 모두 하이퍼 파라미터입니다. 그리고 이 의미하는 것은 (x,y) 위치의 i번째 커널의 값이 ReLU 함수를 통과한 이후를 의미합니다. j는 i번째 커널과 인접한 다른 커널을 의미합니다(앞 뒤 커널).
즉, ReLU함수를 통과시킨 후, 다시 한번 위의 식을 통과시키는 것입니다. 위 식을 통과하면 해당 커널의 x,y의 값은 결국 근처 커널의 동일 위치의 값들의 합들로 해당 값을 나누는 것이 됩니다.
이렇게하면 각 커널의 값은 인접 커널의 값과 어느정도 유사해지게 됩니다. 그리고 학습 과정에서 lateral inhibition(측면 억제, 신경 생리학의 용어로, 이웃 신경 세포가 너무 튀지 않도록 만드는 현상. 실제로 위의 식은 신경생리학에서 영감을 받았다고 합니다.)을 이룰 수 있다고 합니다.
ReLU 함수는 x값이 크면 큰대로 그대로 y로 전달합니다(x>0일때 항등함수이기 때문에). 이는 특정 커널, 특정 위치의 가 너무 클 경우 다른 커널들이 제대로 학습되지 못하게 만듭니다. 주변 커널의 값은 상대적으로 작기 때문입니다. 하지만 위와 같은 식을 이용하면 커널을 통과한 값들이 어느정도 nomalization 되어 이러한 현상을 억제할 수 있습니다.
실제로 논문에선 이를 통새 top-1, top-5 error를 각각 1.4%, 1.2% 감소시켰다고 합니다.
지금까지 살펴본 모델의 전체 구조를 살펴보면 다음과 같습니다. 모델은 두개의 GPU를 사용하여 위와 아래의 layer가 각각의 GPU에 의해 연산됩니다. 모델은 총 8개의 레이어로 구성되어 있습니다. 초기 레이어 5개는 Convolution layer이고 뒤의 3개는 Fully-Conneted layer입니다. 마지막 Fully-Connected layer를 통과한 값은 1000-way softmax를 거쳐 1000개의 클래스 중 하나로 분류합니다.
2번째, 4번째, 5번째 convolution layer는 특이하게도 동일한 GPU에서 작업한 직전 convolution layer와 연결되어 있습니다. 3번째 convolution layer는 GPU에 관계없이 모든 직전 layer와 연결되어 있습니다. 또한 Local Response Nomalization와 max pooling은 1번째, 2번째 convolution layer 뒤에 붙어있습니다. 입력값은 227x227x3으로 그림에선 오타입니다.
이미지 데이터에서 오버피팅을 줄이는 가장 쉬운 방법은 label은 보존하면서 데이터셋을 인공적으로 증가시키는 것이다. 이 논문에서는 2가지 방법을 적용을 했는데, 두 가지 방법 모두 원래 이미지에 약간의 연산만으로 변형을 가하는 것이다. 변형된 이미지를 따로 디스크에 저장할 필요 없이 GPU가 이전의 배치 이미지에 대해서 학습을 하는 동안 CPU에서 Python 코드로 구현된다. 따라서 이 방식은 효율적이면서 연산의 부담이 없다.
첫 번째 Data Augmentation 방법은 cropping과 reflection이다.
Test를 할 때는 상,하,좌,우, 및 중앙을 224x224로 잘라내어 5장의 이미지를 생성하고 위의 그림처럼 그 5개의 이미지를 좌우 반전 하여 총 10장의 이미지를 생성한 다음 softmax출력을 평균하는 방법을 채택하였다.
번째 Data Augmentation 방법은 RGB channel의 값을 변화시키는 것이다. 이를 위하여 학습 데이터의 RGB값에 대한 주성분 분석을 시행하였으며, 거기에 평균은 0, 표준편차는 0.1을 갖는 랜덤 변수 를 곱하고 그것을 원래 픽셀 값에 더해주는 방법을 시행하였다. 따라서 RGB channel의 값은 다음과 같다.
: iteration index
: momentum variable
: learning rate
: 에서 평가된 번째 batch 의 에 대한 objective 미분값의 평균
실험에서 각 레이어의 가중치를 를 따르도록 초기화했고, 2, 4, 5번째 convolutianl layer와 모든 FC layer의 bias를 1로 고정했다. 이러한 초기화는 학습 초기 단계에서 relu에 양수를 input으로 제공하도록 한다. (그래야 역전파 잘 돼서 학습 잘 됨) 이외의 레이어에서는 bias를 0으로 고정했다.
또한 모든 레이어에서 lr를 0.01로 통일했으며, validation error가 개선되지 않을 때 lr를 1/10하는 휴리스틱한 방법을 사용했다. 종료 전에는 3배 감소시킨 lr을 적용했다. epoch는 90회 반복했다.
본 논문에서는 앞서 언급했듯이 2개의 GPU를 사용했는데, GPU1은 색깔과 상관없는 정보, GPU2는 색깔에 관한 정보에 대한 kernel을 담당한다. 이러한 분업화는 매 학습마다 적용되며, 가중치 초기화와는 독립적이다. 이전 그림에서 윗부분의 48개는 GPU1의 결과이고, 아랫부분 48개는 GPU2의 결과다.
아래 그림의 왼편은 8개의 test 이미지에 대한 top-5 예측 결과이다. 대부분의 결과가 리즈너블하고, 심지어 진드기(mite, 1행1열)의 경우 일부분임에도 인식에 성공했다.