CS231n 9강
이번 강의에서는 CNN Architecture를 사용한 모델들에 대해서 자세히 배웁니다.
AlexNet
AlexNet은 처음으로 large scale로 구성한 CNN모델입니다. Conv Layer 5개, Pooling Layer 3개, ReLU를 사용한 Fc Layer 2개, 최종 출력을 위해 Softmax를 사용한 Fc Layer 1개로 구성되어 있습니다. 많은 data Augmentation을 사용하였고, dropout 사용, SGD Momentum 0.9로 설정, lr - 1e-2으로 사용하였다고 합니다. GPU의 한계로 인하여 GPU 2개를 쓰기위해 절반씩 할당하여 연산을 수행하였습니다.
VGGNet
더 작은 filter, 더 깊은 Network를 사용한 모델입니다. Layer의 수가 16,19개로 이전 모델보다 훨씬 깊어졌습니다. Conv filter로는 Layer를 더 깊게하고, 파라미터 수를 줄여 효율성을 높이기 위해 3x3 filter만을 사용하였습니다. filter의 크기가 작으면 파라미터 수가 줄어드는 이유는 예를 들어 설명하자면, 3x3을 3번 쓴것과 7x7을 1번 사용한 것은 feature map의 size가 같지만, 3x3 필터가 파라미터수가 훨씬 줄어들어 메모리적으로 효율적이라고 합니다.
GoogLeNet
Layer는 22개로 깊어졌지만, inception module로 인해 파라미터의 수가 AlexNet보다 적은 모델입니다.
naive inception module
병렬 처리를 생각한 구조로 filter와 pooling을 병렬로 처리하고, 상위의 filter concatenation에서 한꺼번에 concat을 진행합니다. 여기서 concat은 4개의 filter를 거친 같은 사이즈들의 feature map들을 묶은것을 말하고, Inception module은 3가지 point가 있습니다.
- 각 필터에 stride=1, 3x3, 5x5에 zero-padding을 해주어 size가 같은 feature map들이 나오고, 이것을 concat합니다. 이로 인해 다양한 filter가 사용가능하게 되어 다양한 특성을 파악하는 feature map을 얻을 수 있게 됩니다.
- 1x1 filter를 사용함으로써 depth를 줄일 수 있고, 이는 연산량을 줄이는 역할을 합니다
- 3x3 pooling 연산 수행 시, max pooling을 해주어 이전 stride의 max값이 다음 stride의 필터에도 겹쳐서 사용되어 좋은 값을 여러번 쓸 수 있습니다. 이는 이미지 내에 특징이 강한 픽셀값을 여러번 쓸 수 있다는 것을 의미합니다.
하지만 naive inception module은 최종적으로 concat 후 feature map의 size는 28x28x672인데, 아직 파라미터의 수가 너무 많고, pooling layer의 depth를 줄일 수 없다는 것도 문제점이 존재합니다.
naive inception module의 문제를 해결해 줄 수 있는 것은 1x1 convolution layer이고, 이를 bottleneck layer라고 칭합니다. 파라미터의 수를 줄이기 위해 오른쪽과 같이 먼저 bottleneck layer를 거친 후에 다른 filter를 사용하는 것으로 구조를 수정하였고, pooling layer의 경우에는 pooling layer를 거친 후에 bottleneck layer를 거쳐감으로서 depth의 수를 줄였습니다. 최종적으로 bottleneck layer를 추가한 구조는 28x28x480의 feature map을 얻게 되어 연산량이 감소된 것을 볼 수 있습니다.
추가적으로 파라미터 수를 줄이기 위해 마지막 Fc layer도 제거를 하였습니다. flatten 방식의 경우 7x7x1024x1024 = 51.3M의 가중치가 필요하지만, global average pooling을 사용하면 가중치가 단 한개도 필요하지 않게 됩니다.
ResNet
152개의 layer를 가진 모델입니다. 연구원들은 layer의 깊이가 깊어질수록 기울기 소실 문제가 발생하여 학습을 하는데 어려움을 겪게 되었다고 합니다. 그리하여 기존의 학습 방식을 바꾸어 변화량을 학습하는 Residual block이란것을 추가하여 구조를 설계하였습니다.
Residual block은 기존 출력값인 F(x)에 identitiy mapping으로 input값인 x를 더해주는 역할을 수행하여 최종적으로 변화량을 학습할 수 있게 해줍니다. 이는 만약 변화량이 0이라면 기존 input값인 x가 출력되고, 이는 backward에서 output값인 x값이 있기에 기울기 소실 문제가 발생하지 않게 되어 layer의 깊이가 깊어질 때 발생하는 기울기 소실 문제를 해결하였습니다.
VGG-19를 뼈대로 Conv layer를 추가하여 layer의 깊이를 추가하였습니다. 최종적으로 34, 50, 101, 152개의 layer를 갖는 ResNet이 나오게 되었습니다.
추가적으로 50 layer부터는 파라미터 수의 조절을 위해 bottleneck layer를 추가하였다고 합니다.