산 넘어 산 개발일지

[논문 리뷰] VGG16(ICLR 2015) 요약 및 리뷰 본문

논문 리뷰/CV

[논문 리뷰] VGG16(ICLR 2015) 요약 및 리뷰

Mountain96 2021. 9. 6. 18:00

 

서론

1. 배경

  Convolutional networks(ConvNets)는 대용량 이미지 및 영상 인식에서 큰 발전을 이룩하였는데, 이는 ImageNet과 같은 대용량 공공 이미지 데이터셋이 가능해지고, GPU와 같은 고성능 컴퓨팅 시스템이 등장했으며, ImageNet Large-Scale Visual Recognition Challenge(ILSVRC)와 같은 대회가 있었기 때문에 가능했다.

  ConvNets이 사람들에게서 자주 사용됨에 따라, 기존의 큰 성공을 거두었던 AlexNet에서 이를 더 발전시키기 위한 여러 시도들이 나타났다. 그 시도들에서 성공한 케이스들 중 하나는, 첫 번째 convolutional layer에서의 작은 receptive window 와 작은 stride를 사용했다. 또 다른 케이스에서는 이미지 전체와 다중 스케일에 관해서 밀접하게 모델을 훈련시키고 테스트하는 것을 시도했다. 이번 논문에서는, ConvNet의 또 다른 면모인 "깊이"에 대해서 다루고자 한다. 마지막에는 파라미터를 고정하고 오로지 네트워크의 층(convolutional layer)만을 늘리는데, 이는 굉장히 작은 convolution filter(3x3)을 모든 레이어에서 사용하기 때문에 가능하다.

  결과적으로, ConvNet 구조를 발전시켜서 ILSVRC에서 SOTA(state-of-the-art)를 달성했으며, 다른 데이터셋에서도 충분한 성능을 발휘했다. 특히, 다른 데이터셋에서의 간단한 파이프라인에서조차 뛰어난 성능을 발휘했다(예를 들어, linear SVM without fine-tuning)


본론

2. ConvNet 구조

  ConvNet이 향상했다는 것을 측정하기 위해, 모든 ConvNet layer는 같은 원칙으로 디자인되었다.

2-1. 구조

ConvNet

  - Input : 224 x 224 RGB

  - Preprocess : Training set의 각 픽셀에 RGB의 평균 값을 빼주는 것

  - Conv. filter : 3x3. 한 configuration에서는 1x1를 사용하여 input channel을 선형변환(linear transformation)했다.

  - Conv. stride : 1pixel

  - padding : Conv. layer를 지날 때 data의 크기가 변하지 않도록 padding을 주었다. ex) 3x3 filter라면 padding = 1pixel

  - pooling : 5개의 max-pooling layer가 있으며, 모든 Conv. layer에 붙은 것이 아니다. pooling은 2x2 사이즈의 window로 진행되었다.

FC Layer

  - 3개의 FC layer가 있으며, 처음의 두 개는 4096 차원이고, 마지막 하나는 1000차원이다(ILSVRC의 클래스 개수)

  - 마지막 layer는 soft-max layer이며, 모든 네트워크에 대해서 FC Layer부분은 전부 동일하다.

그 외

  - 모든 hidden layer들은 ReLU를 사용했으며, 한 네트워크를 제외한 나머지 모든 네트워크들은 LRN(Local Response Normalization)을 사용하지 않았다.

  - 이후 LRN이 성능을 향상시키지 못할 뿐더러, memory 사용량과 시간비용을 증가시킨다는 것을 설명한다.

 

2-2. Configuration

   모델들을 A-E까지 총 6개로 나누어서 비교했으며, 모든 모델의 configuration은 같고, 오직 깊이만이 다르다.(11 layers -> 19 layers) 

  모델의 width(channel 수)는 적은 편인데, 첫 번째 layer에서 64로 시작해서, 최대 512까지만 늘어난다.

 

