CNN based Models : ResNet 모델에 대한 정리

ResNet 개요

  • ResNet은 마이크로소프트에서 개발한 아키텍처로, 2015년 ILSVRC(ImageNet Large Scale Visual Recognition Challenge)와 COCO에서 우승하며 처음으로 Human error를 능가하는 3.57%의 top5 error 를 보여줌
  • 2014년의 GoogLeNet이 22개 층으로 구성된 것에 비해, 우승 모델인 ResNet-152는 152개 층을 갖는다
  • 동일한 개념이지만 레이어 수가 다른 ResNet-18, ResNet-34, ResNet-50, ResNet-101, ResNet-110, ResNet-152, ResNet-164, ResNet-1202 등이 있다.
  • 단순히 네트워크 깊이만 깊어지면 무조건 성능이 좋아지는지 확인하기 위해 저자들은 convolution layer들과 fully-connected layer들로 20층의 네트워크와 56층의 네트워크의 성능을 비교함
    • 오히려 더 깊은 구조를 갖는 56층의 네트워크가 20층의 네트워크보다 더 나쁜 성능을 보임
    • 깊은 layer에서 발생하는 gradient vanishing/exploding 문제
    • 파라미터 수의 증가로 인한 학습의 어려움
  • Paper : Deep Residual Learning for Image Recognition

+full


Residual Learning

Identity Mapping (기저 이론)

  • Identity mapping은 입력값과 출력값이 같은 매핑 (항등행렬의 항등 개념)
  • 레이어가 매우 깊은 모델이라면 입력으로부터 차근차근 조금씩 입력값을 바꿔 나가는 것이 이상적일 것이라는 가정
  • 그러기 위해서는 각 레이어의 계산과정에 각각의 입력값을 출력단에 그대로 전달(identity)하여, 학습 시 weight의 큰 변화를 막자(최소화 하자, residual(잔차)만 학습하자, 학습 난이도를 줄이자)

+full

  • 위 그림과 같이 CNN 구조에서는 입력부분에 가까운 하위 레이어에서는 매우 단순한 구조나 노이지한 패턴이 보이는 low-level feature가 학습이되고, 출력부분에 가까운 상위 레이어에서는 구조적인 부분이 학습되는 high-level feature가 학습됨

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

  • 예를 들어, 잘 학습된 ResNet-50은 3436 레이어 출력값 사이의 값의 변화가 그리 크지않을 것이다.

  • 따라서, 는 입력값인 에 근사 할 것이다

Residual Block

  • ResNet 아이디어의 핵심으로, Residual(잔차)를 학습함 Gradient가 깊은 위치까지 잘 도달할 수 있게 지름길을 만들어줌(skip-connection)

+full

기존 방식

  • 기존 방식은 입력 를 받고 direct로 가 출력됨 (는 Convolution과 Relu의 반복 연산)
  • 를 타겟값인 로 매핑하는 함수를 찾는 것이 목적
  • 즉 신경망은 학습을 하면서 의 값을 최소화하면서 가되는 함수를 찾음
  • 이때 타겟값 는 입력값 를 통해 새롭게 생성하는 정보(기존 학습한 정보를 보존하지 않고 변형시켜 새롭게 생성됨)

Residual block

  • Residual Learning 방식은 으로, 타겟값 에 기존 입력 정보인 값을 힌트로 줌
  • 를 묶어 라 할 때, Identity Mapping (기저 이론)에 따라 가 되는 것을 목표로 학습됨
  • 즉, 이 되도록 학습하며 각 레이어의 계산과정에 각각의 입력값을 출력단에 그대로 전달(identity)하여 학습 시 weight의 큰 변화를 막아 학습 난이도를 줄이며 gradients vanishing 문제에도 효과적임
  • 이러한 입력값 의 정보를 몇 단계뒤의 출력에 알려주는 것을 skip-connection (shortcut) 이라함
  • Resnet에서는 skip-connection이 포함된 2개 이상의 Conv Layer를 하나의 Block으로 묶어 이를 Residual Block이라 명명함
  • 는 residual block 내 레이어 개수, 는 residual block의 입력과 출력일 때, 수식은 아래와 같음
  • 이때 와 기존 정보 의 차원이 달라 단순 더하기 연산이 불가능한 경우, 차원을 맞춰 주기 위한 를 사용함 (linear projection)

