Logical Scribbles
[논문 리뷰] Very Deep Convolutional Networks For Large-Scale Image Recognition (VGG) - 구조, Training 그리고 Test 본문
[논문 리뷰] Very Deep Convolutional Networks For Large-Scale Image Recognition (VGG) - 구조, Training 그리고 Test
KimJake 2023. 11. 12. 23:03오늘은 ICLR 2015에 개제된 논문 'Very Deep Convolutional Networks For Large-Scale Image Recognition' 에 대해 알아보자. 많이들 'VGG' 라고 부르는 모델을 소개하고 있는 논문이다.
https://arxiv.org/pdf/1409.1556v6.pdf
2010년 컴퓨터 비전 분야에는 ILSVRC (ImageNet Large Scale Visual Recognition Challenge) 라는 대회가 시작 되었다. 이 대회는 'ImageNet'이라는 데이터셋을 이용하여 누가 누가 classification을 잘 하나 겨루는 대회이다. (ImageNet 데이터셋은 2023년 기준으로 1,420만개의 이미지와 20,000개 이상의 카테고리 분류를 제공하고 있다고 한다)
우선 VGG가 등장하기 2년전, '인공지능의 방법론은 딥러닝이다!' 라고 굳히기에 들어간 모델이 있었다. 그 모델의 이름은 그 유명한 AlexNet이다. AlexNet은 2012년 이미지넷 대회에서 16.4%의 오차를 보이며 우승을 차지했다. VGG 논문을 읽다보니 AlexNet 논문을 상당히 많이 reference하는 것을 알 수 있었다. 기회가 되면 읽고 포스팅 하도록 하겠다.
그리고 2년뒤, 2014년 이미지넷 대회에서 오차율을 8% 아래로 기록하는 GoogleNet과 VGG가 등장하였고, 각각 우승과 준우승을 차지한다. VGG가 준우승을 했지만 많은 CNN의 Backbone이 되는 이유는 GoogleNet보다 훨씬 간단하지만 유의미한 성능 차이는 나지 않기 때문인 것 같다.
2012년도와 2013년도와 비교하여 모델의 구조, Train, Test 과정에 어떠한 차이점이 있기에 오차율을 크게 줄일 수 있었는지에 포인트를 두고 논문을 읽어보도록 하겠다.
1. Abstract
이 논문에서 저자는 large-scale image recognition에서 convolutional network의 깊이의 영향을 정확도 측면에서 조사하였다고 한다. 즉, convolutional network의 깊이가 깊어짐에 따라 모델의 정확도가 어떻게 변화하는지 실험한 것이다. 이 논문의 메인 포인트는 아주 작은 3*3 필터를 사용했다는 점이다. 이 작은 필터는 모델의 깊이를 16~19 layer까지 늘릴 수 있게 했으며, SOTA를 달성하였다고 한다.
2. Introduction
ILSVRC의 best-performing submission들 중 모델의 정확도를 높힐 수 있었던 두가지 기법을 소개하고 있다.
- 첫째, ILSVRC2013 (Zeiler & Fergus, 2013; Sermanet et al., 2014)에서는 첫번째 convolutional layer에 작은 receptive window size를 사용하였고, 작은 stride를 채택하였다.
- 두번째, network를 전체 이미지와 여러 다양한 스케일에서 밀도 있게 훈련하고 테스트하는 방법이다.(VGG에도 추후 나온다) 여기서 "전체 이미지" 및 "다양한 스케일"에서의 '밀도 있게' 훈련 및 테스트는 신경망을 다양한 크기 및 해상도의 입력에 대해 효과적으로 학습시키고 테스트하는 것을 나타낸다. (Sermanet et al., 2014; Howard, 2014)
이 논문에서는 'very small filter size' 즉 3*3 필터를 사용하여, 모델의 깊이와 정확도를 끌어올렸다. (Abstract에 소개되었던 내용이다. 이 모델에서 필터의 크기가 아주 핵심적인 역할을 함을 알 수 있다)
3. Architecture
위 이미지를 참고하며 읽으면 도움이 될 것이다. 위의 표에서 D는 VGG16 (16개의 layer), E는 VGG19 (19개의 layer)이다.
VGG에서는 D, E가 핵심이니 이 부분을 보면서 따라오면 된다.
- 인풋 데이터 : 224*224 RGB 이미지
- 전처리 : training set의 mean RGB 값을 각 픽셀에서 빼주었다.
- Convolution stride : fixed to 1 pixel
- 5개의 max-pooling layer : 2*2 pixel에 대해 적용, stride = 2 (non-overlapping)
- Fully connected layer 1 : 4096 채널, ReLu
- Fully connected layer 2 : 4096 채널, ReLu
- Fully connected layer 3 : 1000 채널 (이 때 당시 이미지넷 데이터셋의 class의 수), Softmax
인풋 이미지는 설정해 놓은 3*3 필터를 이용하여 convolutional layer를 통과하고, 또한 1*1 convolution filter도 사용한다.
※ 3*3 필터는 left/right , up/down , center를 capture 하기에 가장 작은 사이즈의 필터이다. 또한, 1*1 필터의 이용은 입력 채널의 선형 변환을 수행한 후 비선형성이 따르는 것으로 볼 수 있다고 한다.
4. Discussion
이 파트가 이 논문의 핵심이다. 어떻게 3*3 필터로 모델의 깊이와 정확도를 올릴 수 있었는지 설명한다.
이 논문이 제안하는 것은 다음과 같다.
- 5*5 Convolutional 필터를 1번 쓰지 말고 3*3 Convolutional 필터를 2번 쓰자.
- 7*7 Convolutional 필터를 1번 쓰지 말고 3*3 Convolutional 필터를 3번 쓰자.
이렇게만 보면 이해가 안될 수 있다. 하지만 결론적으로 저자가 말하는 것은 기존의 필터를 3*3 convolutional 필터로 대체해도, 그 결과는 equivalent 하다는 것이다.
이제 어떻게 3*3필터가 5*5나 7*7 필터를 대체할 수 있는지 알아보자.
3*3 convolution 필터가 5*5 convolution 필터를 대체함을 보이면 7*7도 비슷한 맥락으로 이해하면 된다.
5*5 인풋 데이터에 대해서 convolution을 진행해야 하는 상황이라고 가정해보자.
위 그림에 흐리게 되어 있는 5*5 Conv를 보면 당연하게도 5*5 인풋 데이터에 대해 5*5 convolutional 필터를 사용했을 때 1*1 아웃풋이 나올 것이다. 그리고 이 과정에 필요한 parameter는 5*5 = 25개이다.
이제 그 밑의 3*3 Conv를 보자. 5*5 사이즈의 인풋에 3*3 convolutional 필터를 적용하면(stride = 1), 3*3 아웃풋이 나오게 된다. 이 결과에 또 다시 3*3 convolutional 필터를 적용하면, 최종적으로 1*1 아웃풋이 나오게 된다.
즉, 5*5의 인풋 이미지에 대해 5*5 Conv 필터를 1번 사용한 결과와 3*3 Conv 필터를 2번 사용한 결과가 Equivalent 하다는 것이다. (같다는 것은 아니다)
또한 3*3 Conv 필터를 2번 사용하는 과정에서 필요한 parameter는 2*(3*3) = 18개가 된다. 또한 convolution 과정을 2번 거쳤기 때문에 non-linearity가 추가된다. (non-linear 함수 ReLu를 더 많이 사용하게 되기 때문이다)
논문에서는 3*3 필터의 3번 사용과 7*7 필터의 1번 사용을 비교하고 있는데, 산수를 해보면 3*3 필터를 3번 사용할 때 필요한 parameter의 개수는 3*(3*3) = 27이고, 7*7 필터를 1번 사용하는데 필요한 parameter의 개수는 7*7 = 49 이므로, 학습 시켜야하는 parameter의 개수가 엄청나게 줄어듬을 알 수 있다.
1*1 Conv layer는 특별한 영향을 주는 receptive fileds Conv layer가 아니지만, non-linerity를 더해줄 수 있는 방식중에 하나라고 한다.
5. Training
학습의 과정은 AlexNet에서 많이 참고를 하는 듯 하다. multinomial logistic regression 문제를 mini-batch gradient descent with momentum 방식으로 최적화 시켰다고 한다.
- Batch size = 256
- momentum = 0.9
- L2 Regularization : 5*0.0001 계수
- Dropout Regularization for first two FC layers : dropout ratio 0.5
- Learning rate : 시작은 0.01로 시작하고, validation set의 정확도가 정체될 때 마다 1/10을 곱해줌, 전체적으로 3번 감소
저자들은 두가지의 요소를 VGG의 성공 요인으로 꼽는다.
- 더 깊고 많은 Conv layer
- Pre-initialization
※Pre-initialization은 뭘까?
Network의 weight은 굉장히 중요하다. Bad initialization은 모델을 망칠 수 있다고 한다.
모델의 layer가 얕은 Table A와 같은 모델은 모든 가중치를 random initialization 해주면 되지만, 이들의 모델의 layer는 깊고, 따라서 다른 방식의 initialization 방법을 채택했다.
먼저 Table1의 A 모델을 random initialization을 통해 training시킨다. 그 뒤 깊은 모델을 학습 시킬 때, 처음부터 4번째 까지의 convolutional layer와 마지막 FC layer 3개에 net A를 이용하여 initialization 해준다. 또한, 중간 layer들은 전부 random initialization으로 설정했다. 이 때 learning rate은 감소 시키지 않았다고 한다.
※Training image size
training image size와 관련해서는 두가지만 알면 될 것 같다. 여기서 등장하는 단어는 Test 과정에서도 등장하기 때문에 잘 알아두는 것이 좋다! Multi-scale training을 하는 이유는 deep network이 적은 학습 데이터로 인한 overfitting 문제에 빠지는 것을 최대한 막기 위해서라고 한다.
- Single-scale Training : Training Sclae S를 256 또는 384로 fix해서 사용하는 방법이다. 단 384 scale을 사용할 때는 256 scale로 학습시킨 VGG의 가중치값들을 기반으로 다시 학습시킨다.(384 sclae 구간에서는 learning rate을 줄인다)
- Multi-scale Training : 256~512 scale 중 S를 random하게 설정해준다. ‘scale jittering’이라고도 한다.
6. Test
Training image를 rescaling 할 때, 기준값이 S였다면, Test image를 rescaling할 때 기준이 되는 값을 Q라고 한다. S가 Q와 같을 필요는 없고, 게다가 Training image에서 설정한 S값과 다른 Q를 적용했을 때 성능이 더 좋아지는 결과가 나왔다고 한다.
S와 Q가 달라도 되는 이유로는 test시에 첫번째 FC layer를 7x7 Conv layer, 마지막 2개는 1x1 Conv layer로 바꿔서 Fully ConVNet으로 바꾸어 평가하기 때문이라고 한다. (이 부분은 이해가 잘 안된다..) 이때 채널은 class 개수로 맞추어 출력하도록 설정하는 것이다.
또한 crop에 대해 긴 글이 쓰여져 있지만, 결론적으로 그닥 효과적이지 않다고 한다.
오늘은 VGG가 소개된 논문에서의 VGG의 구조와 구조가 갖는 의의, Training, Test 파트를 정리해 보았다.
다음 글에서는 이 논문에서 보인 실험 결과를 소개하고, 직접 Google Colab에서 구현해 보도록 하겠다.