[ICLR 2015] Very Deep Convolutional Networks For Large-Scale Image Recognition

안녕하세요 연구실에 들어온 지 벌써 3주차인 최인하입니다. 3주라는 시간이 정말 빠르게 지나간 것 같아 놀랍기도 하고 무섭기도 하네요. 아직은 모르는 게 많아 부족하지만 주변에서 도와주시는 연구원분들 동기분들 항상 감사합니다. 덕분에 잘 적응 중인 것 같습니다. 저의 첫 X-review 논문은 모두에게 익숙하실 VGG입니다. 거두절미 하고 바로 let’s go 해보겠습니다!

Introduction

Convolution networks는 large public image storage와 GPU 같은 high-performance computing system이 발전하면서 large – scale image and video recognition에서 큰 성과를 거두었습니다. 따라서 점차 convolution network가 CV field 에서 중요해지면서, 기존 architecture를 발전 시키려는 시도들이 있었습니다. 제가 소개하는 VGG 논문에서는 Convolution network의 depth 정보에 초점을 맞추었습니다. 따라서 architecture의 다른 parameter들은 고정시키고 convolution layer를 추가 함으로써 depth를 증가시켰고, 이는 모든 layer에서 3 x 3 filter를 사용하기 때문에 가능하다고 논문에서 이야기합니다. (어찌보면 이 부분이 VGG의 킥인 것 같습니다.) 결과적으로 논문에서는 ConvNet architecture의 위치추정 과제에서 정확성을 크게 향상시켰다고 합니다.

Architecture

이 부분에서는 VGG의 architecture에 대해서 상세하게 설명하겠습니다. Training 과정에서는 input을 224 x 224 해상도의 RGB image를 사용한다고 합니다. 그리고 image를 convolution layer에 태울 때 3 x 3의 filter를 사용한다고 하며, 어느 한 구성에는 receptive field에 영향을 주지 않으면서 비선형성 증가를 위해 1 x 1의 filter를 사용하기도 한다고 합니다. Stride는 1 pixel로 고정하며, 공간 정보가 유지 되도록 conv layer에 입력 될 때 padding을 준다고 합니다. 또한 모든 layer에서 수행되는 것은 아니지만 5개의 max pooling 과정이 포함되며, 2 x 2 window, stride 2로 수행 된다고 합니다.
Conv layer를 지난 뒤에는 Flatten 작업을 수행 후 3개의 FC layer를 지난다고 합니다. 첫번째 와 두번째는 4096개의 node를 가졌고, 마지막 layer는 논문에서 1000개의 분류 문제를 해결하므로, 1000개의 노드가 있다고 합니다. 최종 층은 softmax라고 합니다. 뒤에서 소개할 여러 model에서 FC layer는 동일하다고 합니다. (확실히 conv layer 보다 FC layer에 weight가 엄청 많이 사용되는 것 같습니다)
모든 layer에는 non-linearity를 보장하기 위해 activation function으로 ReLU가 쓰였습니다. 이 때 저자들은 LRN(Local Response Normalization)의 사용이 성능 향상에 도움이 되지 않고, 오히려 메모리 사용과 연산 시간을 증가 시킨다고 하여 하나의 network를 제외하고는 사용하지 않았다고 합니다.

Local Response Normalization


잠시 LRN에 대한 설명을 추가하자면, activation function으로 ReLU를 적용하면 vanishing gradient를 예방할 수 있지만, ReLU의 결과는 0~inf 구간에 존재하기 때문에 간혹 너무 높은 양수를 받게 되면 주변의 낮은 값들의 전달을 방해 할 수 있다고 합니다. 이를 해결하기 위해 LRN을 적용하는데 식은 다음과 같습니다.

식을 보면 이웃 채널의 픽셀 값을 고려해서 각 채널의 픽셀 값을 낮춰 주는 것을 알 수 있습니다.

Configuration

