논문 리뷰(5)- Very Deep Convolutional Networks For Large-Scale Image Recognition

이준학·2024년 7월 19일
0

논문 리뷰

목록 보기
6/15

    이번에 살펴볼 논문은 VGGNet 논문으로 알려진 "Very Deep Convolutional Networks For Large-Scale Image Recognition", Simonyan et al. (2014) 이다. VGGNet은 이전의 모델 architecture들보다 깊은 layer인 16,19 layer를 도입해 당시 SOTA보다 좋은 성능을 냈다. ILSVRC-2014에서 2등을 차지한 모델이기도 하다.

1. 저자가 이루려고 한 것

    저자가 이 논문을 통해 이루려고 한 것은 이전보다 작은 filter의 도입(3x3)을 통해 layer수가 깊은 모델을 만드는 것이었다. 이전에 depth가 깊은 network에서 나타났던 문제들을 작은 filter들을 통해 해결했다는 뜻이다. 논문에서 사용해 좋은 성능을 낸 ILSVRC dataset 뿐만 아니라 다른 image recognition task에서도 좋은 성능을 낸다고 한다. 이제 차례로 ConvNet의 구성과 training, testing 과정들을 살펴보자.

2. 주요 내용

1) ConvNet Configuration

i) Architecture

    training시의 input은 224x224 크기의 RGB 이미지이다. 전처리는 training시에 mean RGB 값을 빼주는 것 말고는 하지 않는다. filter는 대부분 3x3의 크기를 사용했는데, 이는 상하좌우의 픽셀들을 capture할 수 있는 가장 작은 사이즈이기 때문이라고 한다. 경우에 따라 1x1 filter를 사용하기도 한다. 논문에서 "1x1 filters can be seen as a linear transformation of the input channels" 라는 표현이 나오는데, 이는 1x1이 채널간의 정보를 spacial location을 지켜가며 더해주기 때문이다. 저자는 크게 5개의 네트워크 구조를 만들어 그 결과를 비교했는데, 모든 네트워크에서 Convolution stride=1, padding=1, 2x2 max pooling(stride=2) 으로 통일한다. 또한, 모든 hidden layer 뒤에는 ReLU를 배치했다.

ii) Configuration

    위의 도표를 보면 각 모델의 구조를 한 눈에 볼 수 있다. 11-19 layer로 깊이가 다양한 것을 확인할 수 있다. 이때 A-LRN에서 LRN은 Local Response normalization을 의미한다. 도입해본 결과 사용하지 않는 것보다 더 좋은 결과를 내지 못해 이후의 모델들에서는 제외시켰다고 한다. 모델에서 layer를 표현하는 방법은 기본적으로 conv(filter size)-channel 개수를 의미한다. 이렇게만 봐서는 와닿지 않아서 A network를 예시로 한 번 그려봤다.

주의할 것은 conv layer에서 FC layer로 넘어갈 때는 flattening 과정이 필요하다는 것이다. 이런 식으로 위의 네트워크 구조를 이해하면 된다.

    이때 각 모델의 parameter수를 보면, 이전에 사용된 더 shallow 한 network의 parameter 수(144M)보다 더 적거나 같다.(비교한 모델은 Sermanet et al. 2014의 모델이다.) 이렇게 적은 parameter 수로 더 깊은 네트워크를 만들 수 있었던 이유는 receptive field에서 찾아볼 수 있다. 3x3 filter 3개와 7x7 filter 1개의 parameter 수를 비교해보자. 채널 수를 C라고 가정하면, 3x3 filter 3개는 3x(3x3xCXC)개, 7x7 filter는 (7x7xCxC)개를 가진다. 같은 receptive field를 가질 때, 크기가 더 작은 3x3 filter 여러 개가 크기가 더 큰 7x7 filter 한개 보다 효과적인 것이다.

2) Classification Framework

