안녕하세요. 오늘은 VGGNet에 관한 'Very Deep Convolutional Networks for Large-Scale Image Recognition(2014)'에 대해서 정리를 해보았습니다. 지난번 Inception에 관하여 정리를 하고 난 후, ILSVRC에서 우승한 모델인 Inception 보다 2등을 차지한 VGGNet이 더 많이 활용되었다해서 호기심이 들어 논문을 찾아보게 되었습니다.


0. Abstract

우리는 convolution network의 depth가 large-scale 이미지 인식의 정확도에 어떠한 영향을 미치는지 조사하려 합니다. 핵심은 3x3 convolution fliter로 구성된 16-19 weight layer를 기반으로 depth를 늘린 네트워크를 철처히 평가하는 것입니다. 이러한 발견은 localisation과 classfication track에서 각각 1등과 2등을 차지한 ImageNet Challenge 2014 제출물을 기반으로 하였습니다.


1. Introduction

Convolutional networks(ConvNets)는 large-scale image와 video recognition에서 큰 성공을 누려왔습니다. 특히, High-Dimensional shallow feature에서 deep ConvNet에 이르기까지 deep visual recognition architecture의 발전에 중요한 역할을 수행하였습니다.

 

AlexNet과 같이 ConvNet Architecture design에 대해서 많은 연구가 이루어져왔지만 이 논문에서는 지금까지 다루지 않았던 핵심 측면인 depth에 대해서 다루고자 합니다. Architecture의 다른 파라미터를 수정하고, 매우 작은 3x3 convolution filter를 모든 레이어에 적용하여 네트워크 깊이를 점진적으로 증가시켜보았습니다. 이러한 시도 결과, 정확도가 매우 향상된 ConvNet architecture를 얻을 수 있었습니다.


2. ConvNet Configurations

증가된 ConvNet depth로부터의 성능 발전을 측정하기 위해, 모든 ConvNet layer의 파라미터를 동일하게 설정하였습니다.

 

2.1. Architecture

ConvNet의 입력 값은 고정된 사이즈의 224 x 224 RGB 크기 입니다. preprocessing(전처리)단계에서는 training set의 각 픽셀에서 RGB의 평균 값을 빼주는 작업을 해주었습니다. 이미지는 매우 작은 3x3 filter가 적용된 conv layer의 stack을 통과하게 되며, 추가적으로 1x1 convolution filter를 사용하였습니다. 3x3 filter를 사용한 이유는 상/하/좌/우/중심을 파악하기 위핸 최소한의 크기가 3x3 이기 때문이며, 1x1은 비선형성을 더해주기 위함이지만 input channel의 선형 변환으로 보였다고 합니다. stride는 1이며 padding size 또한  convolution 연산 이후 공간적 정보가 보존되도록 하기 위해 1로 설정하였습니다. 추가적으로, Stride가 2인 2x2 size의 max-pooling layer가 5개 적용되었습니다. 

 

Convolution layer stack은 두 개의 4096 채널의 FC layer와 1개의 1000 채널의 FC layer로 구성되었으며, 마지막 레이어는 soft-max layer 입니다. FC layer의 configuration은 모든 네트워크에서 동일합니다.

 

모든 Hidden layer에는 활성화 함수로 ReLU를 사용했으며, LRN normalisation은 메모리 소비량과 연산량만 증가시킬 뿐 ILSVRC 데이터 셋에 대한 성능은 증가시키지 못하기 때문에 사용하지 않았습니다(Section 4.1에서 추가적인 내용 서술).

 

*3x3 filter가 상하좌우 + 중심의 notion을 파악하기 위한 최소 사이즈라고 논문에 서술되어 있는데 이에 대하여 이유가 궁금하지만 답을 찾지 못한 상태입니다. 향후 이유를 알게 된다면 추가적인 업데이트를 하도록 하겠습니다.

 

2.2 Configuration

ConvNet Configuraion.

각 ConvNet configuration은 Table 1의 하나의 열로 되어있습니다(A-E). 모든 configuration은 2.1.의 설명과 동일하며, 오직 depth만 11 weight layer(8 conv.와 3 FC layer)에서 19 weight layer(16 conv.와 3 FC layer)로 다릅니다. conv. layer의 width(채널의 갯수)는 오히려 작으며, 각 max-pooling layer에서 64개로 시작하여 최종적으로 512개 까지 2배씩 늘어나게 됩니다. 

 

Table 2에는 각 configuration의 파라미터 갯수를 기록해두었습니다. 큰 depth에도 불구하고, 더 큰 conv. layer width와 receptive fields로 구성된 shallow net에 비하여 더 적은 파라미터 갯 수를 가지고 있습니다. 

 