Table 1은 VGG논문에서 제시한 ConvNet의 구조입니다. 3개의 FC layer는 동일하며 model A는 8개의 convolution layer model E는 16개의 convolution layer가 사용되었습니다. Convolution layer의 채널의 수는 64개부터 시작하여 max-pooling layer를 지날 때 마다 2배씩 증가 해 최종적으로 512개에 도달한다고 합니다.
Table 2에서는 각 모델마다 학습되는 파라미터의 수가 나와있습니다.

Discussion

두개의 3 x 3 convolution layer를 쌓으면 receptive field가 5 x 5가 되고, 3개 쌓으면 7 x 7이 됩니다. 왜 VGG 논문에서는 7 x 7 convolution layer를 하나 쌓지 않고, 3 x 3 convolution layer를 여러 층 쌓았을까요? 논문에서는 2가지 이유를 말합니다.

  • 3 x 3 즉 작은 윈도우를 더 쌓음으로써 decision function을 더욱 차별성 있게 만든다고 합니다. 이는 layer를 더 쌓음으로써 decision function의 non-linearity를 더욱 증가시켜 분별력을 증가 시킨다고 생각할 수 있습니다. (ReLU를 더 많이 거치게 되므로)
  • 작은 윈도우를 사용함으로써 학습되는 파라미터 수를 줄일 수 있다고 합니다. 예를 들면 C개의 채널을 가진 3 x 3 convolution layer를 3개 쌓으면 총 27 x C^2 만큼의 웨이트가 필요하지만, C개의 채널을 가진 7 x 7 convolution layer를 하나 쌓으면 49 x C^2 만큼의 웨이트가 필요합니다.

이러한 이유로 VGG 논문에서는 3 x 3 convolution layer를 이용하여 더 깊은 네트워크를 만들 수 있었다고 합니다.

Classification Framework

이 부분에서는 VGG 논문에서 제시한 model들의 training과 testing의 방식들을 상세하게 설명합니다.

1. Training

Training 과정은 multinomial logistic regression (cross entropy) 문제를 mini-batch gradient descent with momentum 방식으로 최적화 시켰다고 합니다. 설정된 파라미터는 다음과 같습니다.

  • Batch size = 256
  • Momentum = 0.9
  • L2 Regularization = 5*10^-4
  • Dropout ratio = 0.5
  • Learning rate는 처음에 0.01로 설정하고, validation의 정확도가 더 이상 향상되지 않을 때 마다 1/10씩 해주었다고 하며, 총 3번 감소시켰다고 합니다.

VGG 논문에서는 더 깊고 많은 파라미터를 사용했음에도 불구하고 더 빠른 학습이 가능했다고 하는데, 그 이유가 implicit regularization(논문에서는 z를 계속 s로 표기하는데 이유를 모르겠습니다)과 pre-initialization 덕분이라고 합니다.
저자가 말하는 implicit regularization은 위에서 설명한 7 x 7 convolution layer 한 층보다 3 x 3 convolution layer 3개의 층에 적용 되는 parameters의 수가 더 적기 때문에 이를 implicit regularization 이라고 말합니다.
또한 저자는 initialization of the network weight의 중요성을 언급하면서, 잘못된 initialization은 deep network 모델을 망칠 수 있다고 말합니다. 따라서 논문에서는 layer가 얕은 A 모델을 random initialization 방식으로 training 한 후 깊은 모델을 학습시킬 때 첫번째 부터 4번째 가지의 convolution layer와 FC layer 3개에 모델 A의 training된 가중치로 초기화를 진행한다고 합니다. 이 때 learning rate는 감소 시키지 않았다고 하며, 중간 layer들은 전부 평균 0, 분산 0.01인 정규분포에서 random initialization으로 설정했다고 합니다.