i) Training

    기본적으로 AlexNet의 training 방식을 따른다. mini-batch GD+ momentum을 이용해 optimization을 진행하고, batch size=256, momentum=0.9로 설정했다. FC1과 FC2에는 L2 regularization과 dropout(p=0.5)을 사용했다. lr은 초기에 1e-2로 설정하고 validation accuracy가 더 이상 좋아지지 않을 때마다 10으로 나눴다고 한다. training은 AlexNet보다 depth도 더 깊고, parameter도 더 많음에도 불구하고 수렴하는데 더 적은 epoch이 걸렸다고 한다. 이는 conv filter size를 작게 한 것, 그리고 특정 layer를 미리 initialize 해놓은 것 때문일 것이라고 저자들은 추측한다.
  Initialization을 잘 하는 것은 굉장히 중요하다. 제대로 하지 않는다면 deep한 network의 불안정함에 의해 학습이 delay될 확률이 높기 때문이다. 이 문제를 피하기 위해 저자는 위의 architecture 중 가장 shallow한 A 모델부터 random initialization으로 훈련했다고 한다. 그리고 나서 더 깊은 모델들을 훈련시킬 때는 초반 4개의 conv layer들과 3개의 FC layer를 A의 parameter들로 초기화한다. 그리고 남는 나머지 layer들은 random initialization을 한다. 다만 이렇게 pre-initialize 된 layer들의 lr을 작게 하지 않고, 그 근처에서 바뀔 수 있도록 해준다. random initialization의 경우, zero mean, 1e-2 variance를 가지는 normal distribution에서 sampling한다. bias=0으로 초기화 했다.
  이제 training image에 대해 살펴보자. 여기서 ConvNet은 224x224 fixed size input을 받아야 하기 때문에 rescaled training image로부터 random하게 crop되는 과정을 거친다. 저자는 SS라는 문자를 도입한다. 쉽게 말해 training scale이라고 생각하면 된다. 논문에서는 SS 고정하는 방법, 그리고 SS를 특정 범위에서 sampling해서 이미지를 rescale 하는 방법 두 가지에 대한 실험을 진행했다.
  첫 번째로 fixed size SS를 두는 경우는 S=256, 384로 놓고 실험하였다. 이런 방법을 single-scale training이라고 한다. 먼제 S=256S=256으로 두고 모델을 훈련시키고, S=384인 경우는 훈련 시간을 줄이기 위해 S=256S=256의 parameter들로 초기화를 해놓고 lr=1e-3으로 하여 진행하였다.
  두 번째로 SS의 범위를 두고 거기서 SS를 sampling하는 방식이다. 이를 multi-scale training이라고 한다. 이때 SS의 범위는 [Smin,SmaxS_{min},S_{max}]로 설정하며, 논문에서는 Smin=256,Smax=512S_{min}=256, S_{max}=512로 놓고 실험하였다. 이 방법의 장점은 같은 object도 SS의 값에 따라 사이즈가 다를 수 있어서 일종의 augmentation 같은 효과를 준다는 것이다.(scale jittering) 마찬가지로 훈련 속도를 줄이기 위해 fixed SS=384일 때의 parameter들로 초기화 해준 후 fine- tuning을 진행한다.

ii) Testing

    test time 때는 test scale을 뜻하는 QQ를 도입한다. 이때, SSQQ가 같을 필요는 없다. 그리고 나서 FC layer들을 convolutional layer들로 바꾸어준다. FC1은 7x7 conv layer, FC2,3는 1x1 conv layer로 바꾸어준다. 이를 fully-convolutional layer라고 하는데, 이 네트워크에 crop되지 않은 이미지를 준다. 그 결과 output은 channel 수가 class수와 일치하는 class score map이 되고, input image에 따라 spacial resolution이 바뀔 수 있다고 한다. 마지막으로, input의 크기에 따라 score map이 바뀌지 않고 fixed 된 상태로 만들기 위해 spacial average를 취해준다. 최종 score는 원본과 horizontal flipped image(augmentation을 목적으로)의 결과를 average해서 낸다.
이렇게 fully-convolutional network을 도입하면 test time때 crop을 여러개 할 필요가 없다. 오히려 여러 번 crop하는 방식은 매 crop마다 새로 계산을 진행해야 하기 때문에 효율적이지 않은 방법이다. 그러나 crop을 여러 번 하는 것은 성능적인 개선이 있을 수는 있다. 더 좋은 sampling을 할 수도 있기 때문이다. 하지만 이러한 성능적 개선이 증가한 계산 시간을 뛰어넘을 정도는 아니라고 한다.
( 이 부분이 읽으면서 가장 이해하기 어려웠다...)

3) Classification Experiments

dataset은 ILSVRC-2012를 사용했다.