2-3. Discussion

  첫 번재 레이어에서 큰 receptive field를 쓰는 대신 3x3 의 작은 receptive field를 사용했다. 이렇게 3x3의 작은 필터를 사용해서 여러 층을 구성하면 7x7과 같은 큰 필터를 사용해서 한 층에 끝내는 것보다 여러 이점이 있다. 첫 번째 이점은 3개의 비선형 레이어를 추가시킴으로써 비선형성을 증가시켜 모델이 더 잘 구분하도록 돕는다. 두 번째 이점은 파라미터의 개수다. 만약 input, output의 channel 수가 C라고 하면, 3x3으로 3개의 layer를 쌓았을 때의 파라미터 개수는 3(3x3xCxC) = 27C^2이다. 반면, 7x7일 경우 7x7xCxC = 49C^2이다.

  또 주목해볼만한 정믄 1x1 conv. layer를 사용했다는 점이다. 1x1 conv. layer는 채널수조정, 계산량 감소, 비선형성 증가 등 여러 이점이 있는데, 이 중 논문에서는 비선형성 증가에 중점을 두었다. 1x1 conv. layer는 receptive field를 건드리지 않고 비선형성을 증가시키는 좋은 방법이다. 물론 위 네트워크에서는 1x1 conv. layer를 사용함에 따른 깊이의 변화가 일어나지 않지만, rectification function(아마 ReLU를 지칭하는 듯하다)를 추가함으로써 비선형성이 증가한다.

  여러 다른 논문들에서 공통점과 차이점을 찾을 수 있는데, 한 논문에서는 첫 번재 layer에 작은 convolution filter를 사용했지만 위 네트워크만큼 깊이 구성하지 못했고 ILSVRC같은 대용량 이미지에 적용하지 못했다. 또 다른 논문에서는 깊은 ConvNet을 사용하여(11 layers) 이 "깊이"가 모델 성능 향상에 기여한다는 것을 밝혔다. 마지막으로 GoogLeNet의 경우 이 논문과 독립적으로 만들어졌지만 모델이 깊다는 점, 그리고 작은 convolution filter를 사용한다는 점에서는 비슷하다. 그러나 GoogLeNet의 배치 혹은 구조(==topology)가 보다 복잡하고, 첫 번째 layer에서 feature map의 크기를 더 과가함게 줄임으로써 계산량을 더욱 감소시켰다.

 

3. 구현

3-1. 훈련(Train)

전반적인 훈련은 기존 AlexNet을 따르며, 이미 전처리 부분만 조금 다르다.

 

  - Optimization : multinomial logistic regression / mini-batch gradient descent with momentum (batch size : 256, momentum : 0.9)

  - Regularization : weight decay(L2 Norm with 5*10^-4)

  - dropout : 0.5(첫 두 개의 FC Layer에 적용)

  - learning rate : 초기 0.01, 이후 validation accuracy가 증가하지 않으면 lr /= 10. 으로 설정하여 최종적으로 3번 갱신됨(최종 lr : 0.00001)

  - 74 epochs

 

여기서 위 네트워크는 기존 AlexNet보다 더 많은 파라미터와 깊은 네트워크였음에도 불구하고 수렴하기까지 더 적은 에포크가 필요했는데, 그 이유로 2가지가 있다.

  첫 번째는 더 깊어진 깊이와 작아진 conv. filter로 인해 암묵적(?)으로 적용된 정규화(regularization)이다.

  두 번째는 몇몇 레이어들에 대한 초기화 작업이다.

 

  가중치가 나쁘게 초기화되면 깊은 네트워크에서 불안정한 수치 및 기울기로 인해 학습에 안좋은 영향을 끼치는데, 이 때문에 가중치의 초기화가 중요하다. 이처럼 나쁜 초기화를 피하고자 본 논문에서는 configuration A(A 네트워크)를 먼저 학습시켰다. 왜냐하면 A 네트워크는 상대적으로 얕기 때문에 무작위 초기화(random initialization)로도 충분히 성능을 낼 수 있기 때문이다. A 네트워크 훈련 이후로 더 깊은 타 네트워크들을 훈련할 때에는 초기 4개의 convolutional layer와 마지막 3개의 FC layer를 A 네트워크에서 가져와서 초기화하였고, 나머지 중간 레이어들은 랜덤하게 초기화했다.

  Learning rate의 경우 특별히 인위적으로 줄이진 않았고, 위에서 언급한 것처럼 학습 도중에 줄어들게 설정했다. A네트워크와 타 네트워크의 중간 레이어들에서 랜덤하게 초기화할 때는, [mean=0, var=0.01]인 정규분포에서 샘플링했고 bias는 0으로 설정했다. 그러나 논문 발표 이후 가중치 초기화에 효과적인 Xavier(Glorot) initialization을 알게 되었고 이를 사용할 수 있음을 언급했다.

 

  이미지 전처리는 244x244사이즈로 맞추기 위해 진행된다. 또한 이미지 증강으로는 랜덤 좌우반전과, 랜덤 RGB color shift가 적용되었다. 이미지 사이즈의 경우 최소 256에서 최대 512까지 이미지 크기를 랜덤하게 변환하고, 변환된 이미지에서 객체가 포함된 224x224부분의 이미지를 crop하여 사용하였다. 이 때 크기 변환을 작게 할 경우(e.g 256) 객체의 전체 크기에 대한 특징을 추출하기에 용이하고, 크게 변환할 경우(e.g 512) 224x224로 crop되는 부분이 객체의 부분에 한정되기 때문에 보다 부분적이 특징을 추출하기에 용이해진다. 이처럼 다양한 스케일로 이미지 크기를 변환하여 샘플링한 경우가 하나의 스케일로 이미지를 변환하여 샘플링한 경우보다 분류 정확도가 높았다고 한다.

 