Training image size
Imgae data를 학습에 사용하기 위해 다음과 같이 input size를 맞춰 준다고 합니다. 논문에서는 2가지 방식을 설명하고 있습니다.

  1. 첫번째는 image size S를 crop 하기 전 고정시키는 방식입니다. 자세히 설명해 보면 다양한 size의 image가 들어왔을 때 고정 된 S값 (논문에서는 256, 384로 사용했습니다.) 으로 image size의 작은 부분을 맞춰 줍니다. 예를 들면 1024 x 512의 image가 들어오면 512 부분을 고정 된 S값으로 맞춰주고 1024 부분을 비율에 맞게 조정합니다. 그 후 224 x 224 크기로 image crop을 진행합니다.
  2. 두번째 방법은 S값을 고정시켜주는 것이 아닌 random으로 정해주는 방식입니다. 논문에서는 S값의 범위를 [256,512]로 지정해주었습니다. 논문에서는 학습 속도의 이유 때문에 S=384로 고정하고 학습 후 모든 layers를 multi-scale 모델로 fine-tuning을 진행해 주었다고 합니다.

실제로 논문에서는 input image의 size가 각각 다를 수 있으므로, multi-scale로 학습을 진행하면 학습 효과가 더 좋아질 수 있다고 언급합니다. 이러한 방식을 scale jittering이라고 부른다고 합니다.

2. Testing

Training 과정에서 image가 rescaling 되는 것 처럼 testing 과정에서도 rescaling 됩니다.
하지만 Training 과정에서 image rescaling의 기준이 되는 값이 S라고 한다면, testing 과정에서는 기준이 되는 값을 Q라고 합니다. 이때 Q = S일 필요는 없습니다. 실제로 뒤에 test 결과에서는 S에 대해서 여러 Q 값을 쓰면 성능 향상의 효과가 있는 것을 확인할 수 있습니다.
읽으면서 어려웠지만 신기했던 부분은 test 과정에서는 training과는 다르게 input image의 크기가 224 x 224일 필요가 없다는 것이었습니다. 이게 어떻게 가능한지 지금부터 설명해 보겠습니다. (설명이 틀릴수도 있어서 잘못된 부분이 있으면 댓글 부탁드립니다)
결론부터 말하자면, testing 과정에서는 Training 과정에서 사용되던 첫번째 FC layer를 7 x 7 convolution layer로 바꾸고, 나머지 두개의 FC layer를 1 x 1 layer로 바꾸어 input image의 size가 224 x 224가 아니어도 test에 사용될 수 있도록 하였습니다. 이것이 가능한 이유는 VGG 논문의 model 들은 convolution, pooling layer를 거쳐 최종적으로
7 x 7 x 512의 feature map으로 변환됩니다. 이 feature map을 flatten하여 FC layer의 입력으로 사용합니다. 하지만 input image의 size가 224 x 224가 아니면 최종적인 feature map의 크기가 7 x 7이 아닌 다른 n x n의 크기를 갖게 되고, flatten의 크기도 변하게 되므로 FC layer가 지정된 차원 값을 받지 못하게 됩니다. 하지만 FC layer를
7 x 7 x 4096 convolution layer로 바꾸게 된다면(stride 1, padding 0), FC-4096과 같은 역할을 수행하면서
(ex) 25088(7x7x512) -> 4096) 최종적으로 n x n 크기의 feature map이 들어와도 처리할 수 있게 됩니다.
같은 이유로 나머지 FC layer도 1 x 1 convolution layer로 바뀌게 됩니다.
하지만 여기서 한가지 문제점이 있습니다. 7 x 7 feature map이 아니라 n x n feature map이 들어온 경우 softmax 처리 하기전 벡터의 차원이 1차원이 아닐 수 있다는 점입니다. 밑에 그림 자료르 보시면 이해가 더 쉬울 것 같아서 가져왔습니다.

그림을 보시면 5 x 5 convolution을 진행할 때 입력 벡터의 크기가 5 x 5면 1 x 1의 벡터가 최종 feature로 나오지만, 만약 입력 벡터의 크기가 6 x 6이면 2 x 2 크기의 벡터가 최종 feature로 나오게 됩니다.
따라서 논문에서는 n x n x 1000 벡터가 최종 feature로 나오게 되면 average pooling 과정을 거쳐 1 x 1 x 1000 벡터로 바꿉니다. 그 후 softmax를 수행하고 original image와 flipped image의 평균 값을 통해 최종 score를 출력하게 된다고 말합니다. 논문에서는 이러한 평가 방식을 dense evaluation 이라고 언급합니다.
또한 저자는 Multi – crop evaluation도 언급하면서 dense evaluation 과 함께 쓰면 시간 비용은 증가하나 성능은 증가한다고 합니다.

