아는 만큼 보인다

[논문 읽기] ResNet - Deep Residual Learning for Image Recognition 2015 이해하기 본문

머신러닝&딥러닝

[논문 읽기] ResNet - Deep Residual Learning for Image Recognition 2015 이해하기

계토 2023. 6. 14. 22:00

요번 ECG 리듬 분류 모델로 preactivated ResNet을 사용하고 있는데, 생각해보니 쓰고 있긴 하지만 ResNet 자체를 제대로 짚고 넘어간 적이 없는 것 같아, ResNet 과 preactivated ResNet을 순차적으로 리뷰해보려 한다. 특히, ECG 분류에 있어서 ResNet은 여러모로 무난하게 잘 작동하는 모델인 것 같다. Literature review를 해봐도 ResNet 을 사용한 논문이 많은 것 같았다.

 

시작! (참고로 ResNet이 해결하려는 문제가 무엇인지 분명히 짚고 가고자 서론이 좀 길다 ㅎㅎ)

Deep Residual Learning for Image Recognition (link)

ResNet이 해결하고자 하는 문제, ResNet의 동기

딥러닝 모델들이 개발되면서, 사람들은 layer를 계속 쌓곤 했는데, layer를 더 쌓는다고 해서 잘 배우는 것은 아니었다. 깊이 쌓는 것은 두가지 문제가 있었다.

 

첫째, vanishing/exploding gradient 문제로 convergence가 잘 안된다는 문제였다. 그러나 이 문제는 normalized initialization을 하거나, batch normalization 같은 intermediated normalization layer를 추가함으로써 조금은 해소되었다.

 

그러나 이 문제를 해결한 뒤에도, 즉, convergence는 잘 된다고 해도, layer가 많아졌을 때 학습 정확도(training accuracy)가 낮아지는 현상이 있었다. 아래 그림에서, 좌측은 training error이고 우측은 test error인데, 둘 모두 56-layer, 즉 더 깊은 layer가 덜 깊은 layer (20-layer) 모델 보다 training error가 크다는 걸 보여준다.

출처: ResNet 2015 Figure 1

이것이 바로 모델을 깊이 쌓는 것의 두번째 문제인 degradation 문제이다. 이 문제는 overfitting의 문제와는 다르다. 왜냐하면 overfitting은 training error는 감소할 때 test error가 증가하는 현상인데, 여기서는 training error 또한 크기 때문이다. 이게 바로 degradation problem이라고 불리는 문제다! 이 문제는, 네트워크 깊이가 깊어 네트워크 중간 지점에서 학습이 완료되고 그 이후 layer 부터는 정확도가 빠르게 감소하는 현상이라고 한다. 

 

이 현상은 모든 시스템이 쉽게 최적화할 수 있는 것은 아니라는 걸 보여준다. 우리는 가장 이상적으로 최적화된 모델을 상상할 수 있다. 어떤 문제를 학습하는데 적절한 layer의 수가 있을 때, layer를 더 깊이 쌓더라도 그 추가된 layer는 마지막으로 가장 잘 학습된 정보를 identity mapping으로 전달해서 정확도가 감소하지 않는 모델이 있을 수 있다. 즉 layer가 10개만 있어도 잘 학습할 수 있다고 해보자. 어떤 모델이 15개의 layer를 갖고 있다면, 10개까지는 적절한 weight를 학습하고, 이후 5개는 10개까지 배운 정보를 그대로 전달하는 것이다. 이렇게 이상적인 경우에 따르면 더 깊은 모델은 최소한 더 얕은 모델보다 성능이 같거나 높아야 한다. 낮아서는 안된다. 그러나 현실의 degradation 문제는 최적화의 문제가 그리 간단하지 않음을 보여준다.

 