3-2. Testing

  테스트 시, Single scale과 Multi-scale로 나누었는데, Single scale의 경우 하나의 사이즈로 고정하여 test 이미지들을 rescale해주었다. 다만, 이 rescale에 사용되는 비율은 train과 다를 수 있음에 유의하자.

  Multi-scale의 경우 모델 네트워크 뒤의 FC Layer들을 Convolutional layer로 변환하여 Fully Convolutinal Network(FCN)로 만들었다. 이 때 첫 번째 FC layer는 7x7 conv. filter를 사용하고, 나머지는 1x1 conv. filter를 사용했다. 이렇게 해서 모든 이미지를 crop하지 않고 테스트할 수 있었고, 고정된 크기의 class score에 대한 vector를 얻기 위해 결과물인 class score map은 spatially averaged되었다. 또한 test set은 좌우반전하여 증강시켰다.

  FCN이 적용되었기 때문에 crop을 할 필요가 없어진다. 사실 crop을 하는 편이 정확도가 높아지기는 한다. 또한, multi-crop evaluation은 dense evaluation에 대해 상호보완적으로 작용하는데, 왜냐하면 multi-crop evaluation의 경우 crop 될 때  convolved feature map이 0으로 padding(zero-padding)되지만, dense evaluation의 경우 crop 될 때 이웃하는 픽셀들에 따라서 padding되기 때문이다. 이렇듯 crop은 시간이 많이 걸리지만 그만큼 정확도가 높아질 수 있다. 그럼에도 불구하고 논문 저자들은 걸리는 시간 비용 때문에 이것이 그만큼 실용적이라고 생각하지는 않는다.(라고 해석했다...조금 어렵다 이부분이..ㅠ) 그래도 본 논문의 모델을 증명하고자 네트워크를 한 scale마다 50crop으로 나누어서(5 x 5, 2flips) 총 3 scale에 대해 150개의 crop을 만들었다.

 

3-3. Detail

  C++ Caffe toolbox로 작성함(다수의 수정)

  여러 GPU를 사용했으며 이를 통해 데이터병렬화를 거쳤고, 각 batch마다 할당된 데이터들을 여러 GPU에 분산해서 계산했다. 이후 나온 결과들은 평균화된 뒤 합쳐져서 full batch에 적용되었기 때문에 하나의 GPU를 사용한 것과 결과는 똑같다.

  ConvNet의 훈련 속도를 향상시키기 위한 방법들이 여러 논문에서 제시되었는데, 본 모델에서는 이미 기존보다 약 3.75배 빠른 속도로 훈련할 수 있는 기법을 사용하고 있었으므로 따로 사용하지 않았다. 사용한 GPU는 4개의 NVIDIA Titan black GPU이며, 하나의 네트워크를 훈련하는데 약 2~3주가 걸렸다.

 

4. 실험 

  데이터셋 : ILSVRC 사용. Training(1.3M), Validation(50K), Test(100K)

