Stanford에서 강의하는 CS231n에 대해서 공부하고 정리한 글입니다.
Slide: cs231n_2017_lecture9.pdf
Case Study
AlexNet

AlexNet의 아키텍처는 다음과 같다.
(conv - pool - normalization) 구조가 두 번 반복되고, conv 3,4,5, pool, fc 6,7,8 로 구성된다.

첫 번째 레이어에서 입력이 227 x 227 x 3 이고, 96개의 11 x 11 filter, stride 4 일 때 출력 사이즈는
55 x 55 x 96 이다.
그렇다면, 첫 번째 레이어에서 파라미터 개수는 어떻게 될까?

첫 번째 레이어(Conv)의 파라미터 개수는 어떻게 될까?
Conv의 파라미터는 필터를 생각해보면 된다.
우리는 11 x 11 x 3 크기의 필터를 96개 갖고 있다.
따라서 파라미터의 개수는 11 x 11 x 3 x 96 = 34,848 개 이다.

그렇다면, 두 번째 레이어인 Pooling 레이어에서의 파라미터 수는 어떻게 될까?
정답은 Pooling 레이어에는 파라미터가 없다.
Pooling 레이어는 특정 영역에서 큰/작은/평균의 값을 뽑아내는 정책이다.
따라서, 학습시킬 파라미터가 없다.

AlexNet의 전체 구조이다.
여기선 간단한 예시만 다루기 때문에, 입력과 출력의 Shape, 하이퍼 파라미터 정도만 살펴보면 좋을 것 같다.

AlexNet은 Image Classification의 2012년도 최초의 CNN 기반 우승 모델이다.
VGGNet

AlexNet 이후에 네트워크가 더 깊어지고, 성능에 향상이 있었던 VGGNet과 GoogLeNet에 대해 알아보자.

먼저, VGGNet은 더 작은 필터를 사용하고, AlexNet보다 깊은 네트워크로 설계되었다.
필터가 작아지면서, 파라미터의 수가 훨씬 적어진다. 따라서 작은 필터를 통해 더 깊은 Depth를 가져갈 수 있었다.


3 x 3 filter를 여러번 쌓으면 7 x 7 filter를 사용하는 것과 실질적으로 동일한 Receptive fled를 가진다.
stride = 1인 3 x 3 filter를 사용하는 Conv layer를 세 번 쌓아보자.
첫 번째 layer의 Receptive Field는 3 x 3 이다. (3 x 3 필터를 사용해, 입력으로부터 3 x 3 영역에 대한 가중합으로 Activation Map을 만들기 때문)
두 번째 layer의 Receptive Field는 5 x 5 이다.
두 번째 layer의 입력은 입력의 3 x 3 Receptive field를 가지는 Activation Map이다.
이 Map에 대해 stride = 1, 3 x 3 filter를 사용하면 Original 입력으로 부터 Receptive field 가 5 x 5가 된다.
세 번째 layer의 Receptive field는 7 x 7 이다.
따라서, 3 x 3 필터를 여러번 쌓는 것은, 7 x 7 필터와 실질적으로 동일한 Receptive field를 가지면서 더 깊은 레이어를 쌓을 수 있게 된다.
그럼, 파라미터 수를 비교해 보자.
3 x 3 필터에는 9개의 파라미터(3 x 3)가 있다.
여기에 Depth(C) 와 Feature Map의 갯수를 곱해주면 파라미터의 수가 나온다. 그리고 레이어가 세 개 이므로 3을 곱해준다.
그럼, 3 x 3 x 3 x C x M = 27CM 의 파라미터를 갖는 것을 알 수 있다.
7 x 7 필터인 경우에는 7 x 7 x C x M = 49CM 이다.
따라서 작은 필터를 여러번 쌓는 것이 더 적은 수의 파라미터를 갖는 것을 알 수 있다.

Forward pass 시 필요한 전체 메모리를 계산해 보자.
입력 224 x 224 x 3 이 1 x 1 x 1000 으로 계산되기 까지 저장되어야 하는 메모리는 약 100 MB 이다. (이미지 한 픽셀당 4 bytes)
대부분의 메모리는 레이어의 앞 부분에, 파라미터는 레이어의 뒷 부분에서 사용되는 것을 알 수 있다.
GoogLeNet

GoogLeNet에 대해서 살펴보자.
GoogLeNet은 2014년도 Image Classification에서 우승한 모델이며 계산량을 효율적으로 수행하도록 설계된 네트워크 이다.
효율적인 계산을 위해 Inception module을 사용하였는데, 이에 대해 알아보자.

