LeNet-5
> 산업에 성공적으로 적용된 최초의 ConvNet, 숫자 인식에 주로 사용되었음
AlexNet
> First layer의 output volume은 55 x 55 x 96, Parameters (11 x 11 x 3) x 96 = 35k
> Second layer의 output volume은 27 x 27 x 96, Parameters 0!
(Pooling layer는 Parameters가 없다. – 특정 지역에서 값을 뽑아내는 역할을 하기 때문에)
> 당시 GPU의 메모리가 3GB밖에 되지 않아서 두 개의 GPU를 사용하여 학습을 진행하였다.
ZFNet
> 기존의 AlexNet에서 stride size, 필터 수를 조절하여 성능을 향상시켰다.
VGGNet
> AlexNet과 비교해서 layer수가 많아졌다. 3x3 필터(stride 1, pad 1), 2x2 Max Pool(stride 2) 만 사용한다.
> 작은 필터를 여러 개 잘 사용하면서 Receptive Field을 유지한다면 파라미터의 수를 줄일 수 있다.
- 3x3 filter, 3개 - Receptive Field : 7 x 7, parameters : 3 * (3^2 x C^2)
- 7x7 filter - Receptive Field : 7 x 7, parameters : 7^2 x C^2
- 필터를 더 깊게 쌓아가면서 Non-Linearity를 추가(비선형적 데이터를 잘 처리할 수 있다.)하고 파라미터 수도 적어지게 된다.
GoogLeNet
> VGGNet보다 더 깊은 layer 구조를 가지고 있지만 VGGNet보다 더 적은 parameter를 가지고 있다.
> Inception module : network within a network 개념을 착안하여 만들었다. Network 안에 Local Network를 inception Module이라고 한다.
> 다양한 filter size를 이용하여 병렬적으로 Convolution을 진행 한 후에 출력들을 Depth 방향으로 합친다.
주의!!!) Conv를 진행할 때 zero padding과 stride 정도를 조절하여 입력과 출력의 크기를 동일하게 유지시켜준다.
> layer가 깊어질수록 Depth가 점점 더 깊어진다. 계산량이 많아진다. ( Input Depth: 256, Output Depth : 672)
> 이를 해결하기 위해서 1x1 conv layer를 추가하여 Depth를 조절한다.
> 1x1 conv를 사용하면서 계산량과 depth가 많이 줄어들었다.
> 밑에 두개의 1x1 conv들 Ops를 줄이기 위해서 오른쪽 위의 1x1 conv는 최종 filter의 파라미터의 수를 줄이기 위해서 사용되었다.
> 네트워크가 깊기 때문에 보조분류기(Auxiliary classification)를 중간 layer에 연결해주었다. 이곳에서도 loss를 계산하여 학습에 도움이 되도록 만들어 준다.
ResNet
> Motivation : layer가 깊어질수록 error가 줄지 않았다. Overfitting이 일어날 것이라고 예측하였다. 그러나 56 layer의 Training error, 56 layer의 Test error를 비교해보았을 때 큰 차이를 보이지 않는다. (Overfitting문제가 아니다.)
> 저자들은 더 깊은 모델 학습 시 optimization 문제가 생긴다는 가설을 세웠다. 그러나 큰 layer의 깊이와 optimization이 큰 상관이 없는 것을 파악하였다. 따라서 얕은 모델에서는 성능이 좋게 나올 것이라 생각하였고 Residual block을 design 하였다.
> “H(x)”을 학습하기 보다 “H(x) – x” 를 학습 할 수 있도록 만들어준다. (데이터 전체보다는 잔차를 학습한다.) - X에 얼마의 값을 더하고 빼는지를 배우는 것
> 또는 conv layer가 깊어지면 원본 데이터의 특징이 사라지는 경우가 발생하기에. Residual connection을 통해서 원본 데이터의 특징이 사라지는 것을 방지한다.
> Residual blocks은 두 개의 3x3 conv layers로 구성, 마지막 단에 Fully connected layer를 사용하는 것 대신 Global Average Pooling Layer를 사용한다.
> layer를 152개를 쌓았다.
> Depth가 50이상일 때 GoogLeNet과 동일하게 Bottleneck Layers를 도입하여 초기 필터의 depth를 줄여준다. (처음 input의 depth 256을 64, 64 로 줄인 뒤에 다시 256으로 depth를 증가시켰다. 이 과정에서 3x3 conv의 계산량이 줄어들었다.)
> 네트워크 안에 작은 네트워크를 삽입하는 형식, Bottleneck 개념을 가장 먼저 정립함
>기존의 ResNets을 좀 더 향상시켰다. ResNet block path 늘려서 정보들이 더 잘 전달 할 수 있도록 만들었다.
> Residual Connection이 있다면 네트워크가 굳이 더 깊어질 필요가 없다고 생각하였다. Residual block을 더 넓게 만들었다.(conv layer 필터의 depth을 더 깊게)
> filter의 수를 늘린다. 여러 Layers를 병렬로 묶어준다는 점에서 Inception Module과 연관이 있다.
> drop out과 유사하게 train time에 레이어의 일부를 골라서 identity connection으로 만들어 학습, Test time에는 전체 network를 학습한다.