그래서 ResNet 2015은 이러한 degradation 문제를 개선하기 위해 직접 skip connection을 통해 identity mapping을 전달해주어 잔차만 학습할 수 있게 해주는 구조의 deep residual learning framework를 제안한다. 이 논문은 새로운 잔차 학습 구조를 통해 1) 더 쉬운 최적화, 2) degradation 문제의 해결(깊이가 증가했을 때 plain net보다 낮은 training error), 3) 더 깊어질 수록 더 높은 정확도 달성 등의 목표를 이룰 수 있음을 보여준다! 

 

사실 잔차라는 개념도 새로운 게 아니고, shortcut connection의 개념도 각각 새로운 것은 아닌데, 이 논문의 새로운 점은 shortcut connection에 identity mapping을 사용하여 잔차를 학습하게 했다는 부분이다.

 

잔차 학습(Residual learning)이란?

좌측 그림은 직접 그림, 우측 그림은 ResNet 2015 Figure 2

우선 잔차 학습을 직관적으로 이해해보자. 이 부분은 다른 블로그(https://itrepo.tistory.com/36)의 도움을 받았다. 

 

Plain networks

좌측의 일반적인 구조는, 아웃풋을 y라고 할 때, y = H(x)를 직접(directly) 학습하는 구조이다. 여기서 y는 x를 통해 새롭게 학습하는 정보이다. 즉 기존에 학습한 정보를 보존하지 않고 변형시켜 새롭게 생성하는 정보이다. 

 

(Neural network가 고차원적인 feature vector로의 mapping을 학습한다고 가정했을 때, 층이 깊어질 수록 한번에 학습해야 할 mapping이 많아져 학습이 어려워진다)

 

Residual networks

우측의 구조는 y = F(x) + x 이다. 이 구조에서는 기존에 학습한 정보(=x)를 보존하고, 추가적으로 F(x)만 학습하면 된다.

 

즉 소수의 layer 들이 우리가 원하는 mapping에 바로 fitting되기를 바라는 대신, 작은 정보만 추가적으로 학습하도록 하여 각각의 레이어가 배워야 할 정보량을 축소하는 것이다. 즉, 기존에 학습된 x를 추가함으로써 x만큼을 제외한 나머지 부분만을 학습하면 되므로 학습량이 상대적으로 줄어드는 효과가 있다.

 

특히 layer의 후반부로 올 수록 추가 학습량 F(x)는 점점 작아져 최종적으로 0에 근접하는 최소값으로 수렴될 것이다. 즉, F(x)가 0이 되도록 학습이 진행된다 (F(x)가 0에 가까워지는 것과 관련해서는 논문의 4.2에 Analysis of Layer Responses의 분석을 통해 증명?해주고 있다).

 

이 논문에서는 plain networks 처럼 아무것도 참조하지 않은 mapping을 최적화하는 것보다는 residual mapping을 최적화하는 것이 더 쉽다고 가정한다.

 

극단적으로, 아까의 이상적인 예시처럼 만약 잉여 layer 에서 identity mapping이 최적이라고 가정해보자. 그 잉여 layer 가 identity mapping을 학습한다는 것은 x = H(x)가 되는 mapping을 학습한다는 말이 된다. 그러나 x = H(x)가 되는 weight들을 찾는 것은 쉽지 않다. 만약 잉여 layer가 residual learning 구조로 되어 있다면, x = H(x)를 직접 학습하는 것이 아니라, F(x)=0이 되는 mapping을 학습하여 y = 0+x가 되도록하면 되는데, 이 후자가 더 쉬울 수 있다. 왜냐하면 그냥 F(x)의 weight들을 0으로 만들면 되기 때문! 

 

이러한 잔차 학습은 하나 이상의 layer를 skipping 하는 shorcut connection으로 구현될 수 있고, 위의 구조에서는 identity mapping을 시행하고 그 output이 마지막 layer에 더해지는 방식이다. 물론 논문에서는 identity mapping뿐 아니라 projection mapping도 소개하고 있지만 identity mapping의 경우 파라미터를 추가하지도 않고 계산 복잡도를 증가시키지도 않으면서 성능도 잘 나와 좋다고 한다.

 

중요한 건 더하기 연산이 있으므로 x와 F(x)의 차원은 같아야 한다는 것!!!!! 그리고 F(x)의 형태, layer 수는 다양할 수 있다.

 

Bottleneck Design 적용

이 논문에서는 훈련 시간을 줄이기 위해 building block을 bottleneck design으로 변경했다고 한다. 즉 각 residual function F에 대해 3개의 layer를 쌓았다. 아래의 우측그림에서 처럼, 가운데의 3x3 layer의 앞 뒤에 1x1 layer를 놓아서, 1x1 layer들이 각각 차원을 줄이고 늘리는(복구하는) 역할을 하게 함으로써, 3x3 layer를 작은 input, output 차원을 가지는 bottleneck으로 만든 것이다. 

좌: 일반 building block 우: bottleneck building block

 

결과는 결국 ResNet이 이전의 다른 모델보다 잘한다는 것~~ 즉  1) 더 쉬운 최적화, 2) degradation 문제의 해결(깊이가 증가했을 때 plain net보다 낮은 training error), 3) 더 깊어질 수록 더 높은 정확도 달성 등의 목표를 이룰 수 있음을 보여주었다.

 

 

