
Principal Model
AlexNet
Krizhevsky et al. 2012: 최초의 large scale CNN으로 imageNet 분류 관련 작업을 잘 수행한 모델로 최초로 ReLU를 사용한 것이 특징이다ReLU
기본적인 구조
conv-pool-normalizaiton layer 구조의 반복으로 이루어져있다
- Con1→ Max Pool1→ Norm1 → Conv2→ Max Pool2→ Norm2→ Conv3→ Conv4→ Conv5→ Max Pool3→ FC6→ FC7→ FC8
Lenet과 비슷하지만 layer의 개수와 FC layer의 개수가 더 많아진게 특징- 여기서
Normalization layer은 자주 사용되지는 않으며 여기서 사용된 방법은 현재 자주 사용되는 방법과 거리가 있으며 실제 효과도 적다고한다
227X227X3짜리 image가 input으로 들어왔을 때 Alexnet의 동작과정
- (Conv1) stride가 4인 11X11 filter을 96개 붙이면 output volume size는? A: 55X55X96 (227-11)/4+1=55 ➡️ filter 하나당 depth하나가 쌓이기 때문에 96이 되는 것이고 3은 색깔이라고 생각한다면 이는 sliding할 때 고려할 사항이 아님
2.(Conv1)이 layer의 총 pararmeter의 개수는? A: 11X11X3X96 ➡️
3: 각각의 filter은 local region을 가지므로 depth도 그대로 가진다. (sliding에 결과에는 들어가지 않지만 filter내에서 input가 계산되는 과정에서 똑같은 depth를 가지고 있어야함. filter을 표현할 때 depth를 생략하는 경우가 있지만 실제로는 존재한다!)3.(Pool1) stride가 2인 3X3 filter을 사용했을 때 output volume size는? A: 27X27X96 (55-3)/2+1=27 ➡️ input 자체가 96의 depth로 이루어져 있는데 max pooling은 depth에는 아무런 변화가 없어야한다
4.(Pool1) 이 layer의 parameter의 개수는? A: 0 layer의 parameter(weight)가 필요없고(학습시킬 parameter가 존재하지 않는다) 단지 값을 비교하여 max값만 뽑아내면 된다
특징
data augmentation을 많이 이용함(변형된 데이터들도 새로운 input으로 넣어regularization효과를 얻음)SGD + Momentum을 사용하여 최적화 진행- CNN들을ensemble 를 통해 성능의 향상을 이끌어냄
- 정확도가 정체되었을 때
learning rate를 1/10씩 낮추어 학습을 진행 - 이 당시 GPU의 메모리로 인해 Conv layer을 표혈할 때 2개로 나누어서 표현했다. 실제로
Conv1은 55X55X48 짜리 feature map이 2개가 존재한다(GPU 용량 3GB로 전체 네트워크를 한꺼번에 처리할 수 없었음)- Con1,Conv2,Conv4,Conv5는 같은 GPU끼리만 연결되어 있어 전체 96개 feature map을 통해 학습한 것이 아니다
- Conv3, FC6,7,8는 앞선 layer와 완전히 연결되어있어 GPU 사이에 정보 전달을 통해 전체 feature map을 통해 학습했다
- 2012년에 최초로 CNN의 기초위에 만들어진 이 모델은 기존의 그 이전의 모델과 차이가 매우 많이 났으며(25.8→16.4) 이모델의 기초위에
transferring learning을 이용해 다른 작업을 수행하는 경우가 많아졌다
ZFNet
AlexNet의 기본적인 구조는 똑같이 한채로 hyperparameter들을 향상 시켜 성능을 높인 모델이다
- Conv1의 sliding과 관련된 parameter들을 바꿈(11X11 stride 4 → 7X7 stride 2)
- Conv3,4,5의 filter 개수등을 바꿈(384,384,256 → 512,1024,512)