*학습파라미터 수가 다른 네트워크에 비해 적으면서도 낮은 에러율을 보였다는 것은 그만큼 VGGNet의 학습 효율성이 높다는 의미도 담고 있는 것 같습니다. 

 

 

2.3. Discussion

VGGNet의 configuration은 ILSVRC-2012와 ILSVRC-2013에서 최상위 성능을 보여준 모델들과는 꽤 다릅니다.  11x11 필터를 쓴 AlexNet 또는 7x7 필터를 쓴 ZFNet 과 달리 상대적으로 큰 receptive fields를 첫번째 conv. layer 에 사용하지 않고 전체 네트워크에 아주 직은 3x3 receptive fields를 사용하였습니다. 그럼 7x7을 사용하지 않고 3x3 conv. layer를 사용한 이유는 무엇일까요?

첫번째로, 명확한 의사결정을 위해 더 많은 비선형성을 부여하기 위함이고 두번째로 파라피터수를 줄이기 위함입니다.

 

채널 갯수를 C라고 하였을 때, 3개의 3x3 filter를 사용하는 것은 총 3 * 3^2*C^2개의 학습 파라미터 수를 가집니다. 반면 1개의 7x7 필터를 사용할 경유 7^2*C^2개의 학습 파라미터수를 가지게 되죠. 즉 전체적으로 보았을 때, 약 81% 적은 파라미터를 사용하게 됩니다.

 

또한 1x1 conv. layer(config C, Table 1)를 사용하였는데 이것은 conv. layer의 receptive fields에 영향을 주지 않고 의사결정 함수의 비선형성을 증가시키기 위함입니다. 


3. Classification Framework

이전 섹션에서는 VGGNet의 configuration의 detail에 대해서 설명하였습니다. 이번 섹션에서는 classification ConvNet의 학습과 평가에 대해 서술하고자 합니다.

 

3.1. Training

ConvNet 학습 과정은 전반적으로 AlexNet과 유사합니다(향후 설명하겠지만, Multi-scale 학습 이미지들로 부터 입력 값을 샘플링하는 법은 다른 방식을 사용하였습니다). 역전파를 기반으로한 mini-batch gradient descent(경사하강법)을 multinominal logistic regression objective 에 적용하여 학습을 진행하였습니다. 하이퍼 파라미터 세팅은 다음과 같습니다.

  • batch size = 256
  • momentum = 0.9(optimizer)
  • L2 = 5*10^-4 & dropout(p = 0.5)(regularization)
  • learning rate = 10^-2
  • validation set accuracy가 증가하지 않을 경우 learning rate 10배 감소(scheduler)

최종적으로, learning rate는 3번 감소하였으며 학습은 370K iteration(74 epoch)를 거친 후 종료 되었습니다.

AlexNet에 비해 더 많은 수의 파라미터와 깊이에도 불구하고 converge 하기 위해 더 적은 epoch가 필요한 이유는 다음 두가지라고 추측합니다.

  • 더욱 깊고, 작은 conv. filter 사이즈로 인한 Implicit regularisation
  • 특정 레이어의 pre-initialisation

특히나, 잘못된 initialisation은 심층 네트워크의 기울기의 불안정성을 야기하여 학습을 방해할 수 있기에 initialisation은 매우 중요합니다. 이러한 문제점을 예방하기 위해 deeper architecture을 학습할 때 처음 4개의 conv. layer와 마지막 3개의 FC layer에 대한 initialise를 해주었습니다. 

 

또한, 고정된 사이즈의 224x224 ConvNet 입력 값을 얻기 위해, 학습 데이터를 rescaling하여 crop 하였습니다.

 

*Training image size

Training scale S를 설정하기 위해 두가지 접근법을 고려해보았습니다. 

 

첫번째로, single-scale training에 일치하도록, S를 고정하는 것입니다. 실험 내에서,  S를 256과 384로 고정하여 학습된 모델을 평가해보았습니다. 주어진 ConvNet configuration에서, S 를 256으로 설정하여 네트워크를 학습시켰습니다. 그리고 S = 384인 네트워크의 학습 속도를 증가시키기 위해, S = 256으로 pre-trained 된 데이터로 weight를 초기화 하고 10^-3인 더 작은 초기 learning rate를 사용하였습니다.

 