i) Single Scale Evaluation

    위의 single scale training에서 본 방법을 이용해 evaluation도 하는 것이다. fixed SS의 경우 Q=SQ=S로 설정했고, jittered SS, 즉 S=[Smin,Smax]S=[S_{min},S_{max}]에서 sample한 경우 Q=0.5(Smin+Smax)Q=0.5(S_{min}+S_{max})로 설정했다.

    위의 표를 보면 A에 LRN을 도입한 방법은 별 도움이 되지 않는다는 것을 알 수 있다. 때문에 B-E는 LRN을 도입하지 않았다. 또, depth가 증가할수록 classification error가 떨어진다. 주목할만한 점은 1x1 conv를 사용한 C가 3x3 conv를 사용한 D보다 성능이 안 좋다는 것이다. 이는 non linearity를 추가로 넣는 것은 좋으나, 그보다 spacial context를 포착하는 것이 더 중요하다는 것을 알려준다. network의 깊이가 19 정도 되면 error rate는 수렴한다고 한다.
  training에서 S를 scale jittering을 한 경우가 fixed S로 설정한 경우보다 더 좋은 성능을 낸다. 이는 training time에서의 scale jittering은 도움이 된다는 뜻으로 해석할 수 있다.

ii) Multi-Scale Evaluation

    이번에는 scale jittering을 test time에서 진행한다. Q를 여러 개 설정해서 성능을 보겠다는 뜻이다. 그러나 training scale과 testing scale이 너무 차이 나면 좋은 성능을 기대하기 힘들기 때문에 특정 값 3개를 정해서 evaluation을 진행한다.

    fixed size SS의 경우 Q=S32,S,S+32Q={S-32,S,S+32} 로 설정했고, training 때 scale jittering을 한 경우 Q=Smin,0.5(Smin+Smax),SmaxQ={S_{min},0.5(S_{min}+S_{max}),S_{max}} 로 설정해 성능을 평가했다. 위의 표를 통해 test time scale jittering 또한 table3의 single scale 모델들과 비교해봤을 때 더 좋은 성능을 낸다는 것을 알 수 있다. 네트워크 D,E의 성능이 가장 좋으며, 같은 네트워크 내에서도 training때 scale jittering을 하는 것이 더 좋은 성능을 낸다.

iii) Multi-Crop Evaluation

    표를 보기 전에 논문에서 얘기하는 dense evaluation과 multi-crop evaluation의 차이를 짚고 넘어갈 필요가 있다. 논문에서 dense-evaluation을 직접적으로 설명하진 않지만, 내 나름대로 알아본 결과를 공유하겠다. 두 방법 모두 여러 spacial location을 고려하는 것은 맞다. 차이가 나는 부분은 두 방법이 고안된 목적과 overlapping 유무 정도일 것 같다.
  Dense evaluation은 spacial location끼리의 overlap이 일어난다. 또, 네트워크가 이미지 전체를 보고 evaluation을 진행할 수 있도록 하기 위해 만들어진 방법이다. Multi-crop evaluation은 overlap이 일어나지 않는다. 네트워크가 다른 region에 노출되며 여러 scale의 물체들을 만나 robustness를 기르게 하는 것이 목적이다.
  결과적으로 두 방법을 같이 쓰는 것이 가장 좋은 성능을 낸다. 두 방법은 상호보완적인 부분을 가지고 있는 것이다. 저자는 이것이 두 방법의 convolution boundary 조건의 차이에서 비롯된 현상이라고 추측한다.

iv) ConvNet Fusion

    이제 여러 network들을 average해 최종 성능을 얻는 방식이다.

    submission을 한 모델의 경우 7가지 네트워크의 평균을 내서 7.3%의 top-5 test error를 얻었고, 그 이후에 multicrop과 dense eval을 이용해서 만든 네트워크 단 2개를 평균 낸 결과 6.8%의 top-5 test error를 얻었다.

위의 표는 당시 SOTA 네트워크들과의 성능 비교이다. 이전에 나왔던 모든 네트워크를 2개의 모델을 평균해서 낸 네트워크가 이겼다는 것이 놀랍다.

3. 논문 내용의 실용성

    VGG16과 VGG19는 인공지능 강의를 들으면서 한번쯤 ILSVRC 대회에서 우수한 성적을 거둔 모델로 소개된다. parameter의 차이가 꽤 많이 나는 것에 비해 성능의 차이는 그닥 많이 나지 않아서 VGG16이 더 잘 쓰인다고 한다. 무엇보다 간단한 구조로 깊은 모델을 만들고 좋은 성능을 냈다는 것이 VGGNet의 장점인 것 같다.

4. 정리

    수업 시간에 배운 내용보다 더 구체적으로 알아보다 보니, 이해하기 어려운 부분들이 조금 있었다. 특히 testing 쪽에서 FC layer를 conv net으로 바꿔 Fully-Convolutional Network로 만들고, 들어오는 input의 크기에 관계없이 fixed size score map을 뽑을 수 있다는 것이 신기했다. 이렇게 CNN Architecture들이 발전되어 온 과정을 따라가는 것도 재미있는 것 같다.

profile
AI/ Computer Vision

0개의 댓글