VGGNet
small filter & deeper network : 더 효율적으로 filter을 만들고 더 깊은 network를 만들어 AlexNet보다 성능을 향상시키게 된 것이 큰 특징이다. 이를 통해 처음으로 CNN을 사용한 Alexnet 이후 또 한차례 새로운 혁신을 가져오게 됐다.
간단히 차이를 보게 되면 layer가 8개에서 16/19로 늘어나면서 더 깊어졌고 filter의 size를 작게하는 대신에 depth를 늘려 성능을 향상시켰고 가장 큰 차이점은 small filter (3X3 Conv with stride1, 2X2 Max Poll stride 2)로 가능한 가장 작은 크기를 사용하여 성능을 향상시켰다
그럼 왜 작은 filter을 사용했을까?
layer을 거치면서 더 깊은 layer은 작은 부분에 기존의 넓은 영역의 값들이 모두 들어가 있는 효과를 얻는다. ➡️ ex) 3X3 Conv filter 3개를 이어붙이게 되는 경우(stack)에 첫번째 layer은 3X3부분을 보지만, 두번째 layer은 5x5, 세번째 layer은 처음의 7x7부분을 볼 수 있어 하나의 1X1 filter와 같은 효과를 얻을 수 있다
더 적은 parameter을 사용하게 되어 더 효율적인
receptive field를 만들 수 있다! ➡️ ex) 위와 같은 비교에서 3X3 layer 3개를 stack하는 경우 3X(3X3XC), 7X7 layer 하나는 1X(7X7XC)이 되어 27 vs 49으로 1)에서 보았듯 같은 성능을 만들어내지만 오히려 더 적은 parameter로 구현해낼 수 있다는 것이다. 이때 C는 input의 depth라고 생각하면 됨filter가 여러개 되면서 non-linearity한 특성을 더 구별해낼 수 있음
depth를 늘려 deep하게 만드는 것이 크게 부작용이 없음
- 전체적으로 보자면 filter의 width와 height가 작아지기 떄문에 depth를 늘려도 부담이 없음
- 네트워크가 깊어질 수록 layer의 filter 개수를 늘리는 경향이 있음(filter을 크게 잡는 것보다!)
기본적인 구조
- Conv-Conv-Pool layer가 반복적으로 나온 후 마지막에 FC layer 후 Softmax로 결과를 만듦
- Normalization layer을 안씀!
특징
- ensemble 을 이용해 성능을 높임
FC7 layer에 feature들이 일반화가 매우 잘되어 있어 다른 작업을 하는데에 활용을 많이 한다- 대부분의 memory는 처음의 Conv layer에 몰려있으며 forward pass에서 하나의 이미지당 약 100MB가 필요해 메모리를 많이 사용한다는 문제를 갖고 있다.(⭐️backward pass에서 chain rule을 통해 update하기 위해서는 정보의 저장이 필수적이다!)
- Pooling을 거치면서 memory를 줄이지 못했기 때문에 첫 두 conv layer가 전체의 25%를 담당하며 이후에는 1/2배로 줄어드는 것을 볼 수 있음
- 만약 총 메모리가 5GB라면 50개의 이미지만 저장이 가능하다는 문제점이 존재한다.
- 대부분의 parameter은 마지막에 나오는 FC layer에 몰려있음
- 마지막 Full connected 과정에서 모든 값들끼리
dense connection하기 때문에 학습시킬 parameter의 개수가 많다. ➡️ 후에 이 문제를 해결하는 network가 등장! - 약 90%가 넘는 parameter가 FC layer에 몰림
- 마지막 Full connected 과정에서 모든 값들끼리
- 더 깊은 layer일 수록 더 많은 filter을 사용하는 경향이 있음 ➡️ downsampling되면서 공간적 정보를 잃지 않기 위함과 동시에 depth가 늘어난다고 해서 parameter의 개수가 크게 증가하지 않기 때문!

GoogLeNet
Deeper Networks with computational efficiency: Inception module과 FC layer의 삭제를 통해 parameter의 개수를 매우 효과적으로 줄임으로써 기존의 Alexnet의 문제점을 어느정도 해결했다. 간단히 살펴보자면 GoogLeNet에서 layer가 22개로 더 늘어났고 AlexNet에 비해 parameter가 12배가 줄게 되었다.(500만 VS 1억 3000만)
Inception module?
local network topology로 network안에 작은 network가 있다고 생각을 하면 되며 이런 module(작은 network)들을 stack하여 하나로 모으는 방식이다.inception_module 이때 병렬적으로 모으기만 하면 문제가 생기는데 이를 극복한 아이디어가 바로 bottleneck으로 연산의 횟수를 줄인다.
기존 방식: input을 병렬적으로 여러 layer을 배치하여 서로 다른 filter을 사용한 뒤 모음(깊이 방향으로 연결함)➡️ zero padding을 이용하여 공간적 차원의 크기가 같도록 만들어준다. (depth 제외)
🤬 문제점
- Pooling layer은 최소한 feature depth를 유지하기 때문에 다른 layer의 결과와 깊이 방향으로 연결할 경우 output의 크기는 무조건 커질 수 밖에 없다(depth가 커지기 때문에!)
- 전체 연산량 역시 매우 커지게 되어 문제가 생긴다(output sizeX각 픽셀마다 내적 연산을 진행)sliding하면서 receptive field만큼 내적을 하기 때문에 전체적인 연산의 크기가 커져 이를 해결할 방법이 필요하게 된다.

