지금 보면 당연한 것들이지만 당시에는 당연하지 않았다는 사실~
특징
VGGNet의 성공 비결: 3X3 convolution
필터 사이즈가 커지면 가지는 이점은 Receptive field
(=한 셀의 convolution feature map을 갖기 위해 고려하는 입력의 spatial demension)가 커진다
는 것이다. 즉, 딥러닝 모델이 입력 데이터의 더 넓은 영역을 한 번에 볼 수 있게 되는 것이다. 이것의 장점은 1) 단순한 로컬 패턴을 넘어서 더 복잡한 글로벌 패턴을 학습할 수 있고, 2) 모델이 노이즈나 작은 변화에 robust해지며, 3) 로컬 feature를 결합하여 더 풍부한 표현이 가능하다는 것이 있다.
그런데 반대로 단점은 파라미터 수가 너무 커진다
는 단점이 있다. 이 때 VGGNet은 receptive field는 유지하면서 파라미터 수를 줄일 수 있는 방법을 제시한 것이다.
구체적으로, 3x3 필터 2개를 사용하는 것과 5x5 필터 1개를 사용하는 것을 비교해보자. 파라미터 수는 아래 이미지와 같이 3x3 2개가 훨씬 적다는 것을 볼 수 있다. 그런데 receptive field는 둘이 동일하다. 왜냐하면 1) 3x3 필터 하나를 지나면 다음 레이어의 하나의 픽셀에 3개의 픽셀 정보가 합쳐지게 된다. 그리고 2) 두번째 레이어에서 (이전3개 픽셀 정보를 갖고 있는 셀 1개 + 주변(가로, 세로) 셀 2개) = 3개의 셀을 한번에 고려하여 다음 레이어로 넘어가게 된다. 따라서 총 3+(3-1)=5 의 수용영역이 되는 것이다.
특징
Network-in-Network (NIN) 구조
라고 부른다. Inception Blocks
: 하나의 입력이 들어왔을 때 여러개로 퍼졌다가 다시 하나로 합쳐지는 형태GoogLeNet의 성공 비결: Inception Block
장점
: 파라미터 수를 줄인다!
기존 문제
파라미터 수가 많아지면 overfitting 문제가 쉽게 발생한다. 즉, train error는 작지만 test error는 큰 문제가 생기는 것이다. 그런데, overfitting과 유사해보이지만 overfitting은 아닌 문제가 발견되었다. 바로 그저 단순하게, 네트워크가 깊어질수록 학습이 잘 안되는 현상
이 발견되었다. 아래 그림에서 보다시피 train/test error 모두 줄어들기 때문에 overfitting은 아니다. 그런데 layer가 깊어질수록 에러가 줄어들어야하는데, 오히려 56-layer가 20-layer보다 에러가 큰 문제가 발생한 것이다.
ResNet의 성공 비결: Residual Block
Residual block은 3x3 convolution layer
와 Batch Normalization
, ReLU함수
, Skip Connection
이 더해진 것이다.
그 중 생소할 것 같은 Skip Connection이 무엇인지 설명해보도록 하겠다.
왼쪽이 기존 방식(plain layer)이고, 오른쪽이 residual block이다. 둘의 차이점은 단 한가지이다. residual block만 input인 를 출력값에 더해주는 것이다. 이를 통해 convolution layer가 학습하고자 하는 quantity는 residual이 되는 것이다.
기본적인 개념은 설명했는데, 이를 좀 더 high level에서 설명해보자.
residual block을 수식으로 설명하면 다음과 같다.
이 때 잔차 학습에서는 H(x)를 직접 학습하는 대신, F(x) = H(x) - x 를 학습한다. 즉, 작은 숫자만 추가적으로 학습하면 된다.
그런데, 이게 왜 깊은 레이어에서 효과적일까?
이에 대해 혁펜하임은 다음과 같이 설명한다.
즉, 레이어가 깊을수록 한 레이어를 지날때마다 바뀌는 정도가 적을 것
이다.
만약 3이 들어왔을 때 3.1을 output해야 한다고 하자. 기존의 plain layer에서는 3에서 3.1을 '만들어내야' 했다면, residual learning에서는 3과 3.1의 차이인 0.1만 만들어내면 되는 것이다. 왜냐하면 어차피 나중에 만들어낸 0.1에 x인 3을 더할 것이기 때문이다!
그렇다면 0.1 만드는게 왜 쉬울까?
어차피 시작할 때 (=신경망 가중치를 초기화할 때) 0에 가까운 작은 값에서 시작하기 때문이다.
layer가 깊어질수록 각 레이어에서의 변화량은 줄어들게 되기 때문에 잔차만 학습하는 residual block이 효율적인 것이다.
그 결과 plain layer에서는 레이어가 깊어질수록(18-layer에서 34-layer가 되니) 오히려 에러가 커졌으나, ResNet을 활용하니 18-layer보다 34-layer에서 더 에러가 작아졌다. 즉, ResNet을 통해 Network를 더 deep하게 쌓을 수 있는 가능성을 열어준 것이다.
그런데, 만약 더해주어야 하는 x와 F(x)의 차원이 다르면 어떻게 할까?
1x1 convolution을 통해 channel depth를 맞춰주는 과정이 필요하다. 아래 그림에서 F(x)와 x의 차원이 같은 경우는 Simple Shortcut이고, 차원이 달라 맞추어줘야 하는 경우가 오른쪽의 Projected Shortcut이다. 그런데 주로 Simple Shortcut 방식으로 사용한다.
Batch Normalization
Residual block에는 batch norm을 수행하는 block이 있다. 기본적인 것은 3x3 convolution layer 다음에 오는 것인데, 그 순서에 대해서는 논란이 많다. 즉, 그 순서는 Interchangeable하다는 것이다.
Bottleneck Architecture
이는 GoogLeNet의 Inception Block과 같은 개념으로, 3x3 convolution layer 전에 1x1 convolution layer를 통해 channel을 줄이고, 3x3 conv 후에 다시 1x1 layer를 통해 원하는 channel수로 다시 맞추는 과정이다. 이를 통해 전체 차원은 유지하며 동시에 필요로하는 전체 파라미터 수는 줄인다는 효과가 있다.
오른쪽이 bottleneck architecture이다.
이를 통해 우리가 배운 모델을 한번에 살펴보면 전반적으로 파라미터 수는 줄어들고 성능은 높아지는 것을 볼 수 있다.
기본 개념은 다음과 같다. ResNet에서 두 값을 더하다보면 두 값이 섞이게 된다. 그러니 그렇게 하지 말고 그냥 두 값을 concat하자는 것이다.
그런데, 모두 알겠다시피 이렇게 concat하다보면 channel이 계속 엄청 커진다는 문제가 있다. 그것도 2의 지수배로 커진다. 2개, 4개, 8개, 16개, ... 이런식으로 말이다.
이렇게 채널이 커지면 필요로하는 파라미터 수도 매우 커진다. 따라서 중간중간 한번씩 channel을 1x1 convolution layer를 통해 줄여주는 과정이 필요하다. 이를 Transition block
이라고 한다.