본문 바로가기
개발 관련 이야기

VGG 논문 리뷰

by 꿈틀쓰 2022. 8. 9.

공부를 하기 위해 여기에 논문 리뷰를 적기로 했다.

이번에 리뷰할 논문은 VGG이다. 옥스포드 대학교에서 개발한 모델로, 2014년 ILSVRC에서 준우승을 하였다. 매우 유명한 모델이니 자세한 설명은 생략하고 바로 본문으로 들어가겠다.

 

VGG 모델 구조

구조와 파라미터 수

 

input은 224x224의 고정된 크기를 사용하고 모델에 들어가기 전에 각 픽셀값을 전체 트레이닝셋의 RGB 평균값을 빼는 preprocessing 단계를 수행한다. 즉,

 

P`(x, y) = P(x, y) – M (P = x, y의 원래 픽셀값, M = 전체 픽셀의 평균값)

 

몇단계의 conv layer 후에 max pooling을 수행하는 것이 특징이다. 깊이에 상관없이 max pooling은 5번을 수행한다. 그 후에는 3개의 FC layer를 거쳐 마지막으로 soft-max로 classification을 한다.

VGG19

VGG19를 예시로 보기좋게 표현하자면 위 그림과 같다. conv + relu 를 몇번 수행한 후 pooling을 수행하는 식의 블록을 5번 반복한 후에 Fully connected layer를 거져 클래스를 분류한다.

 

※ 각 FC 후에 ReLU와 Dropout을 수행한다. 위 그림에서는 간결성을 위해 FC라고만 표기함을 유의바란다.

 

VGG 모델 특징

6개의 VGG 모델에 공통적으로 적용되는 특징은 다음과 같다.

1) conv layer 설정값 - 3x3 filter size, 1 stride, 1padding

2) max pooling 설정값 - 2x2 filter size, 2 padding

3) 5번의 max pooling

4) 모든 hidden layer 후에는 ReLU를 수행한다.

 

1)번을 보면 conv layer는 모두 3x3 필터 사이즈를 채택하였다. 왜 5x5나 7x7이 아닌 3x3을 사용하여 모델의 깊이를 더 깊게 한 것일까? 사실 3x3 필터를 사용하면 2가지의 이점이 있다.

 

첫번째, 

VGG는 깊이에 비해서 파라미터수가 그리 크지 않은 것이 장점인데 이는 3x3 필터 덕분이다. 왜 그런지 예를 들어서 살펴보자.

7x7 필터와 3x3 필터

위 그림을 보면 7x7 인풋을 기준으로 7x7 필터 크기의 conv를 한번 수행하면 출력은 1x1이다. 반면에 3x3 필터 크기로 conv 연산을 3번해야 1x1의 출력이 나온다. 과연 어느 것이 효율적일까?

위 사진에서는 채널이 모두 1이지만 이번엔 모든 input, output 채널이 1보다 큰 임의의 자연수 N이라고 가정해보자. 7x7 필터 사용시 학습해야 하는 파라미터 수는 1*(7*7*N*N)=49N^2이다. 하지만 3x3 필터 사용시 3*(3*3*N*N)=27N^2이다. 결과적으로 보면 작은 크기의 필터를 여러번 사용하는 것이 비교적 큰 필터를 한번 사용하는 것보다 효율적이라는 것이다. 그 이유로 VGG는 3x3 필터만 사용하여 깊은 모델임에도 비교적 작은 파라미터 수를 학습하는 것이다.

 

두번째,

각 conv layer에 ReLU를 수행하면서 비선형성을 더해주는데, 3x3 필터를 사용하면서 모델 깊이가 늘어나고 그로 인해 ReLU를 더 많이 수행하게 된다. 이로 인해 decision function의 분별력을 더욱 높여준다.

 

VGG의 트레이닝

연구팀이 VGG를 트레이닝할 때 최적화 기법으로 minibatch gradient descent를 사용한 multinomial logistic regression을 사용하였고, 하이퍼파라미터 값은 다음과 같다.

1) 배치사이즈 : 256

2) 모멘텀: 0.9

3) L2 정규화 weight decay : 5x10e-4

4) Dropout : 0.5 (3개의 FC 중 앞의 2개에만 적용)

5) 학습률 : 0.01로 시작, validation accuracy가 개선되지 않을 때 0.1 비율로 감소

 

트레이닝 시, 224x224의 고정된 이미지를 얻기 위해 224보다 큰 임의의 S로 rescaling된 이미지에서 임의로 crop하여 사용하였다. 또한, data augment를 위해 크롭된 이미지를 임의로 좌우반전을 한다던지, RGB colour shift를 적용하여 트레이닝 데이터 수를 늘렸다.

 

트레이닝 시 파라미터의 초기화도 성능에 굉장히 큰 영향을 미친다. 먼저 11-depth의 A 모델을 훈련시킨 다음에 그 파라미터 값을 다른 깊은 모델의 처음 4개의 conv layer와 마지막 3개의 FC layer의 파라미터 값을 A 모델의 파라미터값으로 초기화하여 트레이닝 시켰다.

 

VGG의 테스트

테스트 시에는 모델의 FC layer를 모두 conv layer로 바꿔준다. 첫번째 FC layer는 7x7 conv layer, 두번째와 세번째 FC layer는 1x1 conv layer로 바꾼다. 그래서 결과는 각 클래스에 대한 score map이 된다.

FC layer를 conv layer로 바꾸면서 테스트 시 입력 이미지를 crop할 필요가 없어진다.

'개발 관련 이야기' 카테고리의 다른 글

YOLOv1 논문 리뷰  (0) 2022.08.17
TCP 패킷 분리 현상  (0) 2022.08.16
OpenCV로 영상 녹화  (0) 2022.08.08
명령어 모음 - Ubuntu 18.04  (0) 2022.08.07
[NSIS] 자동실행 시 파라미터 전달  (0) 2022.08.05

댓글