🤩 해결책:bottleneck 방법 이용하여 output size와 계산량을 줄인다!
- output size는 1X1 convolution을 이용하여 filter의 개수를 조절함으로써 depth를 줄이는 것이 가능해진다. 이때 ⭐️non-linearity 함수를 지나면서 학습이 진행되고 각 filter마다 weight가 존재하기 때문에 depth를 줄일 수 있을 뿐 아니라 학습에 도움이 된다
- input을 linear transformation하여 저차원으로 projection한 것이라고 생각하면 되며 1X1 Conv를 중갅중간에 배치하여 저차원으로 만듦으로써 연산비용을 줄일 수 있게 만든다
🤩 Inception module with dimension reduction: 실제 inception module에서의 사용 효과 - 저차원으로 되면서 data가 일부는 손실될 수 있지만 projection을 통해 효율적인 작업을 가능하게 만듦
- 원래 있던 layer의 input으로 들어가는 dimension을 줄여
naive inception module에 비해 연산 횟수를 줄임! - pooling layer의 경우는 그 자체로 똑같은 size를 output으로 가지기 때문에 pooling layer 이후에 1X1 conv layer 배치해도 됨
기본적인 구조
- stem network
- 시작 부분으로, 앞서봤던
vanila architecture로 Conv-Pooling과 같은 6개의 layer들이 모여있음
- 시작 부분으로, 앞서봤던
- Stacked Inception Module
- 위에서 봤던 inception module을 모아놓은 부분
- Classifier Output
- 계산이 복잡한 FC layer을 없애 parameter의 개수를 획기적으로 줄임(
average pooling: 각 채널-depth-당 하나의 평균값을 구해 각 채널별에 대해 클래스별 예측 점수를 얻을 수 있다.)과 동시에 성능에 안좋은 영향을 주지 않는다
- 계산이 복잡한 FC layer을 없애 parameter의 개수를 획기적으로 줄임(
Auxiliary classificaiton: 얕은 layer에 추가적인 gradient 계산기를 추가- 깊은 layer을 가지고 있기 때문에 1) backpropagation 과정에서 gradient가 소실되는 문제점과 2) 초기 단계에서 유용한 특징을 학습하지 못할 수 있는 문제점을 해결한다
- 각 계산기마다 gradient를 계산해두고 있다가(loss 계산) 맨 마지막 부근에 도달후 backpropagation때 main 분류기에서 나온 loss에
auxiliary classifer에서 나온 loss를 가중치 만큼 곱하여 더해최종 loss가 정해지고 이를 통해 하습하게 된다.
특징
inception module의 사용- FC layer이 존재하지 않음
- 오직 500만개의 parameter만 존재함
ResNet
ResNetresidualoptimization He et al., 2015 논문 ➡️⭐️ResNet ⭐️
very deep network with using residual connections “Revolution of depth”라고 불리며 152 layer을 사용하여 기존 모델보다 훨씬 깊은 모델인 것이 특징이다
🤬기존의 문제점: 일반적인 layer을 계속 쌓아올려 더 깊은 model을 만들었을 때의 성능이 높아지지 않는다.
- Test error: deep layer 모델의 정확도가 더 낮은데 이는 과적합의 가능성이 존재한다
- Training error: deep layer 모델의 정확도가 여전히 더 낮은데 이는 과적합 이외에 다른 문제가 있음을 시사한다
- optimization problem: deep layer 모델일수록 최적화(optimization)하는데 어려움을 겪는다Cs231n 7-1. Optimization

