728x90
CNN에서 유명한 모델 구조들을 살펴보자..!
주요 모델 위주로만 정리했다. (AlexNet,VGG,GoogLeNet,ResNet)
AlexNet
- 최초의 Large scale CNN
- Norm layer를 사용함 (하지만 더이상 사용하지 않..)
- 이때는 GPU이슈로 모델을 2개로 나눠서 학습시킴 (모델 그림이 반으로 나눠져있는 이유)
- 모델이 2개다 보니 Conv1,2,4,5 레이어는 속한 모델(속한 GPU) 내에 있는 feature map 48개만 접근 가능했음
- output volume size와 파라미터 수 구하는거 여기서 복습하고 가기
Output volume size = ((input N - filter F)/ stride)+1
ex. output of First layer = (227-11)/4 +1 = 55 . 55*55*96
Total Parameter # = (filter F * filter F * channel C)*#of channel
ex. output of First layer = (11*11*3)*96 = 35K
#참고. 풀링 레이어엔 파라미터가 없음!
VGGNet
- 필터의 크기를 작게 만들고 대신 네트워크를 딥하게 만들었음
- 레이어의 수가 16~19개로 기존 알렉스넷 8개 대비 증가함
- 3x3 Conv stride 1, pad 1 & 2x2 MaxPool stride2 만 사용함
- 모델 앙상블을 사용함
- 해당 모델 중에서도 특히 FC7번 feature가 다른 데이터 작업에서도 높은 성능을 보임
- 작은 필터를 사용한 이유
- 작은 필터를 사용하게 되면 필터 안에 있는 파라미터 수가 줄어들어서 큰 필터 대비 레이어를 깊게 쌓을 수 있게 됨
- 예를 들어 3x3 conv 레이어를 3번 쌓으면 7x7 레이어 한번 본것과 동일한 receptive filed를 확인할 수 있음
- 장점 1: 모델 구조가 딥해지면서 비선형성을 더할 수 있음
- 장점 2: 파라미터수가 줄어들음. 3x3xC 필터를 적용할 경우 9개의 파라미터xC차원x출력되는 feature map 개수 C개x3번 쌓음 < 7x7레이어
GoogLeNet
- 자본주의의 힘을 보여주는 구글넷은 deep 한 네트워크와 연산 효율화를 해냈는데 이걸 중간 FC layer를 안쓰고 해냄
- input 이후 처음나오는 Stem Network 에서는 일반적인 NN(Conv-Pool 반복)구조
- 그 이후 Inception Module 을 여러개 쌓음
- 중간에 Auxiliary Classification output이 달려있는데, 여기에서는 backprop시 vanishing gradient를 방지하기 위해 추가적인 gradient를 계산해 중간 레이어를 도와주고자 함
- Output엔 분류를 위해 FC 사용
[Inception Module]
- 구글넷을 구성하고 있는 기본 모듈로, network in network 개념을 적용해서 구성함
- 이전 레이어로부터 받은 input을 병렬 필터에 동일하게 넣고, 각 필터의 결과를 depth 방향으로 합쳐서 하나의 텐서를 출력함
- 다만 초기 인셉션 모델은 연산 효율성이 떨어져서 이를 해결하기 위해 병목 필터를 두었음
- 각 필터 연산 결과의 depth를 말 그대로 쌓는 것이기 때문에 연산이 어려움
- 심지어 풀링레이어는 인풋 레이어의 depth를 그대로 갖고 가기 때문에 막판에 결합되면 아주 난리가남
[BottleNeck]
- 1x1x32 필터를 Conv 레이어(eg. 32x32x56) 에 연산시키게 되면 공간 크기는 그대로 유지시키면서 depth는 줄어들게 됨 (e.g. 32x32x32)
- 이를 적용하여 3개의 Bottleneck 필터를 두어서 depth를 줄이고자 함
ResNet
Residual(잔차)를 이용한 아주 깊은 네트워크 (152개나 됨..)
[Residual Connection]
- 발단 : 레이어를 많이 쌓은 모델이 레이어를 적게 쌓은 모델보다 왜 성능이 안좋지? 과적합이라고 하기엔 Train, Test 에서 모두 낮음
- 가설 : 깊은 모델일수록 최적화가 어려워서 그런게 아닐까? 만약 레이어를 적게 쌓은 모델의 가중치를 깊은 모델 레이어에 일부 넣어주고, 나머지 레이어는 identity mapping(그냥 인풋-아웃풋 그대로 전달해준다는 의미)하면 못해도 레이어를 적게 쌓은 모델에 준하는 성능이 나올거야!
- Residual mapping을 가능하게 하는 레이어를 쌓자!
- 일반적으로는 input X가 H(x)가 되게끔 학습시킴
- Residual block 에서는 input X에 추가되는 변화량을 학습시키고 학습시킨 다음에 기존 x를 identity 매핑하여 이에 더해줌
- 만약 x -> x 로 만들고 싶으면 그냥 F(x)를 0으로 만들면 끝남. W 가중치를 사용하지 않아도 됨
- 이러한 Residual block(2개의 3x3 레이어) 을 쌓고, 주기적으로 필터의 수를 2배로 만들며 stride 2를 사용해 공간적으로 절반으로 만들음
- 또한 이 ResNet을 깊게 만들면서 동일하게 BottleNeck을 구현함 (1x1 필터로 채널을 축소시켜서 연산한 다음 원래 채널만큼의 1x1 필터를 곱해서 원상복구)
- ConvLayer 다음에 매번 BatchNorm을 수행함
- Xavier/2 초기화를 사용함 w/SGD+Momentum
이 외에도 ResNet을 개선시키거나 다른 관점으로 모델을 구축한 경우가 많이 있음 (이 때는 2017 기준이니까, 이 이후에 더 많아지지 않았을까..) 추후 CV 공부하면서 최근 연구들을 더 많이 봐봐야 함
'👩💻LEARN : ML&Data > Lecture' 카테고리의 다른 글
[CS231n] Lecture11. Detection and Segmentation (1) | 2023.05.19 |
---|---|
[CS231n] Lecture10. Recurrent Neural Networks (0) | 2023.05.16 |
[CS231n] Lecture8. Deep Learning SW - Pytorch (1) | 2023.05.16 |
[CS231n] Lecture6. Training Neural Networks 2 (0) | 2023.05.15 |
[CS231n] Lecture6. Training Neural Networks 1 (0) | 2023.05.14 |