[논문 리뷰] ResNet 간단 리뷰

2022.02.02 12:11 5,074 Views

안녕하세요!

오늘은 ResNet 논문을 읽으면서 내용을 정리해 올립니다. CNN 기본적인 논문들 위주로 먼저 정리를 해보려고 합니다. 그럼에도 완벽하게 이해하긴 어렵네요.. 혹시 틀린 점 지적이나 피드백은 언제나 환영입니다.

본 포스팅은 데이콘 서포터즈 "데이크루" 1기 활동의 일환입니다.  


ResNet

마이크로소프트팀이 소개한 ResNet (논문 명 : Deep Residual Learning for Image Recognition)에 대해 소개하고자 합니다. VGG에서 CNN의 layer를 깊게 쌓을수록 성능이 더 좋아지는 것을 확인했습니다. 하지만, layer가 너무 깊어지면 Vanishing or Exploding gradient 현상이 발생합니다. 뿐만 아니라 20개 이상의 layer부터는 성능이 낮아지는 degradation problem도 발생합니다. 이 두가지 문제를 Residual, 잔차를 통해 해결하고자 하였습니다. 


Abstract

Depth의 중요성과 residual 학습에 대해 간단히 소개했습니다. 이전 ILSVRC 대회 결과를 보면 깊이가 모델 성능에 많은 영향을 미치고 있었는데 너무 깊어지면 과대적합, 기울기 소실, 계산량 증가 등이 문제가 됩니다. 따라서 깊은 신경망을 학습시키기 어려웠는데 MS 연구팀이 residual learning framework를 사용해 전보다 훨씬 깊은 네트워크를 학습시킬 수 있도록 했다고 합니다. Residual learning은 아래에서 더 설명하고 결과적으로 VGG보다 8배 깊은 152개의 layer를 사용하며 앙상블 기법까지 적용해 오차를 3.75%까지 줄였다고 합니다. 이 3.75%가 처음으로 Human error를 능가하는 값이라고 합니다. 생각보다 얼마 안 지났네요..


Introduction ~ (구분해서 요약하기 애매하네요..)

당시에 연구진들은 layer를 쌓는 만큼 더 쉽게 모델을 학습시킬 수 있는지에 대한 의문이 생기기 시작했고 방해요소가 보였는데 가장 큰 것이 Vanishing, Exploding gradient 현상이었습니다. SGD를 적용한 10개의 layer까지는 Batch Normalization과 같은 intermediate normalization layer를 사용하면 큰 문제가 없었다고 합니다. 

하지만, DNN은 성능이 최고 수준에 도달하면 degradation 문제가 발생하고 이 원인이 오버 피팅이 아니라 단순히 layer가 증가함이라고 생각했습니다. 그 이유는 위 그림에서 보는 것처럼 test error만 상승하는 것이 아닌 training error도 함께 높아졌기 때문입니다. 이는 모든 시스템이 optimize하기 쉽지 않다는 것을 보여줘 간단하게 identity mapping layer를 추가해 실험해봤지만 좋은 해결법이 아니었다고 합니다. 그래서 본 논문에서 deep residual learning framework를 통해 해당 문제를 해결하고자 했습니다.

많이 보셨을 그림일 것 같습니다. 위 그림이 바로 Residual learning의 가장 기본적인 블록입니다. 그럼 왜 Residual이냐? 간단하게 입력을 x, 입력 값이 통과해 다음으로 전달되기 위한 함수를 F(x)그리고 출력을 H(x)라고 가정해봅시다. 위키독스의 정리된 설명을 빌리면

x : 입력 값

F(x) : CNN Layer -> ReLU -> CNN Layer 을 통과한 출력 값

H(x) : CNN Layer -> ReLU -> CNN Layer -> ReLU 를 통과한 출력 값

이 됩니다. 기존에 있던 신경망은 H(x)가 정답 y에 다가갈 수 있도록 하는 것이 목표였습니다. 즉 신경망이 학습을 하면서 H(x) – y 의 값을 최소화하면서 H(x)가 y가 동일하게 되는 함수를 찾은 것입니다.  반면, ResNet은 H(x) = x가 되는 것을 목표로 합니다. 이는 출력과 입력의 차인 H(x) – x를 최소화하겠다는 의미가 됩니다. F(x)는 H(x) – x가 되고 여기서 x값은 임의로 바꿀 수 없는 상수 값임으로 F(x)가 0으로 되고 H(x)를 x로 맞춰주는 것이 학습의 목표가 됩니다.

이것이 왜 좋은지는 간단합니다. 예전에는 알지 못하는 최적의 값으로 H(x)를 학습시켜야 했는데 위 과정은 H(x) = x라는 최적의 목표 값이 제공되기 때문에 학습이 쉬워지는 것입니다. 즉, 뚜렷한 목표 값이 생기게 만들어줬다고 생각해도 될 것 같습니다.

