본문 바로가기

딥러닝

5. CNN 발전 (2) - VGG, ResNet, etc...

 

5. VGGNet

 

 14년도 ILSVRC에서 GoogleNet의 성능에 아주 약간 못 미친 모델 입니다. 그러나 이 이후에 더 자주 사용되는 모델은 VGGNet입니다. 그 이유는 모델의 복잡성에 있습니다. GoogleNet은 Conv layer와 Pooling Layer를 조합한 Inception Module을 여러층 쌓고, Auxiliary Classifier 등을 활용하는 등 모델이 꽤 복잡합니다.

 

VGGNet

 위의 구조가 VGGNet의 구조 입니다. 딱 보기에도 직관적 입니다. 또한 Conv Layer는 3x3 filter로 통일입니다. 이 모델에서 언급할 것은 3x3 Conv layer 입니다. Factorizing Convolutions 이라는 개념인데, 사실 Inception Module들을 발전시킨 연구팀에서 언급한 개념 입니다. 

 간단히 말하면 큰 필터 크기의 Conv layer를 인수 분해 해서 작은 필터 크기를 가진 Conv layer들의 조합으로 대체 한다입니다. 예를 들어 5x5 conv layer를 3x3 conv layer 두개의 조합으로 대체 하는 것 입니다. 3x3 filter 두개라면 사실상 5x5 filter와 동일한 면적의 데이터에서 feature를 뽑아내는 것과 같습니다.

  위 처럼 대체하면 효과가 있습니다. 더 적은 연산량이 필요하면서, 더 좋은 성능을 가져다 준다고 알려져 있습니다. VGG 논문에서는 저런식으로 5x5 conv layer를 3x3 conv layer 2개의 조합이 더 좋다 라고 언급하지는 않았습니다. 하지만 결과적으로 좋은 성능을 얻어냈죠.

 

 VGGNet에도 단점이 있습니다. 모델의 마지막 단에 FC layer가 3개 있습니다. 이 부분에서 연산량이 상당히 많아졌습니다. GoogleNet은 이 부분을 Global Average Pooling으로 대체 하면서 연산량을 줄였었습니다.

 

6. Resnet

 

 Resnet은 Network를 깊게 만들수록 좋은 결과를 가질까? 라는 의문으로 시작되었다고 합니다. 모델을 깊게 만들면 모델의 성능은 증가 하긴 하는데, 이러면 훈련 시키기가 힘들다 라고 생각을 했었었죠.

 그리고 역시나 layer를 깊게 쌓으면 Vanishing Gradients 문제로 훈련이 안되면서 성능이 더 떨어지는 결과가 있었다고 합니다. Resnet 저자들은 이런 문제를 해결하기 위해서 Residual Learning 개념을 소개합니다. 이 개념을 모델에 적용 시킨 그림 입니다.

 위와 같은 구조를 Skip Connection 이라고도 부릅니다. 위의 구조를 보시면 input x에 대해서 레이어 두개를 거치고 난 F(x)에 x를 더해주는 형식입니다. 두개의 레이어를 거치고 난 output이 H(x) 라고 했을때, 기존에는 H(x)를 직접적으로 추정해야 했지만, H(x)를 F(x) + x의 형태로 구함으로써, H(x)를 입력값으로부터의 차이를 추정하는 문제로 바꾸었습니다.

 

 이렇게 되면 수학적으로 문제 해결이 좀 더 쉬워질 수 있다고 합니다. 또한 상당히 구현하기가 쉽고(add만 해주면 되니까) 파라메터 증가가 없습니다. 그리고 위와 같은 식으로 구현을 하면 layer의 깊이가 깊더라도 학습이 가능합니다. 학습이 잘 되는 이유에 대해서는 resnet 이후에도 연구가 꾸준히 되고 있다고 합니다. 가장 일반적으로 생각하는 이유는, x를 add 하는것으로 연결을 하면, back propagation을 할때에 gradient가 깊은 layer까지 전달이 될 수 있어서 입니다.

 

 Resnet의 이러한 skip connection(Residual Block)은 꽤 많은 조합으로 시도가 가능합니다. 위의 사진만 보아도 Activation Function의 위치, x를 그냥 add 해줄지, scaling, dropout 등 입니다. 그리고 이에 따라서 결과도 꽤 많이 바뀝니다. 그러나 제가 보기에 자주 사용하는 구조는 아래의 사진들에 나오는 구조 인 것 같습니다.

 

 위와 같이 Activation Function으로는 거의 ReLU가 고정이고, Bacth Normalization을 사용하되, 이 두 요소의 위치를 바꾸는 식 입니다. 무엇이 좋다고 딱 결론 내려진 바가 없기 때문에, 여러 구조를 시도해 보는 것도 재밌을 것 같네요.

 

7. 그 이후

 

 사실 논문을 설명하면서 정말 많은 부분을 생략했습니다. 각 논문들이 모델의 구조를 만들때 생각한 철학, 많은 구조를 실험한 결과 등이 그렇습니다. 또한 GoogleNet의 Inception Module, Resnet 등은 그 이후에도 꾸준히 본인들의 모델을 발전시켰고, 찾아보시면 자료들도 꽤 있습니다.

 

 그리고 Densenet, SENet 등이 있는데, 특히 SENet은 여러 모델에 탈부착이 가능하면서도 효과가 좋은 모델 구조도 제시했습니다. 관심이 있으시다면 이 부분에 대해서 더 찾아보시면 좋겠습니다.