※ 본 내용은 stanford에서 제공하는 cs231n 강의, 강의자료를 바탕으로 작성하였습니다.
Lecture 9 에서는 다양한 CNN model을 다루고 있다.
2017년 강의이다 보니 최근 model들은 포함되지 않았지만, ResNet 등 최근 model 들의 기반이 되는 model을 살펴볼 수 있다.
- AlexNet
- VGG
- GoogLeNet
- ResNet
에 대해 자세히 다루고 있다.
<AlexNet>
AlexNet은 ImageNet challenge 2012의 winner로, 최초의 CNN 기반 model winner이다.
기본 CNN model의 구조를 정교화 한 모델로, 이후에 다룰 GoogLeNet이나 ResNet에 비해서는 간단한 model이다.
Conv layers와 Pooling layers 적절히 배치하고, 마지막에 FC layers를 추가한 비교적 단순한 구조이다.
그림을 보면 같은 layer라도 depth를 기준으로 2파트로 나눠져있는데, 이는 2개의 GPU를 training에 사용했음을 나타낸다.
그 외에 자세한 사항은 slide의 내용과 같고, ReLU를 처음으로 사용했다는 점이 눈여겨볼만 하다.
2013년의 winner인 ZFNet도 AlexNet의 hyperparameters를 개선한 모델이다.
<VGGNet>
2014년에 ImageNet classification에서 2위를 차지한 모델이다.
1위는 GoogleNet이 차지했지만, 다른 task에 대해서는 VGGNet이 더 좋은 성능을 보이는 경우도 있었다고 한다.
VGGNet도 마찬가지로 기존의 CNN model의 틀을 크게 벗어나지는 않는다.
일반적으로 layer를 deeper하게 하는 방향으로 model들은 발전했고,
VGGNet도 layers를 깊게 쌓는 방식으로 좋은 성능을 달성했다.
16 or 19개의 layers를 갖는다.(AlexNet : 8 layers)
VGG의 핵심은 3 x 3 convolution layers를 연속으로 사용해서 층을 깊게 만들었다는 점이다.
작은 filter를 연속으로 사용하는 것의 장점은 무엇일까?
3x3 conv(stride = 1)를 3개 연속으로 쌓는 경우를 예시로 생각해보자.
해당 경우와 하나의 7x7 conv layer는 effective receptive field가 동일하다.
filter별로 처리하는 영역의 크기가 같다는 의미이다.
역으로 7x7크기의 이미지가 하나의 7x7 filter를 거치는 경우와 3개의 3x3 filter(stride = 1)을 연속으로 거치는 경우를 생각해보면 그 출력의 크기가 1x1으로 같다는 것을 알 수 있다.
이때 작은 filter를 연속으로 쌓는 것의 장점은 다음과 같다.
- 같은 영역을 처리하지만 더 많은 non-linearity를 부여할 수 있다.
- 더 적은 수의 parameters가 사용된다. ($ 3*9C^{2} < 49C^{2} $)
추가로 VGGNet의 memory와 parameters는 위와 같다.
Model을 비교할 때, 성능 뿐만 아니라 두 요소 또한 고려할 요소이다.
<GoogLeNet>
2014년에 ImageNet classification에서 1위를 차지한 모델이다.
일반적인 CNN 모델과는 다른 특이한 구조를 갖는다.
Inception module을 도입했다.
Inception module을 사용하고, FC layers를 제거함으로써 parameters의 수를 줄였다.
Inception module
Inception module의 기본적인 아이디어는 network의 연결을 발전시켜보자는 것이다.
하나의 layer안에서도 다양한 filter, pooling을 적용하여 multiple recpetive field sizes를 갖는다.
이때 각 filter를 거친 출력의 output shape(H x W)는 stride를 조정하거나 padding을 이용하여 통일하며,
최종 output은 각 filter의 출력을 depth-wise를 이어붙인 값이 된다.
이때, pooling layer가 포함되기 때문에 output의 출력 depth는 input의 depth보다 커지게 된다.
여러 filter를 적용하고, 계속해서 depth가 커지기 때문에 Naive 방식에서는 계산량이 커지는 문제가 존재한다.
따라서 실제 Inception module에서는 1x1 filter를 적용하여("bottleneck" layers라고 한다) depth를 줄여주는 방식으로 계산량을 줄인다.
최종적인 GoogLeNet의 구조는 다음과 같다.
Conv-Pool 로 이뤄진 stem network를 먼저 거친 후, 여러개의 Inception modules가 stack된 구조이다.
Auxiliary classification
GoogLeNet에서는 가장 끝 layer에만 classification layers가 추가되는 것이 아니라, 중간 layers의 출력을 이용해서도 classication을 수행하도록 되어있다.
이렇게 함으로써, 층이 깊음에도 불구하고 앞에 있는 layers도 backprop을 통해 학습이 잘 이뤄질 수 있다.
(역전파가 3번 수행되는 것은 아니고, loss 자체가 3개의 classification 결과를 모두 이용하는 것)
<ResNet>
ImageNet classifcation에서 2015년에 winner를 차지한 ResNet이다.
매우 좋은 성능으로 사람의 인지능력을 넘어섰다고 한다.
ResNet의 가장 큰 특징은 층이 매우 깊다는 것이다.
무려 152개의 층을 쌓아서, 14년의 우승자인 GoogLeNet이나 VGG가 22, 19개의 층을 쌓았던 점을 생각하면 엄청난 발전이다.
이렇게 깊게 층을 쌓을 수 있었던 것은 'residual connections'를 사용한 덕분이다.
한 층의 출력이 다음층으로 뿐만 아니라, 이후의 다른 layer로도 전달이 된다.
Residual connection은 다음과 같은 아이디어를 기반으로 적용되었다.
먼저 기존에는 층을 너무 깊게 쌓으면 학습이 잘이뤄지지 않는 문제가 있었다.
Parameters의 수가 많기 때문에 overfitting 문제를 예상할 수 있겠지만, 학습 자체도 제대로 이뤄지지 않아 training error 자체도 낮아지지 않는다.
기본적으로, 층을 더 쌓으면 최소한 추가하기 전보다 같은 성능을 낼 수 있어야한다.
위 그림에서 H(x)가 prediction을 위한 최상의 output이라고 가정을 하자.
기존의 방식에서는 H(x)를 잘 출력하기 위해 학습한다면,
residual block에서는 input featues와 H(x) 간의 차이, residual을 잘 찾기위해 학습한다(위 그림에서 F(x)가 잔차이다).
즉, input으로 들어온 값에 어떠한 값을 추가해줘야 최적의 성능을 낼 수 있을지를 학습한다.
최소한 잔차가 0이라고 취급하면 input 값이 그대로 전달될 수 있음으로, 층을 더 쌓더라도 최소한 성능이 나빠지지는 않는다는 아이디어이다.
※ 강의에서는 H(x) 자체가 아니라 residual을 학습하는 이유에 대해서 위와 같이 직관적으로 설명하고 있다.
그 외에도 Residual connection을 통해 gradient vaninshing 문제가 해소되는 것이 층을 깊게 쌓을 수 있는 주요한 이유로 알고 있다.
(1/25 논문 확인 후 수정 : Gradient vanishing/explosion 문제는 batch normalization등으로 해소가 가능하지만, 학습은 되더라도 더 적은 수의 layers보다 성능이 안좋아지는 'degradation'이 문제였고, 해당 문제를 해결한 방법이 residual learning이 맞다.)
최종적으로 사용된 ResNet 모델의 구조는 위와 같다.
VGG에서 처럼 3x3 filter를 연속으로 적용하지만 매우 깊게 설계할 수 있었다.
또 층이 깊으므로 계산의 효율성을 위해 GoogLeNet과 같이 1x1 conv layers를 이용한다.
그 외에 batch noramlization을 적용하는 등의 자세한 사항은 생략되어 있다.
<모델 비교>
매년 정확도는 좋아지면서 layers는 깊어지는 양상을 확인할 수 있다.
정확도 뿐만 아니라 연산의 수나 parameters의 수, 메모리 용량 등도 성능을 평가할 때 고려해야할 요소이다.
각 모델을 비교한 결과는 위와 같다.
'Computer Vision > cs231n' 카테고리의 다른 글
[Assignment 2] Batch Normalization, 역전파 (0) | 2022.01.20 |
---|---|
[Lec 10] Recurrent Neural Networks, RNN (0) | 2022.01.19 |
[Lec 8] Deep Learning Software (0) | 2022.01.16 |
[Lec 7] Training Neural Networks, Part2 (0) | 2022.01.15 |
[Lec6] Training Neural Networks, Part 1 (0) | 2022.01.10 |