또한, H(x) = F(x) + x로 식을 바꿀 수도 있는데 이 덕분에 네트워크 구조 역시 크게 변경할 필요가 없습니다. 입력에서 출력으로 바로 연결되는 shortcut이라 부르는 것을 추가하면 되기 때문입니다. 그리고 입력과 동일한 x가 그대로 출력에 더해지는 것이어서 파라미터 수에 영향이 없고 덧셈이 추가되는 것뿐입니다. 그래도 연산량이 증가하지 않느냐 라고 생각할 수 있지만 곱셈 연산이 덧셈 연산으로 변형되어 몇 개의 layer를 건너뛰는 효과가 있었는데 이 덕분에 forward와 backward가 단순해졌고 gradient 소실을 해결할 수 있었다고 합니다. 


쉽게 이해하면 입력 값인 x가 F를 통과한 이후에 나온 F(x)와 더함으로써 하나 또는 이상의 레이어를 skip하게 만들어줍니다. 그리고 이를 skip connection이라 부릅니다. 자신을 더하는 것이기 때문에 추가적인 파라미터가 필요하지 않은 것이고 학습을 할 때 미분을 하기 때문에 복잡한 것으로 여겨지는 곱셈연산도 필요하지 않게 됩니다.

F(x)와 x를 더하기만 하면 되는 것으로 생각하기엔 행렬 연산이기 때문에 F(x)와 x가 같은 차원이어야 합니다. F(x)와 x가 차원이 같다면 그냥 더할 수 있지만 채널 개수가 증가하거나 x의 크기가 감소하는 등의 문제로 shape이 일치하지 않을 수 있습니다. 

이 때는 padding이나 위처럼 별다른 Ws를 곱해서 shape을 맞춰주는 것도 중요하다고 합니다. 

VGG와 34 layer plain, 34 layer residual 비교입니다. VGG를 참고해 plain을 설계했고 이를 기본 바탕으로 skip connection을 추가한 것이 오른쪽 끝 residual network입니다. 화살표가 shortcut이며 중간중간 점선으로 표시된 화살표는 입력과 출력 차원이 달라 위에서 언급했던 zero padding이나 projection shortcut을 사용합니다. 이때 1*1 convolution을 사용한다고 언급되어 있네요. 

구현은 논문 자체를 확인하는 것이 더 확실할 것 같아 가져왔고 간단히 정리하면 다음과 같습니다.

- [256, 480] 사이 random resize              - Horizontal flip 랜덤 적용

- 224 * 224 random crop                      - standard color augmentation

- Batch Norm 적용                              - he initialization

- Optimizer는 SGD                              - Learning Rate는 0.1에서 시작하고 정체 시 0.1배

- Weight decay는 0.0001                       - Momentum은 0.9

- 60 * 10^4 iteration                            - dropout X

10 Cross Validation 적용, {224, 256, 384, 480, 640} 중 하나가 되도록 resize 하고 평균 score 산출


Experiments

본 논문에서 ImageNet 대상으로 수행한 실험에서 사용한 각 모델 구조의 세부사항입니다. 

왼쪽이 plain, 오른쪽이 ResNet인데 확실히 ResNet에서는 layer가 많을수록 error 값이 떨어짐을 확인할 수 있습니다. 위 실험을 통해 MS 연구팀은 3가지를 확인했다고 합니다.

- 오른쪽 그림에서 보듯 degradation 문제 해결, layer가 증가하더라도 좋은 정확도를 얻음

- plain 대비 error 3.5% 감소, residual learning이 매우 효과적

- 성능이 비슷하더라도 수렴속도 증가 (모델이 깊지 않으면 성능이 비슷할 수는 있지만 속도가 ResNet이 더 빠르다는 이점)


ImageNet에 대해 학습을 진행할 때 학습 시간이 길어질 것 같아서 block을 bottleneck 형태로 수정했다고 합니다.

왼쪽 그림이 위에서 소개했던 구조인데 이를 1*1, 3*3, 1*1 conv로 구성된 3 layer 구조로 만들었습니다. 층은 증가하였지만 1*1 conv 2개를 사용하기 때문에 파라미터 수가 감소하고 연산량이 감소하였습니다. 또한, layer가 많아져 더 많은 비선형성이 추가됩니다.                                    

더 많은 비 선형성 > 더 디테일한 모델링 가능

결론적으로는 Skip Connection을 이용한 Shortcut과 Bottleneck 구조 덕분에 더 많은 layer를 사용해 성능을 올릴 수 있었다고 합니다. 

뭐 언제나 그렇듯 마지막에는 성능이 가장 잘 나왔다고 얘기하고 있습니다. Layer가 많아졌음 에도 degradation 문제없이 타 모델 대비 높은 정확도를 보여주고 있습니다. 

Cifar-10 data에 대해서도 실험을 정리해줬습니다. 이 때 1000개 이상의 layer도 구성해봤는데 성능이 낮아지는 것을 확인했고 이는 train 성능이 비슷한 걸로 보아 과대적합으로 추측하고 본 논문에서는 다양한 규제를 적용하지 않았기 때문에 추후 regularization으로 이 문제를 해결할 수 있을 것이라고 했습니다. 


참고자료

[1] https://arxiv.org/pdf/1512.03385v1.pdf

[2] https://wikidocs.net/137252