Residual block 학습 (역전파)

  • 위 그림은 resdiual block의 역전파 시 gradient의 전파 경로를 나타낸 그림으로, 파란색 선은 기존의 전파경로를 표현함
  • 초록색 선은 skip-connection으로 생긴 지름길의 전파경로이며 loss로부터 gradient가 를 건너 뛰고 바로 으로 전달되는 모습을 볼 수 있음
  • 이러한 역전파 시 지름길의 전파경로는 입력층과 가까운 층까지 gradient가 잘 전달될 수 있도록함

  • 함수 를 skip-connection이 포함된 블럭에서 기존 경로로 계산되는 식이라고 하면 는 아래와 같이 표현할 수 있다
  • Loss 함수에 대한 입력 가 미치는 영향(기울기)을 구하면 아래와 같다
  • 에 대한 의 기울기를 구하면 아래와 같다
  • 다시 위 식에 대입해보면 다음과 같이 정리됨
  • residual block의 기울기 정리를 보면, 를 기준으로 좌항은 가중치 레이어를 지나며 gradient가 0으로 수렴할 수 있지만, 우항의 가 살아있으므로 gradient를 보장할 수 있다
  • 가 되도록 학습 > 에 대한 미분 결과가 이므로 gradient 값이 항상 1 이상이다 > gradient vanishing 문제를 해결

  • 가중치 을 업데이트하는 역전파 수식은 아래와 같음
  • 를 체인룰로 표현하면 아래와 같다

  • 위 식에서 좌항은 기존 gradient를 계산하는 식이고, 우항은 지름길(shortcut)로부터의 gradient를 계산하는 식임
  • 좌항의 기존 gradient는 컨볼루션과 활성화함수의 연산을 거치며 기울기가 0에 수렴할 위험이 여전히 크다
  • 하지만 지름길로부터의 gradient는 기존 gradient와 달리 곱해야 할 gradient 요소들의 개수가 줄어든 모습을 볼 수 있어 gradient 값을 유지하는데 도움을 줄 수 있다
  • gradient가 최소 1이 보장되므로 0으로 수렴할 일이 없어 항상 모든 정보가 통과하며, 지속적인 residual learning이 가능하여 깊게 레이어를 쌓을 수 있음
  • 결국 지름길로부터의 Gradient는 0이 되지 않고 살아남을 확률이 커져 네트워크의 깊이를 깊게 만들어주어도 gradient가 더 잘 전파되어 잘 학습할 수 있게 됨

ResNet Architecture

ResNet-34

  • ResNet은 기본적으로 VGG-19의 구조를 뼈대로하며, 컨볼루션 층들을 추가해서 깊게 만든 후에 shortcut들을 추가 하였다
  • 아래는 VGGNet과 비슷한 콘셉트로 만들었지만 Residual Learning 개념이 적용되지 않은 Plain 모델, 그리고 Residual Learning 개념을 적용한 모델의 Architecture를 표현한 그림
  • 34-layer ResNet은 처음을 제외하고는 균일하게 3x3 사이즈 컨볼루션 필터를 사용하고, 특성맵의 사이즈가 반으로 줄어들 때, 특성맵의 뎁스를 2배로 높임

+full


Residual Block 상세

1-convolution

  • 모델은 아래와 같은 3x3필터 컨볼루션 작업의 반복으로 구성됨
  • 입력에 Padding=1을 취해주고 3x3x64필터 64개를 Stride=1의 컨볼루션 연산을 통해 입력사이즈와 같은 (56x56x64) 출력이 나옴

  • 위 연산을 하나의 Residual block으로 확장하면 아래와 같다

  • 동일한 절차를 이어 아래와 같이 나타냄