🤩해결책
➡️shallower model에서 layer을 가져오되 identity mapping을 통해 layer을 추가하는 방법으로 이렇게 하면 어찌되었든 shallow layer보다는 성능이 좋게 만들지 않을까?라는 가정이다. 즉 residual mapping을 통해 기존의 input에서 차이만을 학습하는 방식으로, 만약 학습을 더 이상할 것이 없다면 input의 값이 그대로 output이 된다.
Residual Mapping
-
Plain layer: 모든 layer에서 input의 모든 값들을 학습하여 최적화를 진행하는데, 이럴 경우 weight의 gradient 값들이 0에 가까워지면서 소멸될 가능성이 높아져 최적화가 어려워진다. 즉, ⭐️기존의 input 자체를 최적화하는 방법은 layer이 깊어지게 되면 학습이 어려워진다. -
Residual layer: 오직 residual 값(변화량)만 학습을 진행하고 원래의 input은 그대로 가져가서 depth 방향으로 그대로 합쳐진다. 기존의 값에 얼마를 더하거나 뺄지를 계산하는 것으로 이미 input 값 자체가 정확도가 있다고 생각하고 변화될 부분만 계산하는 방식이다. 즉, ⭐️기존의 input 값 자체를 최적화하는 것이 아니라 기존의 부분에서 바꿔야할 부분만을 학습하여 효율적으로 최적화가 가능하도록 만든 방법이다- input 전체를 학습시키지 않고 변화량 부분만 학습시켜 계산량을 줄임
- W값들이 0에 가깝더라도 gradient가 사라져 학습이 불가능한 것이 아니라 input 값이 나오게 됨
- 학습이 더 쉬워짐!: input이 매우 정확할 때는 학습할 필요없이 가중치를 0이 되어 identity mapping이 됨

못해도 input이 기존과 같거나 최소한 학습을 한다는 것을 보여주는 수식으로ReLU 함수를 지나가서 운좋게 학습이 되면 성능이 향상되게 된다. 이는 ReLU(activation function)이 반응했다는 뜻은 맞다고 변경해야할 부분이 있다는 뜻이고 이는 최소한 학습이 된 것임을 알 수 있기 때문이다!

전체적인 구조 및 특징
- 앞쪽에 추가적인 Conv layer와 pooling layer을 설치한다.
- 중간에 위치한 대부분의 layer은 위에서 언급한 residual block이 존재하며 이때 이 block에는 3X3 Conv layer 2개가 배치되어 있다.
- 마지막에는GoogLeNet 과 같이 분류 점수를 내기 위한 FC만을 남기고, 공간적으로 일정 간격의 위치마다 평균을 내서 결과를 얻는 방법인
global aveage pooling을 이용하여 output을 냄 - ⭐️ layer가 34,50,101,152인 모델들이 있는 layer가 50개를 넘어가는 모델에 대해서bottleneck 방법을 사용하며
GoogLeNet에서 output size와 operation를 줄이기 위해 1X1 Conv를 추가했다 싶이 여기서는 input size를 줄여 operation의 cost를 줄인 후 다음 layer로 가기전에 다시 크기를 원상복귀 시키는 방법을 사용한다!(input과 residual의 차원이 같아야 함)
특징
SGD+Momentum이용- Conv layer이 끝날 떄마다batch_normalization 진행하여 값을 특정 범위 안으로 만듦
- Xavier /2 (He initalizaiton)을 사용함
- 256개의 mini batch를 사용하지만 dropout은 사용하지 않음
Comparing complexity

AlexNet: less expensive하지만 정확도가 낮음(일단 정확도는 높아야지 그다음에 다른 걸 생각할 수 있음)VGG: 정확도가 올라갔지만 연산 비용이 비싸며 memory를 많이 사용함GoogLeNet: VGG의 높은 memory사용과 높은 계산 비용을 FC의 제거와 inception module (bottleneck) 방법을 통해 해결하며 비슷한 정확도에 획기적으로 적은 메모리 사용량을 얻어냄- ResNet: 매우 많은 layer을
residual mapping통해 높은 정확도를 얻어냄(with inception module)
Other study
역사적으로 중요하거나 이 강의 기준으로 최신의 기법들을 소개한다!
NiN(Network in Network)
기존의 sliding 방식보다는 더 복잡한 방식으로 sliding 하면서 학습을 진행하며 네트워크 안에 네트워크라고 보면 된다. 기본적인 아이디어는Multi-Layer Perceoption으로 Conv안에 FC layer(다르게 해석하자면 1X1 Conv layer)을 넣은 것이라고 볼 수 있다.
GoogLeNet과 ResNet의 bottleneck 개념에 선구자인 논문이라고 볼 수 있으며 GoogLeNet에 영감을 주었다는 점(네트워크 안에 네트워크)에서 한번쯤 확인해볼만한 모델이다