Inception Module 에는 동일한 입력을 받는 서로 다른 다양한 필터들이 병렬로 존재한다.
이전 레이어로 부터 입력을 받아 다양한 Conv 연산을 수행하는 것이다.
여기엔 1 x 1 / 3 x 3 / 5 x 5 Conv layer와 Pooling layer가 있다.
각 layer들의 출력을 Depth 방향으로 Concat 하여 Inception Module의 출력으로 전달한다.
하지만, 이 방법에는 계산 비용의 문제가 발생한다.
예를 들어보자.
28 x 28 x 256의 입력이 있고,
Inception Module 내부에는 128 개의 1 x 1 필터, 192개의 3 x 3 필터, 96개의 5 x 5 필터가 있다고 가정해보자. (적절한 padding/stride를 조절하여 입/출력간의 spatial dimension을 유지)
(출력 사이즈/계산량)
1 x 1 Conv의 출력은 28 x 28 x 128 (1 x 1 x 256 x 128 x 28 x 28)
3 x 3 Conv의 출력은 28 x 28 x 192 (3 x 3 x 256 x 192 x 28 x 28)
5 x 5 Conv의 출력은 28 x 28 x 96 (5 x 5 x 256 x 96 x 28 x 28)
Pooling layer의 출력은 28 x 28 x 256 이다.
이를 Depth 방향으로 Concat 하게 되면 최종 출력은 28 x 28 x 672 이다.
Inception Module 내 Conv layer들의 계산량을 더해보면 854M 이다.
이는 너무 많은 계산량을 필요로 하며, Inception Module이 진행됨에 따라 Depth가 너무 커지는 문제가 있다.
GoogLeNet에서는 "bottleneck layer"를 이용하여 이를 해결한다.

"bottleneck layer"를 이해하기 이전에, 먼저 1x1 Convolution을 이해하고 넘어가야 한다.
1x1 Conv는 입력과 출력의 차원을 조절해주는 역할을 한다.
1x1 Conv가 bottleneck layer의 역할로 사용된다.

이제, Inception module내부의 3x3, 5x5 conv, 3x3 pool 레이어에 1x1 conv를 결합한다.
이를 통해 계산량이 854M -> 358M 으로 줄어들고, 출력의 크기도 28 x 28 x 672 -> 28 x 28 x 480 로 줄어들었다.
ResNet

ResNet은 152개의 레이어를 갖는 아주 깊은 네트워크이며,
ImageNet과 COCO classification/detection 대회에서 월등한 성적을 낸 모델이다.
그렇다면, 단순히 CNN 모델에서 레이어의 깊이가 깊어지면 성능이 좋아질까?

정답은 NO 이다.
20-lyer와 56-layer의 CNN 모델이 있다.
Test error를 보면, 20-layer 모델이 56-layer 모델보다 성능이 좋다.
그런데 Training error를 살펴 보면, 56-layer 는 엄청 깊은 네트워크가 있기 때문에 train data에 Overfit하겠구나 라는 예상을 깨고 56-layer의 training error가 더 높은 것을 알 수 있다.
이는 layer가 깊어짐에도 test data의 성능이 낮은 이유가 over-fitting이 아니라는 것을 알 수 있다.
ResNet 저자들은 이를 Deeper Network를 학습할 때 생기는 Optimization 문제라고 말한다.
모델이 깊어질 수록 최적화가 어렵다는 가설이다.

ResNet 저자들은 Direct mapping 대신에 Residual mapping 하는 방법으로 아키텍처를 디자인했다.
"Plain" layers는 우리가 일반적으로 생각해볼 수 있는 모델 아키텍처이다.
우측의 Residual block은 모델이 H(x)를 학습하기 보다는 H(x) - x를 학습할 수 있도록 만들어 준다.
Residual block의 최종 출력값은 input(X) + Residual 이다.
따라서, 모델은 변화량(Residual)에 대해서만 학습을 하면 되고, 학습이 더 쉬워진다.
(이는 ResNet 저자들의 가설이다.)

ResNet 모델의 Depth는 34, 50, 100 ,152까지 늘어난다.
여기서, Depth가 50 이상인 경우는 GoogLeNet에서 사용한 방법과 유사한 방식으로 Bottleneck Layers를 도입한다.

예를 들면, 입력이 28 x 28 x 256일 때, 1 x 1 Conv를 적용하여 Depth를 조절한다.
28 x 28 x 64로 그 크기를 조절한 뒤 3 x 3 Conv를 취해 계산량을 줄이고, 다시 1 x 1 Conv를 추가하여 원래의 Depth로 늘린다.

ResNet의 top-5 error는 3.6% 였고, 이 수치는 ImageNet paper에서 제시한 인간의 성능 보다 뛰어난 수치였다.
'Stanford CS231n' 카테고리의 다른 글
| Weight Initialization (0) | 2024.11.11 |
|---|---|
| Lecture 10: Recurrent Neural Networks (2) | 2024.11.11 |
| Lecture 7: Training Neural Networks 2 (1) | 2024.11.08 |
| Lecture 6: Training Neural Networks 1 (2) | 2024.11.08 |
| Lecture 5: Image Classification with CNNS (0) | 2024.11.05 |