두번째 접근법은 multi-scale training입니다. [min S  = 256, max S = 512]에 해당되는 범주 내에서 랜덤한 S 값을 통해 학습을 시키는 방법으로, 이미지 속 object들이 각기 다른 사이즈로 있을 수 있기 때문에 충분히 고려해볼만한 방법이라고 생각하였습니다. 또한 속도상의 이유로 multi-scale 모델을 S = 384로 pre-trained된 single-scale model을 fine-tuning하여 학습 시켰습니다.

 

3.2. Testing

주어진 학습된 ConvNet 과 입력 이미지에 대하여 다음과 같은 과정으로 분류되었습니다. 

첫번째로, pre-defined test image를 rescale 해줍니다. 앞선 training 과정과 유사하게 rescale된 test image를 네트워크에 적용합니다. 그런 다음, FC layer 대신 convolutional layer들을 적용하여 검증을 진행합니다. 첫번째 FC layer를 7x7 conv. layer로 변경하고, 마지막 두개의 FC layer는 1x1 conv. layer로 변경합니다. 결과적으로, 전체 이미지(uncropped)에 fully-convolutional layer가 적용됩니다. 최종적으로, 이미지에 대한 고정된 class score vector를 획득하기 위해 class score map에 sum-pooled를 적용합니다. 뿐만 아니라 horizontal flipping을 통해 test set을 augument하고,  softmax가 적용된 original 이미지와 flipped image의 평균을 구하여 최종 score를 얻습니다.

 

3.3 Implementation Details

C++ Caffe toolbox를 사용하였으며, training과 evaluation에 GPU를 사용하기 위해 변형하여 사용하였습니다. 트레이닝 이미지를 각 batch로 분할하여 GPU 상에서 병렬적으로 처리하였으며, 연산 후 전체 이미지에 대한 gradient를 얻기 위해 평균 값을 구하였습니다. Gradient 계산은 모든 GPU상에서 동시에 이루어져 단일 GPU로 연산했을 때와 같은 결과를 얻습니다. 또한, 단일 GPU보다 4-GPU를 통한 연산이 약 3.75배 빠르다는 것을 알 수 있었습니다.


4. Classification Experiments

*Dataset

이번 섹션에서는 ILSVRC-2012 데이터셋을 기반으로 VGGNet의 image classification 결과에 대해 서술하고자 합니다. 

  • 3 set으로 분리되는 1000class의 이미지
  • 1.3M개 image for training, 50K image for validation, 100K images for testing

classification performance는 top-1 & top-5 error를 기반으로 측정하였습니다.

( top-1 error는 multi-class classification에서 잘못 분류된 이미지의 비율이고 top-5 error는 ILSVRC에서 사용된 주요 평가 기준으로 예측된 범주 밖에 있는 이미지의 비율입니다.)

 

4.1. Single Scale Evaluation

 

Section 2.2에서 서술하였던 것과 동일한 configuration을 기반으로, 각 ConvNet 모델의 성능을 측정하였습니다. 테스트 이미지 사이즈 Q는 고정된 S와 [min S, max S] 범주 내의 0.5 * (min S + max S) 값과 동일합니다. 결과는 위 Table 3에 나와있습니다.

 

첫번째로, LRN을 사용하는 것은(A-LRN 네트워크)는 모델 A의 성능을 증진시킬 수 없음을 알 수 있습니다. 따라서, deeper architectures(B-E)에 normalisation에 적용하지 않았습니다.

 

두번째로, 모델 A의 11 layer부터 모델 E의 19 레이어까지 보면 증가된 ConvNet depth는 classification error를 감소시킨다는 것을 알 수 있었습니다. 특히, 같은 depth에도 불구하고 3x3 conv. layer로만 구성된 configuration D가 1x1 conv. layer 3개를 포함한 configuration C에 비해 좋은 성능을 보여주었습니다. 이는 추가적인 비선형성이 도움이 되지만(C의 성능 > B의 성능), receptive field에서 conv. filter를 통해 공간적 context를 잡아내는 것 또한 중요하다는 것을 의미합니다. 또한, 19개의 layer에 도달한 모델이 가장 좋은 성능을 보였으며, B모델과 B모델의 3x3 conv. layer 한 쌍을 5x5 conv. layer로 대체한 모델을 비교하였을 때 3x3 conv. layer를 사용한 B 모델이 7% 정도 더 좋은 성능을 보였습니다. 

 

마지막으로, 고정된 S 사이즈(S = 256 , S = 384)를 사용하는 것 보다 scale jittering을 사용하는 것이 training에 있어 더 좋은 결과를 보여주었습니다. 

 

* 1x1 conv. layer를 사용하는 이유는 크게 3가지가 입니다.