Improving ResNets
Identity Mappings in Deep Residual Networks (He et al. 2016)
Resnet의 block 디자인을 바꾼 것으로 direct path를 늘려 정보들이 더 앞으로 잘 전달되고 backpropagation도 잘 될 수 있도록 개선하여 성능을 높인 방법이다.(지름길의 길이를 늘림)

Wide Residual Networks (Zagoruyko et al. 2016)
깊이는 그렇게 중요하지 않으며 ResNet에서 중요한 것은 모델의 depth가 아니라 residual이라고 주장한다. 굳이 여러번 계산하지 말고 한번 계산할 때 residual을 제대로 계산하자는 논지이며 변화량만 optimization 잘되도록 정확한 값으로 계산하는게 만드는게 목표이다.
residual block을 더 넓게 만듦으로써 residual의 역할을 강조하였고 실제로 50개의 layer로 152개의 layer이 있는 ResNet보다 더 나은 성능을 만들어 냈다. 또한 residual block을 늘림으로써 depth를 늘리는 것보다 병렬적으로 계산하게 만들어 효율적인 연산을 가능하게 만들었다. 네트워크의 depth를 늘리는것은 sequential한 증가이므로 계산이 조금 더 복잡하게 되며 단순한 내적 연산이 아닌 복잡한 연산이기 때문에 효율적이지 못하다

ResNeXt (Xie et al. 2016)
ResNet의 후속작이라고 생각하면 되며 residual block의 width를 multiple parallel pathway(다중 병렬 경로)로 만들어 성능을 향상시켰다. 위의 Wide ResNet과 같이 width를 늘려 연결한다는 점에서 비슷하며, 병렬적으로 묶는다는 점에서 GoogLeNet의inception_module 과 비슷하다고 볼 수 있음 ➡️ inception + residual + wide

Stochastic Depth (Huang et al. 2016)
stochastic_depth CS231n 7-2. Evaluation & Regularization에서는 특정 map만을 dropout 하는 경우가 있는데 여기서는 아예 특정 layer을 dropout한다고 생각하면 된다
ResNet과 같이 network가 깊어질 경우 vanishing gradient 문제가 생기는데 이를 극복하기 위해서 random하게 layer을 선택하여, 그 layer에서는 identity mapping을 하게 만들어 학습을 진행하게 된다.dropout 방법과 유사하다고 볼 수 있다.

Beyond ResNets
FractalNet (Larsson et al. 2017)
중요한 것은 residual이 아니며 실제로 중요한 것은 간단한 네트워크에서 복잡한 네트워크로 복잡한 패턴을 안정적으로 학습할 수 있도록 전환하는 것이라고 본다. 이 모델은 layer을 담는 방식이 fractal 방식이고 각 경로는 서로 다른 깊이를 가지고 중첩되며 이러한 연결을 통해 gradient flow에서 장점을 얻게 된다.
여기서도 dropout처럼 일부 경로만 사용하여 학습을 진행하며 성능이나 효율성, 간편성 면에서 큰 장점을 가지지는 못한다,

Densely CNN (Huang et al. 2017)
한 layer가 그 layer 하위에 있는 모든 layer와 연결이 되어 있어 있으며 FractalNet와 유사하게 shortcut을 이용한 gradient flow에 이득을 얻는다!
- 한 layer의 input이 그 전 layer의 결과가 모두 더해진 값이 된다.
- dense connection을 통해 feature을 잘 전달되고 각 layer이 여러번 사용되기 때문에 사용에 이득 있으며 gradient 소멸 문제도 해결할 수 있다.

Squeeze Net (landola et al.2017)
GoogLeNet이 VGG와 성능면에서는 큰 차이가 없지만 연산적인 측면에서 매우 큰 발전을 이뤘던 것과 같이 이 모델에서도 비슷한 정확도에 연산적인 측면에서 큰 이점을 가지는 방법을 소개한다.
“fire module”의 개념을 도입하였으며 squeeze layer은 1X1 filter들로 구성되어 있고expand layer에는 1X1, 3X3들로 구성되어 있다. 그 결과 AlexNet만큼의 정확도를 보이는데 parameter은 50배 더 적은 모델을 만들었다고 한다