4-1. Single Scale Evaluation

  앞서 언급한 것처럼, 본 논문은 Evaluation을 할 때 Single Scale 과 Multi-Scale로 나누어서 진행했다. 이는 Test 시 이미지의 크기를 하나로 고정할지, 또는 여러개를 사용할지를 나타낸다.

  Train 할 때도 이미지를 하나의 사이즈로 고정하기도 하고, 여러 사이즈로 스케일을 다양하게 해서 훈련하기도 하고 했다. 이 때 사용되는 rescale 비율을 S라고 하고, Test에 사용되는 rescale 비율을 Q라고 하자. 고정된 S로 훈련된 모델의 경우 Q=S로 설정했고, S가 계속 변화한다면 Q = 0.5 * (S_min + S_max) 로 설정했다.

  첫 번째로, A네트워크와 A-LRN네트워크를 비교한 결과 LRN이 성능 향상에 도움을 주지 못한다는 것을 알 수 있다. 그렇기 때문에 이후 더 깊은 네트워크들에서는 LRN을 사용하지 않았다.

  두 번째로, ConvNet의 깊이가 깊어짐에 따라 Classification error가 낮아지는 것을 확인할 수 있다. 특이하게도, C와 D는 깊이가 같지만 성능은 D가 더 좋다. C는 3개의 1x1 conv. layer를 사용했고, D는 오로지 3x3 conv.layer만을 사용했다. 이를 통해 추가적인 비선형성이 도움이 되기는 하지만, 필요한 만큼의 receptive field를 사용하여 공간적인 특징을 잘 잡아내는 것도 중요하다는 것을 알 수 있다. 본 구조에서는 19layer 이후부터는 error rate가 급증하지만, 더 큰 데이터셋에서는 더 깊은 모델이 잘 작동할 수도 있다고 언급한다. 추가적으로 B네트워크와 이보다 조금 더 얕은 네트워크(B네트워크에서 두 개의 3x3 conv. layer를 하나의 5x5 conv.layer로 바꾼 네트워크)를 만들어서 비교했었는데, 더 얕은 네트워크의 top-1 error가 B네트워크보다 7%가량 더 높았다. 이를 통해 [deep network + small filter]가 [shallow net + large filter]보다 더 성능이 좋다는 것을 확인할 수 있다.

  마지막으로, 훈련 시 이미지 스케일에 변화를 주는 것(S = 256 ~ 512)이 스케일을 고정하는 것보다 훨씬 더 성능을 높여준다는 것을 확인하였다. 이를 통해 훈련 시 스케일 변화(scale jittering)를 사용한 데이터 증강이 도움이 된다는 것을 확인할 수 있다.

4-2. Multi-Scale Evaluation

  이번에는 test시 스케일 변화를 준 경우이다. 만약 훈련에서 사용된 스케일이 고정된 경우, 너무 지나친 스케일 변환은 성능을 크게 떨어뜨린다는 것을 확인하였다. 따라서, 훈련에서 사용된 스케일이 고정된 경우, Q = {S - 32, S, S + 32} 이 3가지비율로 변화되었다. 훈련에서 사용된 스케일이 변화하는 경우, Q = {S_min, 0.5(S_min + S_max), S_max} 이 3가지로 변화되었다.

  결과를 보면, test 시 스케일 변화를 주는 것이 성능 향상에 도움이 된다는 것을 알 수 있다.

4-3. Multi-Crop Evaluation

  이번에는 Multi-crop evaluation과 Dense-evaluation, 그리고 이 두 경우를 합한 경우를 비교해본다. 앞에서 언급한 것처럼, 두 경우는 서로 상호보완적이기 때문에 합할 때 각 모델의 softmax값을 평균해줌으로써 두 모델을 합했다고 한다. 결과에서 알 수 있듯이, multi-crop의 성능이 약간 더 좋았고, 이보다 더 좋은 건 두 경우를 합한 경우였다.

4-4. Convent Fusion(앙상블)

  앙상블을 통해 모델끼리 서로 상호보완적으로 작동하여 성능이 높아진다는 논문이 있었다. 이를 사용하여 Single scale 모델 6개와 multi-scale 모델 D를 합쳤고, 그 결과 ILSVRC에서 7.3%의 test error를 기록했다. 기록 이후 따로 또 실험을 했는데, multi-scale모델에서 가장 성능이 좋았던 두 모델 D, E를 사용하여 앙상블을 한 결과 test error 7.0%를 달성했다.

4-5. SOTA와의 비교


결론

 이 논문에서는 deep convolutional networks(최대 19 layer)를 보여주었다. 이를 통해 모델의 "깊이"가 classification 성능에 굉장히 유익하다는 것을 알 수 있다.