Classification experiments

VGG 모델은 실험을 진행할 때 ILSVRC – 2012 dataset을 사용했습니다. 이 dataset은 1000개의 class로 구성되어있고 training, validation, testing으로 구성되어 있다고 합니다. 논문에서는 이러한 dataset의 1000개의 class를 classification 하는 것에 있어 performance의 측정 방식 두가지 Top-1 Error, Top-2 Error를 소개합니다. Top-1 Error는 예측이 잘못된 이미지의 비율이며, Top-5 error는 모델이 예측한 Top-5 class에 정답이 없는 이미지의 비율을 나타냅니다.

첫번째 테스트 방식은 Single scale evaluation 입니다. 이는 Q의 값을 고정시켜서 테스트 하는 방식입니다. 이 때 Q의 값은 S의 값과 동일하게 진행하거나, multi scale의 S의 평균 값을 Q로 지정해주는 방식을 사용했습니다. 이 방식으로 test를 진행했을 때 결과는 다음 표와 같습니다.

    테스트 결과로 생각할 수 있는 점은 우선 LRN을 사용하는 것이 성능 향상에 큰 기여를 하지 못한다는 것입니다. 그래서 논문에서는 더 깊은 네트워크에는 LRN을 쓰지 않았다고 합니다. (제 생각은 결국 더 깊은 네트워크 일수록 얕은 네트워크 보다 ReLU로 인한 편향 현상?이 더 심해질텐데 얕은 네트워에서도 효과를 보지 못했으니까 쓰지 않은 것 같습니다)
    그리고 convNet의 깊이가 깊어질수록 classification error가 감소한다는 것입니다. 하지만 주목할 점은 깊이가 같아도 1 x 1 conv layer를 포함한 모델이 성능이 낮았다는 점입니다. 이는 추가적인 비선형성은 성능 향상에 도움은 되지만, conv Filter를 이용하여 공간적인 맥락을 파악하는 것이 더 중요하다는 것을 보여주는 것 같습니다. 또한 논문에서 언급하길 모델 b에서 3 x 3 2개의 layer를 5 x 5의 하나의 layer로 바꿔 비교하였는데, 후자 모델의 Top-1 Error가 7% 높았다고 합니다. 이는 작은 filter를 쌓은 깊은 네트워크가 큰 필터의 얕은 네트워크보다 우수하다는 것을 증명한다고 합니다. 마지막으로 multi scale model로 train 한 것이 더 좋은 결과를 보여주는 것을 보아서 data의 다양성을 확보하는 것이 도움이 된다는 것을 보여줍니다.

    두번째 테스트는 multi-scale evaluation입니다. 이는 Q값을 다양하게 설정해서 test하는 방식입니다. 논문에서는 training scale S와 test scale Q의 값을 너무 다르게 하면 오히려 성능이 안좋아질수 있으므로 S값에 대해 3가지의 Q값을 정했다고 합니다. 우선 고정된 S 값에 대해서는 S-32, S, S+32 값을 Q로 사용하였고, multi scale인 경우 S(min),S(mean),S(max) 값을 Q 값으로 정하고 test를 진행하였다고 합니다.

    이 테스트로 인해 확실히 단일 Q값을 사용했을 때 보다 Error값이 줄어든 모습을 볼 수 있습니다. 이는 단일 Q값을 사용했을 때에는 모델이 Q size 이미지는 잘 분류하겠지만, 다른 size의 이미지가 들어왔을 때 성능이 저하 될 수 있으므로 size의 강건성을 높인 효과라고 보시면 될 것 같습니다.

    세번째 테스트는 multi-crop evaluation 입니다.

    신기한 점은 multi-crop 방식이 dense 방식보다 error가 낮다는 점입니다. 논문에서 저자는 이점을 언급하였고, 두 방식을 앙상블해서 사용하면 더 좋은 성능을 이끌어 낼 수 있다고 합니다. 이 부분은 자세하게 설명이 되어있지는 않아서 설명해 보면, multi crop방식은 이미지를 crop하여 사용하므로 원본 이미지의 일부분의 정보를 담고 있습니다. 하지만 이때 zero padding이 적용 됨으로써 0이라는 픽셀 값에 영향을 받습니다. 즉 제가 해석하기로는 실제로 주변과 연결 되어있는 사진의 한 조각인데, zero padding 때문에 주변 값들과 뚝 떨어져 있다는 느낌으로 모델이 인식한다고 해석했습니다.
    이를 dense 모델과 앙상블 한다면 dense 모델은 이미지 전체를 보고 평가를 진행하므로, 서로 상호 보완적이라고 해석하면 될 것 같습니다.

    Conclusion

    결국 이 VGG란 논문은! small size window를 이용해서 convolution layer를 깊게 쌓을 수 있었고, 그로인한 비선형성의 확보로 더 좋은 성능을 낼 수 있었으며, 학습되는 parameter의 수도 줄일 수 있었습니다. 이것이 제가 생각하는 이 논문의 main-contribution 인 것 같습니다.

    처음 X-review를 작성하면서 제 생각을 적는 것이 이렇게 어려운 것이구나라는 것을 느꼈습니다.. 처음 시작은 let’s go를 외쳤으나 지금은 초췌해졌네요.. 점점 발전되는 모습 보여드리겠습니다. 다음에는 기회가 된다면 ResNet 이나 SSD 논문으로 찾아오겠습니다. 긴 글 읽어주셔서 감사합니다.

    Author: 최 인하

    5 thoughts on “[ICLR 2015] Very Deep Convolutional Networks For Large-Scale Image Recognition

    1. 안녕하세요, 인하님. 좋은 논문 리뷰 감사합니다.
      3 x 3 kernel을 반복적으로 활용해서 네트워크를 깊게 쌓음으로써 비선형성을 강화하고 파라미터 수를 줄여낸 모델이 인상적이었습니다.

      리뷰를 읽으면서 3 가지 궁금증이 생겼습니다.
      1. VGG에서는 stride를 모두 1로 설정했는데, 이렇게 한 특별한 이유가 있을까요?
      2. 논문에서 1×1 conv를 사용했다고 하셨는데, 공간적 정보를 포착하지 못하는 작은 필터임에도 불구하고 어떻게 비선형성을 의미 있게 추가할 수 있었는지 궁금합니다.
      3. Dropout은 FC layer에만 적용했다고 하셨는데, 왜 FC에서만 사용되고 conv layer에서는 사용하지 않았는지도 알고 싶습니다.

      첫 논문 리뷰 축하드립니다. 좋은 논문 리뷰 감사드립니다. 🥳

      1. 안녕하세요, 기현님. 첫댓글 감사합니다.
        바로 답변드리겠습니다.

        1. 정확히 말하자면 VGG에서 stride를 모두 1로 설정하지는 않았습니다! pooling 과정에서는 stride가 2가 사용되었습니다. 아마 질문 주신 의도가 convolution layer에서는 stride가 왜 1로 설정이 된 이유를 물어보신 것 같으니 답변드리면, network의 depth에 집중한 논문이다 보니 stride를 1로 설정하지 않았나 생각합니다.

        2. VGG 논문 model C에서 비선형성을 추가하기 위해 1 x 1 filter를 사용한 이유는 3 x 3 filter보다 단순히 activation function을 더 많이 지나갈 수 있기 떄문입니다!

        3. dropout을 제가 이해하기로는 학습 과정 중에 layer에서 random하게 node를 꺼버려서 node가 input 값의 weight를 편향되게 받을 수 없이 골고루 학습하게 하는 정규화 과정으로 이해를 하였습니다. 저는 dropout이 fc layer에서만 쓰인 이유가 공간적인 정보를 중요시하는 conv layer에서 dropout을 사용하면 오히려 공간적인 정보가 누락 될 것 같아서 쓰지 않은 것 같습니다.

    2. 안녕하세요 인하님! 첫 리뷰 작성하시느라 수고하셨습니다.
      질문을 두 가지 정도 드리고 싶은데,
      1. vgg 아키텍처 뒷단의 FC Layer들의 목적이 분류라면, 4096개의 노드를 가진 첫 번째 layer에서 1000개의 노드 layer로 바로 연결해서 분류하는 방법도 있을 것 같습니다. 고로 FC layer가 4096->1000 2층 구조가 아닌 4096->1000->1000의 3층 구조인 이유가 있는지 궁금합니다. 혹시 논문에 관련된 설명이 나오는 부분이 있을까요?
      2. training 에서 분류층의 FC Layer를 testing 단계에서는 conv layer로 바꿨다고 하셨는데, traing과 testing의 아키텍처를 다르게 설정한 이유가 궁금합니다. testing의 뒷단 아키텍처를 다르게 가져가면, traing에서 학습했던 뒷단 분류층의 파라미터는 어떻게 사용하나요?

      1. 안녕하세요 재윤님! 댓글 감사합니다.
        바로 답변 빠르게 드리겠습니다.

        1. VGG에서 4096 -> 4096 -> 1000 으로 쌓은 정확한 이유를 설명한 부분은 없는 것 같습니다! 하지만 질문 주신 부분에서 제가 나름대로 이해한 내용을 설명해 보자면, 우선 4096 -> 1000 으로 2층 구조로 가져가는 것 보다 논문에서처럼 3개의 층으로 가져가면 얻는 이점은 비선형성의 증가로 복잡한 문제를 더욱 잘 풀 수 있습니다! 하지만 그러면 더 깊게 쌓으면 되지 않느냐라는 의문이 들 수도 있지만, 그렇게 하면 FC layer에서 parameter를 너무 많이 잡아먹는 것 같습니다.(실제로 3층 구조에서도 약 80% 정도를 잡아먹습니다.) 따라서 3층 구조가 테스트 결과와 시간적 부분을 고려했을 때 가장 좋은 결과가 나와서 사용한 것 같습니다!

        2. 좋은 질문인 것 같습니다! 논문에서는 testing 과정에서 다양한 image의 scale이 들어와도 test를 진행할 수 있도록 하기 위해서 라고 언급하였고, 이미지를 여러장 crop해서 사용하면 각 crop된 이미지마다 network를 다시 계산해야 하므로 비효율적이라고 언급 되어있습니다! 파라미터 부분은 저도 헷갈렸던 부분인데 설명해보자면, classification 구간에서 conv layer를 사용하지 않았을 때의 파라미터 수를 계산해보면 첫번째 fc layer에서 (7 x 7 x 512) x (4096) 입니다. 자 여기서 conv layer를 도입했다고 했을때 필요한 파라미터의 수는 7 x 7 x 512 x 4096입니다 같은 수의 파라미터가 사용되는 것을 알 수 있습니다! 그래서 논문에서는 동일하게 파라미터를 사용한다고 합니다!

    3. 안녕하세요 인하님 리뷰 감사합니다

      사실 VGG 논문은 저도 자세하게 읽은 기억은 없는데 작성해주신 리뷰를 보니 ssd도 그렇고 핵심적인 내용들을 이해하기 쉽게 잘 정리해주신 것 같아요. 마지막에 FC Layer를 test 할 때 conv layer로 사용하는 부분의 내용은 저희가 한 번 태주님이랑 얘기한적이 있는데 그 때 정리가 되셨을까요? 학습할때와 다른 크기나 모양의 이미지를 처리할 때의 dense prediction 이점 간단하게만 설명 부탁드립니다,,!

    Leave a Reply

    Your email address will not be published. Required fields are marked *