[분류모델] ResNet

2021. 6. 28. 17:14인공지능/딥러닝 모델

이번에는 기본 CNN에서 조금 구조적으로 진화된 Network를 살펴보려고한다.

 

지난번 VGGNet같은 경우, 단순 CNN에 3x3필터를 이용하였는데 ResNet은 Residual이라는 조금 새로운 모델 구조를 선보였다. 

 

지금까지도 여러 모델에 Residual이라는 개념이 사용될 정도이니, 이러한 아이디어를 고안한 것이 딥러닝에 얼마나 큰 기여를 하였는지 이해할 수 있을 것이다.


1. ResNet의 배경

ResNet은 Kaiming He라는 연구자에 의해 개발되었다(실질적으로는 그 연구팀).

 

딥러닝을 배우다보면 layer를 깊게 만드는 것이 성능을 높여주는 방법이라고 들은 적이 있을 것이다.

 

원래 과거에는 하드웨어의 한계로 인해 이 layer를 너무 깊게 쌓는 것이 불가능 하였는데, 20세기에 들어서면서 그래픽카드나 cpu, RAM등이 기하학적으로 발전이 진행되면서 이러한 한계를 해결할 수 있게 되었다.

 

따라서 많은 연구자들이 이 layer를 더욱 깊게 만들어 모델의 성능을 개선하려는 시도를 하였는데, 또 다른 문제를 마주하게 된다. 그것이 바로 "Gradient Vanishing Problem"이다.

 

2. Gradient Vanishing Problem

Gradient Vanishing Problem이란, 말그대로 Gradient가 사라져버리는, 0에 매우 가까운 값으로 수렴해버리는 현상을 말한다.

 

Gradient Vanishing(앞 노드일 수록 Gradient가 작게 전달되는 것을 볼 수 있다)

출처: https://smartstuartkim.wordpress.com/2019/02/09/vanishing-gradient-problem/

 

현재 모델의 학습은 Back Propagation 알고리즘을 사용하는데, 여기서 자세히 설명은 하지 않겠지만 모델의 끝 노드(loss 직전)에서부터 시작하여 첫 노드(모델의 시작)까지 Gradient를 뒤로 전파시켜서 갱신하는 것이라 보면 된다(추후에 Back Propagation에 대해 자세히 다루도록 하겠다).

 

이러한 과정 속에서 Gradient가 계속해서 곱해지게 되는데, 0-1 사이의 gradient가 계속해서 곱해지다보면 0에 수렴하여, 뒤로 갈수록 update가 진행되지 않아 더이상 성능이 개선되지 않게 된다.

 

3. Residual Learning

3-1 Normal CNN

일반적인 CNN의 경우를 먼저 살펴보자.

아래 그림에서 볼 수 있듯이, 입력 X가 들어오고, 2개의 Weight layer를 거치면서 출력 H(X)를 내보낸다.

여기서는 최적의 H(X)를 얻는 것이 목표가 되고, 그에 맞추어 파라메터 값이 갱신된다.

 

3-2 Residual CNN

Residual은 H(X)가 아닌 $F(X) = H(X) - X$를 최적화하는 것을 목표로 하며, 결과적으로 출력 $H(X) = F(X) + X$를 가지게 된다. 

 

입력에서 바로 출력으로 연결되는 shortcut 연결이 생겨 forward와 bacward path가 단순해지는 효과를 얻을 수 있고, 연산량 관점에서 덧셈만 추가 되기 때문에 효율성도 좋다.

 

논문에서 최적의 경우를 $F(X)=0$이라고 보는데, 즉 H(X)=X라는 방향성을 가지며, 이로 인해 pre-conditioning 효과를 볼 수 있다고 한다.

 

ResNet은 위와 같은 장점을 가진 Residual Block을 사용함으로써, Skip Connection(short cut)을 통해 몇 계층 이전의 Gradient를 한 번에 위로 올려 Gradient Vanishing 문제를 보완할 수 있다.

 

또한, ResNet에서는 Network가 깊어질수록 기하급수적으로 늘어나는 연산량 문제를 해결하기 위해 BottleNeck 구조를 사용하였다. 다음과 같이 1x1 Convolution으로 채널 수를 줄인 상태에서 3x3 conv연산을 하고, 다시 원래 채널로 돌려주는 구조를 BottleNeck이라고 하고, 이러한 구조는 기존과 비슷한 역할을 하면서 연산량은 대폭 줄여주는 역할을 한다.

 

기존 Residual Block(왼쪽), BottleNeck Residual Block(오른쪽)

 

위의 기존 Residual Block의 파라메터 개수를 계산하면 3x3x64 + 64(bias) + 3x3x64 + 64 = 1280개

오른쪽의 BottleNeck Block의 파라메터 개수를 계산하면 1x1x16 + 16 + 3x3x16 + 16 + 1x1x64 + 64 = 320개

 

즉, BottleNeck구조가 파라메터 개수가 4배정도 차이가 나면서 연산량에서 큰 이득을 보게 된다.

 

4. 개선된 ResNet

ResNet논문을 낸 연구원들이 ResNet ver2로써 발표한 것으로, ResNet의 문제점을 제시하며 개선하였다. (그래봤자 크게 달라진 것은 없다.)

 

먼저 기존 ResNet은 최종 출력 값에 Relu를 적용하여 내보내는데, 이를 진정한 Identity가 아니다라고 판단하였고, 따라서 add후에 relu하는 부분을 제외하였다.

 

 

위 그림에서 $x_{l+1}$을 $x_l$과 $F(x_l)$(residual)의 합으로 표현할 수 있다는 것에 의미를 두고 있다.

이로 인해 특정 위치의 출력특정 위치에서의 입력residual 함수의 합으로 표현이 가능하여 forward path와 backward path가 더욱 간단해진다.

4-1. Activation 함수 위치에 따른 성능 체

논문에서 또한 Activation 함수 위치에 따라 다양한 실험을 해보았다.

여기서 (e)가 연구원들이 찾은 최적의 조합이고, 다음은 다른 case들에 대한 리뷰이다.

 

  1. (b): BN의 위치를 Addition 뒤로 옮긴 경우.
    • BN이 propagation path를 복잡하게 만들 수 있다.
    • train, test에서 original 보다 좋지 않은 성과.
  2. (c): Relu를 Residual block 안으로 옮긴 경우.
    • original의 경우, residual 함수의 결과가 $(-\infty, +infty)$ 범위를 가지는데, (c)의 경우 residual net의 결과가 항상 non-negative이기 때문에 망의 representation 능력이 떨어진다.
  3. (d), (e): Pre-activation의 성능을 확인하기 위한 구조.
    • BN 다음 relu가 옴으로써 Regularization 효과를 얻게 되고, (c)의 단점도 해결하여 좋은 결과를 얻을 수 있다.

 


이렇게 ResNet에 대해 알아보았다. 실제 구현을 해보면 Add 연산만 추가된 것임에도 불구하고 성능이 꽤 향상되는 것을 느낄 수 있다. 또한, Gradient Vanishing 문제도 보완해주기 때문에 더 깊은 Network를 구축할 수 있다는 장점도 있다.

 

다음은 DenseNet에 대한 리뷰를 할 예정이다.

'인공지능 > 딥러닝 모델' 카테고리의 다른 글

[Detection] YOLO (You Only Look Once)  (0) 2022.09.06
[분류모델] VGGNET  (0) 2021.06.24