1) 채널 수 감소   2) 채널 수 감소를 통한 연산량 감소 3) 비선형성의 증가

 

4.2. Multi-scale Evaluation

이번 섹션은, 테스트 이미지의 다양한 rescale 버전에 대해 서술하도록 하겠습니다. training과 test 사이의 큰 차이는 성능 하락에 영향을 줄 수 있다는 점을 고려하여, training 할 때와 유사하게 3개의 이미지 사이즈로 모델을 학습시켰습니다 ( Q = { S - 32, S, S + 32} ). 동시에, training 할 때 수행했던 scale jittering이 테스트 시에도 더 넓은 범위의 scale을 네트워크에 적용할 수 있도록 해주어서 [min S; max S] 범위의 고정되지 않은 S로 학습된 모델에 대하여 대하여 더 큰 범위인 Q = {min S, 0.5*( min S + max S), max S}의 범주로 측정하였습니다.

 

실험 결과는 Table4에 정리되어 있으며, test할 때에도 scale jittering이 더 좋은 성능을 보여준다는 것을 알 수 있습니다.

 

4.3. Multi-Crop Evaluation

Table5는 dense ConvNet evaluation과 multi-crop evaluation을 비교한 결과입니다. 이에 더불어, 두 가지 평가기법의 softmax output을 평균화하여 complementarity 또한 측정하였습니다. multiple crop을 사용한 것이 dense ConvNet보다 약간 더 좋은 성능을 보였으며, 두 가지 접근법이 상호보완적임을 확인할 수 있었습니다. 이러한 결과는 convolution 경계 조건의 다른 처리 방식으로 인한 것으로 보입니다.

 

4.4. ConvNet Fusion

앞선 섹션의 상호보완성에 대한 정보를 기반으로, 몇몇 모델의 output을 조합하여 보았습니다.

 

7개의 네트워크를 앙상블 한 결과 7.3%의 ILSVRC 테스트 에러를 기록하였습니다. 이후, 가정 성능이 잘 나온 두 개의 multi-scale model을 앙상블 하여 실험해본 결과 dense evaluation에서는 테스트 에러를 7.0% 까지,  dense와 multi-crop evaluation을 조합한 방식의 테스트 에러를 6.8% 까지 낮추었습니다. 참고로, 최고 성능의 단일 모델은 7.1% 에러를 기록한 모델 E(Table 5) 입니다.


5. Conclusion

우리는 큰 scale의 이미지 분류에 있어서 아주 깊은 convolution network(19 weight layer) 측정을 통해 depth가 classification accuracy에 효과적이라는 사실을 증명했습니다.


*생각 정리

- 상/하/좌/우/중심의 notion을 capture 하기 위한 최소 조건이 3x3 Size인 이유가 filter의 중심 칸을 기준으로 상/하/좌/우로 모든 칸이 존재하는 사이즈가 3x3이기 때문이지 않을까 라고 추측해봤습니다.

- LRN의 배제한 이유가 모델 A에 적용해봤을 때, LRN을 적용하지 않은 original 모델 A가 더 성능이 좋아서 라고 서술되어 있습니다.

모든 layer의 configuration을 동일하게 세팅했기에 제일 단순한 모델로의 결과로 일반화 시킬 수 있다고 생각하면서도 depth가 다른데 한 모델의 결과만으로 일반화를 해도 되는 것인지 의문이 들었습니다. 이 점은 아직 정확하게 몰라서 생길 수 있는 생각의 충돌이라는 생각이 들어서 좀 더 공부를 해보려고 합니다. 


역시 논문을 읽는 것은 아직까지는 버거운 과정이네요. 논문을 읽으며 이 논문은 어느 부분이 잘쓰였는지, 아쉬운 점이 뭔지 등을 파악해가며 읽을 수 있으면 참 좋을 것 같지만 아직까지는 실력이 모자른 것 같습니다. 그래도 이름으로만 들어봤던 모델들을 설계 이유부터 설계 과정, 근거 그리고 모델의 성능 등 자세히 공부해볼 수 있다는 점이 큰 장점 같습니다. 

 

아직 실력이 매우 미흡하여 글에 틀린 부분이나 잘못 정리한 부분, 오역 등이 있을 수 있습니다. 댓글을 통해서 피드백을 주시면 감사하겠습니다.

 

읽어주셔서 감사합니다.


Reference

https://arxiv.org/pdf/1409.1556v6.pdf

https://phil-baek.tistory.com/entry/1-Very-Deep-Convolutional-Networks-for-Large-Scale-Image-Recognition-VGGNet-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0

https://ahnty0122.tistory.com/72

 

+ Recent posts