2-convolution

  • 두 번째 컨볼루션 구조에서는 처음으로 3x3x64필터 128개와 Padding=1, Stride=2를 통해 Depth를 늘림(Down Sampling)
  • 28x28x128 출력이 나옴

  • 이때 skip connection의 덧셈을 위해 인풋 피처맵(56x56x64)는 아래와 같이 처리하며, 이러한 처리 방식을 Projection Shortcut이라고함

  • 1x1x64필터 128개를 컨볼루션하여 아웃풋 피처맵과 동일한 구조(28x28x128)로 만든 후 skip connection에 사용함

  • 두 번째 종류의 컨볼루션의 최종은 아래와 같음


여러 층의 ReNet 구조

  • 아래 표는 18층, 34층, 50층, 101층, 152층의 ResNet이 어떻게 구성되어 있는지 나타냄
  • ReNet-50/101/152 구조에서는 Bottleneck구조가 사용됨

+full


Bottleneck 구조

  • Resnet-50/101/152 모델에서 연산을 줄이기 위해 사용되며 아래 그림 처럼 residual block이 1x1, 3x3, 1x1으로 구성된다. 이러한 모양이 병목처럼 보이기 때문에 Bottleneck 구조라 함
  • block의 처음에 1x1 convolution은 Inception의 구조에서 살펴본 것 처럼 차원을 줄이기 위한 목적이며 이렇게 차원을 줄인 뒤 3x3 convolution 수행 후, 마지막 1x1 convolution은 다시 차원을 확대 시키는 역할을 함
  • 결과적으로 3x3 convolution 2개를 곧바로 연결시킨 구조에 비해 연산량을 절감 시킴

  • Bottleneck의 예시

ResNet V2

  • 아래는 ResNet-V1 과 ResNet-V2의 기본 아키텍쳐를 보여줌

  • ResNet-V1 사이에 add 후 두번 째 ReLU 연산을 하지만, ResNet-V2는 마지막 ReLU를 제거하였고, conv 연산을 하기전에 입력에 BN 및 ReLU를 적용함
  • 따라서 ResNet-V2는 마지막 ReLU를 제거하여 ID 매핑으로 만드는 데 중점을 두며, 출력 레이어에서 계산된 gradient 값은 변화 없이 쉽게 초기 레이어에 도달할 수 있게 함

ResNet 성능평가

Plain vs. ResNet

  • Shortcut을 활용한 Residual Blcok이 효과가 있는지 평가하기 위해 18층 및 34층의 plain 네트워크와 ResNet의 성능을 비교함

  • 왼쪽 그래프를 보면 plain 네트워크는 망이 깊어지면서 오히려 에러가 커졌음을 알 수 있다. 반면, 오른쪽 그래프의 ResNet은 망이 깊어지면서 에러도 역시 작아짐
  • shortcut을 연결해서 잔차(residual)를 최소가 되게 학습한 효과가 있다는 것

ResNet 깊이에 따른 성능비교

  • ResNet 은 깊이가 깊어짐에 따라 더 낮은 에러를 보였고, 1000개 이상의 layer가 쌓였을 때는 오버피팅이 일어났다고 함


Post-activation vs. Pre-activation 비교

  • 아래 그림은 activation 위치에 따라 변화하는 에러율을 나타내며, ResNet-V2로 가는 과정을 보여줌
  • 최종적으로 (e)의 구조처럼 Batch Normalization과 ReLU 모두 weight앞에 위치한 full pre-activation 구조가 가장 좋은 성능을 보여줌
  • 또한, (e) 구조는 Batch-Normalization을 통과해 정규화된 신호가 weight layer를 통과하기 때문에 상대적으로 overfitting이 덜 일어나서 일반화 성능이 올라가는 결과를 보여줌

+full


참고