리뷰

  AlexNet에 이은 두 번째 딥러닝 네트워크인 VGG 이다. 겉으로 보기에는 단순히 "깊이만 증가시켰더니 모델의 성능이 좋아졌다!" 라고도 보였는데, 그 안의 내용들을 읽으면서 연결되어 있는 많은 개념들을 따로 공부할 기회가 있었다.(물론 논문 자체에서도 배울 점이 많았다.)

  논문과 연계되어 따로 공부한 것들에는 

 

    1. 비선형성의 증가가 좋은 이유

    2. 1x1 convolution의 필요성

    3. 가중치 초기화

    4. Fully Convolutional Network(FCN)

 

  가 있다. 이 중 4번은 따로 논문 리뷰를 해야 할 것 같다. 그 외 1~3번 같은 경우 시간이 나면 따로 정리를 해볼 예정이다. 지금 포스팅은 논문에 관한 리뷰이니 이것들은 넘어가도록 하겠다.

 

  우선 VGG의 핵심은 convolutional layer에서 사용된 3x3 필터인 것 같다. 사실 AlexNet을 만든 사람들도 모델을 더 깊게 만들고 싶었을 것이다.(개인적인 추측이다..) 그러나 현실적으로 너무나도 많은 파라미터와 오랜 학습시간으로 인해 그들이 찾은 절충안이 7-layer일 것이다. 그러나 VGG에서는 이를 뛰어넘어 최대 19layer까지 만들어냈다. 이를 가능하게 한 것은 3x3 conv. filter이다. 모든 conv. layer에서 3x3 사이즈의 필터를 사용했기에 파라미터수가 지나치게 크지 않았고, 그 때문에 모델을 깊게 구성할 수 있었다. 이와 연관지어 설명한 (3x3 filter x 3 VS 7x7 filter x 1) 부분이 인상깊다. 그들은 3x3 filter를 사용하여 단순히 파라미터의 개수만 줄인 것이 아니라, 비선형성을 증가시킴으로써 전체적인 모델의 성능 향상도 이끌어냈다. 어떻게 이 부분을 고안했는지가 참 궁금하다. 물론 그들이 참고한 문헌 중에 "작은 receptive filed와 작은 stride"를 사용하여 성능을 향상시킨 논문이 있다. 그렇다고는 해도 모든 layer에 일정하게 3x3 filter를 적용시킨 점, 그리고 이를 더 큰 필터와 비교하여 장점을 이끌어낸 점이 굉장하다고 생각한다. 읽으면서, "그러면 1x1 filter를 사용하면 더 좋은 것이 아닌가?" 라는 생각도 들었다. 그러나 논문에서도 나와있듯이, 너무 많은 1x1 filter는 오히려 필요한 만큼의 공간적인 정보를 찾아내는 것에 걸림돌이 될 수도 있다.

  또 한 가지 신기했던 것은 이들의 Test 방법이다. Test 시 이들은 scale을 다르게 변환해가며 test를 진행했다. 사실 아직도 왜 이렇게 single-scale과 multi-scale을 구분했는지 잘 이해가 가지 않는다. 물론 multi-scale이 조금 더 현실에서 쓰이기에 적합한 test 라는 것은 인지했다. 그렇지만 애초에 AlexNet과 VGG는 고정된 이미지 크기의 데이터들을 분류하기 위해 고안된 모델이 아닌가? 이 부분은 FCN을 공부함으로써 조금 더 해답에 가까워질 수 있을 것 같다. 또 Train 시 이미지의 전처리 방법에서도 scale에 변화를 준 것이 인상깊다. 서로 다르게 잘라가며 어떨 때는 물체의 전체를, 또 어떨 때는 물체의 일부를 주면서 모델을 학습시키는 방법. 이것이 실제로 더 좋은 학습 방법인지는 앞으로 공부를 더 해보면 알 수 있을 것 같다.

 

  정리하자면, 다음과 같다.

  1. 3x3 사이즈의 conv. filter

    1-1. 어떻게 3x3 conv. filter를 사용해보자고 생각하게 되었는가?

    1-2. 3x3 conv. filter의 정당성을 7x7와 비교하면서 얻어낸 과정

  2. Single-scale VS Multi-scale

    2-1. 왜 고정된 크기의 이미지 분류를 위해 고안된 모델에서 multi-scale을 적용하였는가?

    2-2. train 시 scale을 다르게 crop해가며 물체의 전체와 물체의 일부분들을 가지고 학습을 한 과정

 


Reference

https://arxiv.org/abs/1409.1556

Comments