본문 바로가기
논문 리뷰/Classification

[논문 리뷰] VGGnet(2014) 설명

by inhovation97 2021. 9. 8.

CNN모델 중에서도 아주 대표적이고 현재도 Backbone으로 널리 쓰이고 있는 VGGnet 논문을 리뷰하겠습니다. 

논문을 리뷰하기 전에 간단한 배경을 설명하겠습니다. 

논문을 리뷰하면서 제가 생각하기에 중요했던 핵심내용 & 이해를 돕는 설명들을 넣어 포스팅합니다.

논문을 리뷰하면서 저의 주관적인 생각은 다른 색으로 처리하겠습니다!

빨간색은 제가 중요하다고 생각하는 논문의 핵심입니다.

(https://inhovation97.tistory.com/25 cs231n의 내용)

 

1. Introduction
2. Convnet Configurations
3. Classification Framework
4. Classification Experiments
5. conclusion

 

컴퓨터 비전 분야는 당시 이미지넷 챌린지라는 아주 큰 대회를 치르며 발전 중이었고, 2014년 vggnet이 이제껏 우승 모델들의 성능보다 훨씬 큰 성능을 gain 준우승을 합니다. 우승은 GooLeNet입니다. 

vggnet이 좀 더 널리 쓰이는 이유는 아마 우승한 GooLeNet보다 훨씬 간단하지만 큰 성능차이가 안났기 때문일 것 같습니다. 

 

전년도 우승 모델에 비해 에러율을 매우 크게 줄였으므로 어떻게 접근했는지 논문 리뷰를 통해 살펴봅니다.

 

 

 

Abstract(요약)

 

필자들의 연구 초점은 CNN의 깊이와 매우 큰 이미지 데이터셋에 대한 성능이었다고합니다.

그 중에서도 메인 아이디어는 아주 작은 3x3 Conv layer를 이용하는 것이었고, 이것이 16, 19층의 layer를 쌓으면서 굉장한 성능을 낼 수 있었다고 합니다. 

또한 이런 성과들로 다른 데이터셋에서도 일반화 시킬 수 있는 결과를 얻었다고 합니다.

(실제로 vggnet은 지금도 *BackBone으로 많이 쓰임)

(*BackBone 설명 링크)

 

 

 

 

1. Introduction

 

이전까지 발전해왔던 모델들과는 다른 부분에 초점을 맞췄고, 그 부분이 바로 depth라고 합니다.

저자들은 아키텍쳐의 다른 파라미터들도 수정했고, Conv layer를 계속 더해가면서 depth를 깊게 했다고 합니다. 그리고 그 핵심이 바로 3x3 Conv layer였다고 합니다.

그렇게 이미지넷 챌린지에서 좋은 성적을 거둘 뿐만 아니라 BackBone으로서의 능력도 만들었다고 합니다.

(요약 내용이 반복되네요.)

이제 본격적으로 살펴봅시다.

 

 

 

2. ConvNet Configurations

이 섹션에서는 vgg넷의 모델링에 대해 설명

 

저자들은 depth의 영향을 체크하기 위해 동일한 환경을 세팅했다고 합니다. 이제부터는 도식을 보면서 설명을 이해해봅시다.

(모델 D,E를 위주로 보는게 좋으실 겁니다!)

Table 1

전처리

224x224 RGB 이미지를 입력으로 받아들이고, 전처리는 오직 trainset의 RGB값을 각 픽셀에 빼주기만했다고합니다.

(이미지 데이터를 전처리할 때 이미지넷 데이터의 mean으로 전처리를 많이 하곤하죠.)

 

Conv layer

Conv2D( kernel_size=(3,3), padding='same', activation='relu', input_shape=(224,224,3) )

대부분의 필터는 가장 작은 3x3 필터를 쓰는데, 1x1필터도 쓰지만 저자들은 비선형 함수를 뒤에 적용하는  input channel의 선형 변환처럼 보였다고 합니다.

(저도 vggnet에서 1x1이 쓰였다는거는 논문을 읽고서야 알게됐네요. 후에 많은 모델에서 저자들이 생각한 것 처럼 보통 채널을 줄여서 bottle neck으로 사이즈를 맞추기 위해 많이 쓰입니다.)

stride는 전부 1로 고정했으며, padding은 컨볼루션 후에 spatial resolution을 보존하기 위해 same으로 두었다고합니다.

(spatial resolution을 보존했다는 것은 output feature map의 사이즈가 down되는 걸 막았다는 의미입니다.)

 

MaxPooling

MaxPool2D(2x2, stride=2)

몇 차례의 Conv layer 이후, 맥스풀링은 2x2 stride 25번 들어가 다운 사이즈 한다고합니다.

(사이즈가 1/2씩 줄어들겠네요.)

 

FC layer

Dense(4096, activation='relu')

Dense(4096, activation='relu')

Dense(1000, activation='softmax')

fc layer는 처음 2개가 4096의 뉴런과 연결하여 출력하고, 모든 은닉층의 activation functionrelu를 이용한다고합니다. 마지막 출력층은 1000개의 softmax값을 출력합니다.

AlexNet에 쓰인 LRN(Local Response Normalization)은 결과가 좋지 않아 포함하지 않았다고합니다.

 

2.2 Configurations

 

2.1을 토대로 전부 모델을 구성했고, 각각은 깊이만 조금씩 다르게 했다고합니다.

Conv layer의 width는 64로 시작해서 2배씩 늘려가 최종적으로는 512 채널을 출력했습니다.

위 table2를 보면 알 수 있는데, vggnet의 학습 파라미터는 깊이에 비해 굉장히 작은 수에 속합니다. 이는 많은 shallow net들에 비해 큰 수가 아니라고 합니다.

즉, 효율성이 매우 좋은 모델이라는 겁니다.

그 설명이 이제 아래에 나옵니다.

 

2.3 Discussion

vggnet의 configuration은 이제껏 우승했던 모델(AlexNet)과는 다르다고합니다. 

첫 Conv layer를 비교적 큰 사이즈인 7x7, strid는 2를 쓴 AlexNet과는 달리 vggnet 저자들은 전체 모델에 stride는 1이며, 아주 작은 3x3필터를 쓴게 포인트라고 합니다.

cs231n

풀링없이 3x3을 2번 쓰면 5x5 필터를 1번 쓴 것과 같고, 7x7은 3x3 필터를 3번 쓴 효과와 같다고 합니다.

그래서 7x7대신에 3x3을 써서 얻을 수 이점이 뭘까요?

1. 비선형 함수인 relu를 3번이나 쓸 수 있습니다.

( 비선형 함수를 3번씩이나 쓰면 모델이 좀 더 깊어져서, 데이터에 좀 더 유연한게 대응할 수 있겠죠? )

2. 학습 파라미터의 수가 감소

3x3 filter를 3번 쓸 때의 파라미터 수 = n_layer x (HxWxC) = 3(3x3xC) = 27C^2

7x7 filter를 1번 쓸 때의 파라미터 수 = n_layer x (HxWxC) = 1(7x7xC) = 49C^2 

(채널은 입력 데이터의 채널과 필터의 채널을 모두 고려합니다.)

81%나 파라미터 수를 감소시킬 수 있습니다.

 

1x1 Conv layer는 어떤 영향을 주는 receptive fileds Conv layer가 아니지만, 비선형성을 가해줄 수 있는 방식중에 하나입니다. 또 같은 dimension의 공간으로 선형 프로젝션을 해주는 용도로도 이용할 수 있습니다.

(위에서 제가 말했던 것)

 

vggnet논문에서 당시 우승했던 GoogLeNet을 언급합니다.

구글넷은 우리(vggnet)와 독립적으로 연구가 됐지만 Conv layer를 깊게 쌓았다는 점이 우리와 유사했고, 그로인해 좋은 성능을 얻었습니다. 하지만 vggnet에 비해 훨씬 complex합니다. 첫번째 layer부터 연산량을 줄이기 위해 공간적인 보존 (아마 filter의 사이즈를 의미할 것)을 공격적으로 줄였습니다. 

 

 

 

 

 

3. Classification Framework

training & evaluation 방법론에 대해서 다룸

3.1 Training

학습 과정은 AlexNet의 과정을 따라가며(input 이미지를 크롭하는 방식만 다름),

multinomial logistic regression 문제를 미니 배치로 쪼개어 momentum gradient descent로 최적화를 시켜 수행했다고 합니다.

 

파라미터

batch size : 256

momentum : 0.9

weight decay : 0.0005 (L2 regularization)

dropout : 앞 2개의 fc layer 0.5 drop out 적용

learning rate : 처음엔 0.01 이후, validation셋의 accuracy 향상이 멈출 때마다 10배씩 감소 -> 전체적으로 3번을 감소시켰다고 함. 

최종적으로 370K iterations (74 epochs)에서 learning을 끝냄.

 

이는 AlexNet에 비해 학습 파라미터도 훨씬 많고 모델의 깊이가 깊지만, 오히려 converge하는 데에 epoch수는 적다고 합니다.

이에 대한 저자들의 생각

1. 더욱 깊고, 작은 필터의 Conv layer를 채택했기 때문

2. 특정 layer들의 pre-initialization

2가지로 생각을 한다고 합니다. 중요한 pre-initialization의 설명을 봅시다.

 

 

pre-initialization

 

네트웍의 weight은 굉장히 중요한데, bad initialization은 모델을 꺼트릴 수도 있기 때문이라고합니다.

( gradient vanishing을 의미하는 듯)

모델이 얕으면 randomly w init(가중치 초기화)을 해주어도 괜찮겠지만, 우리와 같이 깊은 경우를 보자.

우리는 1~4번째 Conv layer후반 fc layer 3개에 w init을 해주었다.(위에 도식인 table 1에서의 A net 기준)

중간 layer들은 전부  randomly w init을 진행했다.

(여기서 중간 layer와 1~4번째 Conv layer와 후반 fc layer 3개 둘 다 randomly w init이지만, 차이점을  아래로 설명합니다.)

1~4번째 Conv layer와 후반 fc layer 3개 normal distribution에서 랜덤 샘플링하는 것.

bias는 0으로 w init을 합니다. 이는 2010 이미 논문에 나온 내용이고 저자들은 이에 동의한다고 함.

(저자가 Glorot & Bengio인 w init 논문이므로 아마 Xavier init을 사용한 것 같습니다.)

 

training image augmentation

 

위에서 말한 input image의 crop방식을 설명합니다.

SGD의 1 iteration마다 학습 이미지를 한번 크롭하는데,

1. 리스케일한 이미지를 랜덤하게 수평, 수직으로 뒤집어줌

2. RGB 컬러를 shifting해줌

3. 이미지 input size

이것도 논문의 point이니 설명을 봅시다.

 

training image augmentation - input size

 

논문에서는 input size에 대해서 2가지 실험을 했다고 합니다.

1. 224x224 & 384x384로 고정하여 학습

384x384로 고정시키는 경우에는 224x224의 모델에 fientuning으로 진행했다고 합니다.

finetuning시에는 learning rate를 0.001으로 좀 더 작게 설정했다고 합니다.

 

2. 256~512중에서 사이즈를 랜덤으로 하여 학습( H,W는 같은 사이즈 )

이 경우도 384로 학습된 모델의 가중치로 finetuning을 진행하였고, 이미지 내에 object들이 좀 더 다양한 크기로 존재할 수 있었기 때문에 augmentation 효과가 나오는 장점이 있었다고 합니다.

 

3.2 Testing

test시에는 fc layer를 7x7 Conv layer, 1x1 Conv layer(끝에 2개의 fc layer)로 바꿔서 Fully ConVNet으로 바꾸어 평가한다고 합니다. 이때 채널은 class 개수로 맞추어 출력하도록 설정하는겁니다.

그렇기 때문에 학습했던 사이즈와 굳이 같지 않아도 된다고합니다. 

 

이게 무슨 소린지... 다른 블로그들에서도 그냥 논문 해석만 해놨지 설명은 거의 없더라구요.

(저도 이해하는데 시간이 조금 걸렸는데, 제 생각에는 test set을 여러가지 사이즈로 Fully ConVNet에 넣으면, 각각 여러가지의 사이즈로 Convnet을 나올겁니다. 이걸 1x1 Conv layer에서 class 개수로 channel을 배출하기 때문에 어떤 사이즈던, fixed-size vector가 나올 수 있는 거죠.

그래서 이 feature map들을 논문에서는 class score map이라고 지칭합니다. 이걸 이제 average하여 스코어링하는거죠. 

fc layer에서 7x7과 1x1 Conv layer로 바꾼 레이어의 가중치는 어떻게 학습했는지는 저도 잘 모르겠습니다...

저도 vggnet 논문은 포스팅떄문에 읽는건데, testing에도 이렇게 신경쓰는지 첨 알았네요...

 

또 testset도 horizontal flipping으로 augmentaiton을 진행했다고합니다.

이 경우도 가령 이미지1의 augmetation 세트를 모델에 넣어 나온 score를 average했다고합니다.

(약간 앙상블(?)비슷한 효과를 데이터적으로 본 것 같아요.)

 

testset도 crop을 시도했다.

이 경우는 multiple crop이 accuracy 향상에 도움은 되지만, 연산량 시간 등등에 비해 효율적이지 않다고 합니다.

 

3.3 Implemnetation Details

이 부분은 현 시점 중요하지 않은 내용인 것 같습니다. 

C++기반의 caffe 모델을 기반으로 했다거나 GPU 관련 이야기네요.

 

 

 

 

 

4. Classification Experiments

이 섹션에서는 저자들이 이번 이미지넷 챌린지에서 얻은 성과를 설명

 

데이터셋은 알다시피 1,000개의 클래스이며, 아래와 같이 split했습니다.

trainset : 130만개

validationset : 5만개

testset : 10만개

저자들은 validationset을 testset으로 이용했다고 합니다.

 

top-1은 오분류한 비율입니다. 

top-5은 이미지넷에서 평가하는 주요 평가 척도이며, top-5 예측된 범주내에 정답라벨이 없는 이미지의 비율입니다.

 

4.1 Single Scale Evaluation

 

아래 각각의 모델들을 평가했는데, test image size Q,와S는 위에서 설명했던 testset의 input size를 의미합니다.

1. 먼저 저자들은 위에서 언급했던 LRN이 모델 A의 성능개선에 효과가 없어서 제거했다고 합니다.

 

2. Convnet의 깊이가 증가할수록 분류 에러율이 줄어드는 것을 확인했다고 합니다.

(위에서 언급했던, vggnet의 핵심인 모델의 깊이, filter size의 실험 성능을 설명합니다.)

모델의 깊이가 증가할수록 에러율이 줄어드는 것을 11~19 layer까지 확인했다고 합니다.

데이터셋의 크기가 클수록 이러한 선형 관계는 좀 더 크다고합니다.

 

또한 Conv layer의 filter size는 B모델에서 실험을 진행했는데, 

테이블 3을 보면 알 수 있듯이 B모델에서 1x1 Conv layer를 추가해준 C 모델이 성능이 더욱 좋았고, 1x1에서 3x3 Conv layer를 바꿔준 D모델이 더욱 좋은 성능을 보입니다.

 

B모델은 3x3 Conv layer가 10개로 이루어져 있는데, 위에서 말했듯이 같은 구성에서 5x5 Conv layer 5개로 모델을 수정했고, 이는 top-1 error가 7% 이상 차이났다고 합니다.

제 생각엔 이 논문의 핵심은 Conv layer의 사이즈입니다! 위에서 언급한 것의 실험부분

( 정리해보면, 그냥 1x1Conv layer로 nonlinearity를 추가해주면, 모델이 더 깊어질 수 있어 좋음 < 3x3으로 receptive field가 큰게 더 좋음 -> 하지만 5x5는 3x3보다 더 크지만 비효율적이고 모델을 깊이 쌓을 수 없음.)

 

3. 학습 시에 Scale jittering이 그냥 256, 384로 고정시켜서 학습한 것보다 훨씬 좋은 성능을 내었다.

여기서 말하는 scale jittering은 위에 training image augmentation - input size 언급한 input size를 256~512로 랜덤하게 바꾸어 fine tuning했던 것을 의미합니다. 

이렇게 Scale jittering한 trainset은 실제 다양한 이미지의 통계량을 포착하는 데에 도움이 되어서 성능이 잘나왔다고합니다. 

테이블3을 보면 best성능이 전부 Sacle jittering 학습에서 나오네요.

 

4.2 Multi - Scale Evaluation

 

위에서는 train에서의 scale jittering을 확인했고, 4.2에서는 test에서의 scale jittering 성능을 봅니다.

test시에도 다양한 스케일로 evaluation한 결과 테이블3에서보다 더 좋은 24.8 & 7.5를 기록합니다.

 

4.3 Multi - Crop Evaluation

 

3.2 Testing에서 나온 multi crop에 관한 실험 디테일 부분입니다.

multi crop이 미세하게 좋았고, 둘을 평균 내어 약간 앙상블(?)효과인지 성능이 더 잘 나왔네요.

 

4.4 Convnet Fusion

 

4.4에서는 7개의 모델을 앙상블한 성능을 확인합니다.

post - sub 부분은 multi scale 중에서도 가장 성능이 좋았던 모델 D,E 모델을 앙상블한 결과입니다.

 

4.4 Comparison with the state of the art

이 부분은 그냥 우리 모델 좋다~ 라는 부분입니다. 넘어갑니다.

 

 

 

 

 

 

 

 

 

 

5. Conclusion

vggnet은 이 논문을 통해 large scale image classification에서 deep CNN모델을 실험했으며, 모델의 깊이와 성능에 대해서 장점들을 증명했죠. 성능도 좋았습니다.

또한 다양하고 많은 task에서 일반화 시킬 수 있는 능력도 증명했습니다.

(현재도 정말 많이 쓰이는 back bone으로서의 능력이죠.)

 

 

 

 

 

 

 

아 논문리뷰는 처음으로 해봤는데, 이미 다 아는 내용이지만 오래걸리네요... 논문은 디테일도 굉장히 많이 적혀있네요... 실력이 모자른 걸까요... 

 

 

아마 vggnet의 논문을 공부하시는 분들은 경험이 적을 것 같습니다! 아래의 글을 추천드립니다! 이 논문을 토대로 그리고 제 글을 읽고 한 번 직접 CNN모델을 설계해보세요!

큰 도움이 될 겁니다.

https://inhovation97.tistory.com/43

 

[CNN모델 이해하기] CNN 모델 설계하기 & CNN 모델 인사이트

이번 포스팅은 CNN 모델을 설계하면서, 중요한 점을 짚고 무엇이 어떻게 왜 쓰이는지 정리하려고합니다. 미리 학습된 모델을 쓰지 않고, 그냥 CNN모델을 설계하면서 성능차이를 봅시다. 캐글 컴피

inhovation97.tistory.com

 

 

이건 vggnet을 구현한 코드가 공유 되어있는 저의 포스팅입니다!

필요하신 분들은 제 깃헙 링크 누르셔서 코드만 참고하세요!

https://inhovation97.tistory.com/32

 

Learning rate & batch size best 조합 찾기 (feat.논문리뷰와 실험결과)

이번 포스팅은 저의 지난 포스팅의 배경 지식이 요구되므로 읽고 오시기를 추천드립니다 :) 저는 모델링 경험이 엄청 많지는 않기 때문에 고수분들에게는 해당 포스팅이 당연한 인사이트일 수

inhovation97.tistory.com

댓글