느낌 - 어려웠던 점  좋았던 점 등등

1. 위에는 소개하지 않았지만, 처음엔 이 논문의 가정 부분이 이해하기 어려웠다. "여러 비선형 레이어들이 복잡한 함수를 점근적으로 근사할 수 있다고 가정할 수 있다면, 이것은 여러 비선형 레이어들이 점근적으로 그 잔차함수 (residual functions, i.e., H(x)-x)를 근사할 수 있다고 가정할 수 있다" 라는 부분이 어려웠는데, 결국은 복잡한 함수에 fitting할 수 있으면, 거기서 자기 자신을 뺀 함수 정도는 fitting할 수 있다?라는 의미로 대략적으로 이해했다. 즉 이거 할 수 있으면 저거도 할 수 있다! 

 

2. 전체적인 아이디어 이해를 위해 다른 블로그들의 도움을 많이 받았는데, 사실 몇몇 블로그들은 이게 맞나 싶은 경우가 있었다. 동기를 단순히 vanishing gradient로 소개하는 부분 등... 좀 의문이 드는 경우도 있긴 했는데 우선은 내가 이해한 바 대로 정리하였다. vanishing gradient 보다는 degradation이 좀 더 큰 문제..? 물론 두 개를 별도로 볼 수는 없을 지도 모르겠다.

 

3. 영어 블로그들도 당연히 도움이 됐는데 같은 영어인데도 어떻게 풀어쓰느냐에 이해 안되던 부분이 되기도 하는 걸 보고 신기했다.

 

4. 논문 읽고 정리 -> 각 정리한 부분에서 이해 안 되는 부분 블로그 서칭해서 추가 부연 -> 어지럽게 남겨져 있는 정보들을 잘 조합해서 블로그 작성의 순서로 진행했는데, 마지막에 정리하면서도 한 번 더 이해가 된 느낌이라서 뿌듯하당 ㅎㅎ 

 

5. preactivated ResNet도 리뷰하고, ResNet 구현하기 포스팅도 할 예정!! preactivated ResNet에서는 좀 더 수학적인 증명이 들어가 있다고 하는데 기대가 된다.

 

 

도움 받은 자료들

https://medium.com/swlh/resnet-a-simple-understanding-of-the-residual-networks-bfd8a1b4a447

 

ResNet: A Simple Understanding of the Residual Networks

A comprehensive guide to understanding the beginning of ResNets (Residual Networks) and how they have helped solve a major complication in…

medium.com

- https://velog.io/@lighthouse97/ResNet%EC%9D%98-%EC%9D%B4%ED%95%B4

 

ResNet의 이해

참고1 참고2 참고3 1. 동기(Motivation) 2015년 ILSVRC(ImageNet Large Scale Visual Recognition Challenge)에서 우승을 차지한 ResNet에 대해서 소개하려고 한다. ResNet은 마이크로소프트에서 개발한 알

velog.io

- https://itrepo.tistory.com/36