1. AlexNet 개요
AlexNet은 Krizhevsky, Alex et al., 2012에서 제안된 CNN 구조로 ILSVRC(ImageNet Large-Scale Visual Recognition Challenge)의 2012년 대회에서 top 5 test error rate 15.4%로 2위 error rate 26.2%와 큰 차이를 만들며 1위를 차지했습니다. AlexNet은 단순히 2012년 대회에서 우승했을 뿐 아니라, CNN을 보편화하는 큰 역할을 했습니다.
AlexNet이 좋은 성과를 내고, 보편화하는 데 중요한 몇 가지 기여가 있는데, 구조적인 특징과 과적합(Overfitting)을 줄이기 위한 노력입니다. 구조적인 관점에서는 ReLU(Rectified Linear Unit)사용, Local Response Normalization(LRN)의 적용이 있고, Overfitting을 줄이기 위한 노력으로는 dropout과 data augmentation을 사용했다는 점입니다. LRN은 현재 잘 사용되지 않고, 대부분 batch normalization을 적용하고 있지만 CNN 구조 중간에 normalization을 적용한 시초가 되었다는 점에서 중요하고, 나머지 기법들은 현재에도 자주 사용되고 있습니다.
먼저 AlexNet의 구조를 살펴보고, CNN에 기여한 위 네가지 기법을 자세히 다루는 순서로 아래 내용을 이어가겠습니다.
2. AlextNet 구조
시작하기 앞서 figure 1은 논문에 있는 그림인데 좌측에 존재하는 image의 input이 224가 아니고 227이라고 합니다. 잘못된 표기이고 이후 227로 정정했다고 합니다. 논문에서는 2개의 GPU 병렬처리를 한 그림을 위와 같이 표현 했는데, 상세하게 나타내면 아래 그림 figure 2와 같습니다.
1) Input
227x227x3 이미지를 입력받습니다.
2) Conv. 1: Convolution Layer
2개의 GPU에 각각 11x11x3 filter, 96개, 4 stride로 convolution합니다. 따라서 55x55x96의 output을 얻습니다. Activation function으로는 ReLU를 사용합니다. (참고로 output을 계산하는 방법은 $ceiling\left[\left(\text{input size}-\text{filter size}-1\right)/(\text{stride})\right]$입니다.)
55x55x96의 output에 3x3 filter, stride: 2로 overlapping max pooling을 적용하여 27x27x96의 output을 얻습니다.
2개의 GPU에서 실행되서 실질적으로는 27x27x(96+96)의 output을 얻습니다. 총 192개의 feature map의 동일한 자리에 normalization을 적용하며, local response normalization라고 합니다. (자세한 설명은 아래에서 진행하겠습니다.)
3) Conv. 2: Convolution Layer
다시 2개의 GPU에 27x27x96을 input으로 feeding합니다. 그리고 두 번째 Convolution으로 5x5x48 filter, 128개, stride:1, zero-padding:2을 진행하여 27x27x96의 output을 얻습니다. (zero-padding은 input의 주변에 0으로 채우는 방법을 의미하며, zero-padding 2는 0을 두 겹으로 쌓는다는 의미가 됩니다.) Activation function으로는 ReLU를 적용합니다.
마찬가지로 27x27x96의 output에 3x3 filter, stride:2로 overlapping max pooling을 적용하여 13x13x96의 ouptut을 얻고 각 GPU에서 실행된 결과를 모아, 13x13x(96+96)의 output에 local response normalization (LRN)을 적용합니다.
4) Conv. 3: Convolution Layer
Conv. 1, 2에서는 각 GPU에서 독립적으로 진행했다면, Conv. 3에서는 그 결과를 한 번 합쳐서 convolution을 진행합니다. 그래서 384개의 3x3x256, stride: 1, zero-padding: 1을 적용하여 13x13x384의 output을 얻습니다. 마찬가지로 ReLU로 활성화하고, 각 GPU에 다시 할당합니다. 때문에 각 GPU에는 13x13x192의 input을 feeding하게됩니다.
Conv. 1, 2와 다르게 LRN을 적용하지 않습니다.
5) Conv. 4: Convolution Layer
3x3x192 filter, 192개, stride:1, zero-padding:1을 진행하여 13x13x192의 output을 얻습니다. Activation function으로는 ReLU를 적용합니다.
6) Conv. 5: Convolution Layer
이어서 3x3 filter, stride: 2로 overlapping max pooling을 적용하고 6x6x128의 output을 얻습니다.
7) FC 1: Fully Connected Layer
2개의 GPU에 각각 올라와 있는 6x6x128의 output을 합쳐서 flattening해주면 6x6x128x2(GPU 2개) = 9,216의 1차원 벡터로 만들어 feeding하고 4,096개의 노드에 full connection합니다. 그리고 ReLU로 활성화 합니다.
8) FC 2: Fully Connected Layer
4,096의 input 노드를 4,096개의 노드에 full connection하고, ReLU로 활성화 합니다.
9) FC 3: Fully Connected Layer
4,096의 input 노드를 1,000개(예측할 class의 수)의 노드에 full connection하고 softmax를 적용해 각 class에 속할 확률을 얻습니다.
3. Contributions of AlexNet
3.1. The Architecture
ReLU (Rectified Linear Unit)
AlexNet 이전에는 activation function으로 주로 sigmoid와 tangent hyperbolic function을 사용했습니다. 하지만 두 함수는 saturating되는 구간이 존재하고, 이는 vanishing gradients, exploding gradients 문제를 초래하게 됩니다. AlexNet에서는 이를 방지하기 위하여 최초로 ReLU를 적용하였고, 논문에서는 CIFAR-10에서 25% training error rate에 도달하는 속도가 ReLU가 tanh 보다 6배 빨랐다고 합니다.
Local Response Normalization (LRN)
ReLU를 적용하면 vanishing gradient를 예방할 수 있지만, ReLU의 결과는 $[0, \inf)$ 구간에 존재하기 때문에 간혹 너무 높은 양수를 받게 되면, 주변의 낮은 값이 다음 neuron으로 전달을 방해할 수 있습니다. 이를 일반화 하기 위하여 LRN을 적용합니다. LRN은 feature map에 같은 위치에 존재하는 값을 이용합니다. LRN의 식은 아래와 같습니다. $$b^{i}_{x, y}=\frac{a_{x,y}^{i}}{\left(k+\alpha\sum_{j=max(0, i-n/2)}^{min(N-1, i+n/2)}\left(a_{x,y}^{j}\right)^{2}\right)^{\beta}}$$여기에서 $b^{i}_{x,y}$는 i feature map의 x, y자리의 normalized output, $a_{x,y}^{i}$는 i feature map x, y자리의 input이, $N$는 feature map의 총 개수를, $n$은 $N$개의 feature map중 주변의 몇 개를 normalizing할 지를 의미하며 $\alpha$, $\beta$, $k$,$n$은 hyperparameters입니다. 수식이 좀 복잡해 보이는데, 요약하면, $i$를 기준으로 $n/2$, 즉 반반 적용하는데 feature map의 가장자리인 0, $N$에서는 절삭한다는 의미입니다.
3.2. Reducing overfitting
Dropout
과적합을 피하기 위해 학습의 과정에 random하게 몇 개의 노드를 0으로 바꿔버리는 것을 의미합니다. 그러면 해당 노드들은 forward pass, backward pass 모두 아무런 영향을 미치지 않게 됩니다. 이에 따라 특정 노드의 weight에 학습이 치중되는 것을 방지하여 균형있는 결과를 얻을 수 있게 됩니다.
Data Augmentation
최근의 CNN에서는 필수재가 되어버린 Data Augmentation입니다. AlexNet에서는 두 가지 Data Augmentation을 진행 했습니다.먼저 imagenet의 image이 크기가 상이하기 때문에 256x256x3으로 resize해줍니다. 만들어 줄때는 가로와 세로 중 작은 부분을 256으로 rescale한 뒤 이미지를 center crop합니다. 그 다음 전체 학습 데이터의 pixel의 평균 만큼 빼주어 기본 데이터를 만드는 것을 시작으로 합니다.첫 번째 data augmentation으로 256x256x3으로 얻어진 image에서 random crop하여 데이터를 얻고 horizontal reflection을 해주었습니다. 두 번째는 RGB의 intensities를 PCA(principal component analysis)로 바꾸어 줍니다. PCA는 학습 데이터 전체를 이용하여 진행합니다. 전체 학습 데이터의 RGB에 대한 3x3 covariance matrix에서 $p_{i}$ eigenvector와 $\lambda_{i}$ eigenvalue를 얻고, $\alpha_{i}$를 정규분포 $N(0, 0.1)$에서 random sampling하여, $$[p_{1}, p_{2}, p_{3}][\alpha_{1}\lambda_{1}, \alpha_{2}\lambda_{2},\alpha_{3}\lambda_{3}]^{\top}$$을 각 이미지에 더해줍니다.
이상으로 AlexNet 포스팅을 마치겠습니다 :)
References
- Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. "Imagenet classification with deep convolutional neural networks." Communications of the ACM 60.6 (2017): 84-90.
- Wikipedia contributors. "AlexNet." Wikipedia, The Free Encyclopedia. Wikipedia, The Free Encyclopedia, 4 Feb. 2023. Web. 9 Feb. 2023.
- https://velog.io/@lighthouse97/AlexNet%EC%9D%98-%EC%9D%B4%ED%95%B4
- https://deep-learning-study.tistory.com/376
'Deep Learning > Convolutional Neural Networks' 카테고리의 다른 글
VGG-16, VGG-19, 2014 (1) | 2023.02.20 |
---|---|
LeNet-5, 1998 (0) | 2023.01.30 |
CNN 역전파 (Backpropagation for CNN) (6) | 2019.07.02 |
Convolution Neural Networks (합성곱 신경망) (42) | 2019.06.23 |
댓글