AI/논문 읽기

ResNet: Deep Residual for Image Recognition

모딩 2021. 8. 8. 01:18
반응형

해당 포스트는 상당 부분 blog1blog2 를 인용하였음을 밝힙니다.

 

정리

(원인) 레이어 망이 깊어져서 ->  vanishing/exploding gradients 문제 발생 -> weight convergence 가 뒤따라옴 -> SDG같은 옵티마이져를 써서 다소 해결을 함 -> 그래도 training error 발생  (결론) 이런 문제를 degradation problem 이라고 함

degradation problem을 한마디로 정리하자면, 레이어가 깊어져서 최적화된 웨이트 값을 못찾는 현상이라고 할 수 있다.  

-> (해결) residual net을 쓰니 해결 됨 -> (발전) bottleneck block 이용하면 연산량을 줄일 수 있음

 

 

등장 배경

Degradation Problem

Deep convolutional neural networks가 나온 이후로 많은 발전이 있었습니다.

기본적으로 deep networks는 features들을 스스로 low/mid/high level features로 나누며, 근래의 모델들의 경우 layers층을 더 깊이 있게 쌓아서 features들의 levels을 더욱 세분화하고자하는 시도가 있었고, ImageNet 챌린지에서 16개 또는 30개등의 layers를 사용하는 매우 깊은 모델들을 사용하기도 하였습니다.

->  features들을 low/mid/high level로 나눠서 features의 세밀한 특징을 추출하고자 함. 이 과정에서 layer depth는 깊어짐. 

 

단순히 layers를 더 많이 쌓으면(Plain Network) 더 좋은 결과를 낼 것인가? 라는 질문에는 사실 문제가 있습니다. 

이미 잘 알려진 vanishing/exploding gradients의 문제는 convergence(수렴)자체를 못하게 만듭니다.

->  weight(가중치)들의 분포가 균등하지 않아서, 역전파시 기울기가 충분하지 않게 되어 최적의 학습 결과에 미치지 못하는 상태 

이러한 문제는 normalized initialization,그리고 intermediate normalization layers에 의해서 다소 해결이 되어 수십층의 layers들이 SGD를 통해 convergence될 수 있도록 도와줍니다. 

-> 결국에는 레이어가 깊어지면 문제 1. 가중치가 잘 안뽑혀서 SGD같은 optimizer 함수를 사용하여 잘 수렴될 수 있도록 도와줌 

 

Deeper Network를 사용할 때,  degradation problem이 발견되었습니다. degradation problem은 network의 depth가 커질수록 accuracy는 saturated (마치 뭔가 가득차서 현상태에서 더 진전이 없어져 버리는 상태)가 되고 degradation이 진행됩니다. 이때 degradation은 overfitting에 의해 생긴 것이 아니며, 더 많은 layers를 넣을수록 training error가 더 높아집니다. 만약 overfitting이었다면 training error는 매우 낮아야 합니다. (overfitting: training 과정에 과하게 최적화되어 학습된 경우)

-> 레이어가 깊어지면 문제 2. 정확도 측면에서도 saturated 됨. 깊으면 깊을 수록 training error 가 높기 때문.

CIFAR-10 데이터에 대한 training error(왼쪽) 그리고 test error(오른쪽) 그래프. 20-layers 그리고 56-layers를 사용했으며, 더 깊은 네트워크일수록 training error가 높으며, 따라서 test error또한 높다.

실제로 실험 결과, shallow network에서 학습된 모델위에 다층의 layers를 추가적으로 쌓습니다. 이론적으로는 deeper 모델이 shallower 모델에 추가된 것이기 때문에 더 낮은 training error를 보여야 합니다. 하지만 학습된 shallower 모델에 layers를 더 추가시켜도, 그냥 shallow 모델보다 더 높은 training error를 보여줍니다.

-> 깊은게 좋다는 논리 가정: 깊으면 깊을 수록 오류가 적어야하는데, 실제로 실험 결과, 깊은 모델이 얕은 모델보다 오류가 높았음 

-> degradation problem이 발생했다고 볼 수 있음.

이러한 현상을 degradation problem이라고 하며, Deep Residual Network가 해결하려는 부분입니다.

 

Deep Residual Network

Residual mapping

앞선 부분의 feature가 뒤쪽까지 영향이 직접적으로 전달되는것이 아니라, 중간을 거쳐 전달되기 때문에 학습의 과정에서 크게 변합니다. 그런데 간단한 덧셈 레이어인 shortcut connection(=identity mapping)을 추가해주게 되면, 이전으로부터 얼만큼 변하는지 나머지 H(x) - x (residual)만 계산하는 문제로 바뀌게 됩니다. 즉, 현재 레이어의 출력값과 이전 스케일의 레이어 출력값을 더해 입력을 받기 때문에 그 차이를 볼 수 있게 되는 것이죠. 따라서 학습하는 과정에서 "그 조금"을 하면 되는 것이고, 더 빠르게 학습한다는 장점이 생깁니다. 

-> 여기서 identity mapping이라는 뜻은 f(x)=xf(x)=x 의 의미입니다. (값을 받으면 동일한 x를 리턴시키는 덧셈 레이어)

 

 

Residual 뜻

 

성공적인 identity mapping을 수행하려면, x가 F(x)를 거쳐서 나온 값이 여전히 x여야 합니다. 여기서 나온 x값을 H(x)라고 하겠습니다. 

x가 H(x)가 되기 위해서는, F(x)를 어떻게 학습시키는 게 좋을까요?

해당 논문에서는 F(x)를 H(x) - x로 바꿔서(H(x)값을 미리 안다는 가정으로!), F(x)에 x를 더했을 때 H(x)에 근사하도록 하는 것(Residual mapping)이 더 쉽게 H(x)에 근사한다고 제안했습니다. 

Residual Block

 

결론

Plain Network는 단순히 Convolution 연산을 단순히 쌓는다면, ResNet은 Block단위로 Parameter을 전달하기 전에 이전의 값을 더하는 방식입니다. 

 

F(x) : weight layer => relu => weight layer

x : identity

 

weight layer들을 통과한 F(x)와 weight layer들을 통과하지 않은 x의 합을 논문에서는 Residual Mapping 이라 하고, 그림의 구조를 Residual Block이라 하고, Residual Block이 쌓이면 Residual  Network(ResNet)이라고 합니다.

Residual Mapping은 간단하지만, Overfitting, Vanishing Gradient 문제가 해결되어 성능이 향상됐습니다.

그리고 다양한 네트워크 구조에서 사용되며, 2017년 ILSVRC을 우승한 SeNet에서 사용됩니다.

 

구현 

Pytorch. Residual Block 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형