본문 바로가기
Lecture/딥러닝

[딥러닝] CNN Architectures

by junnykim 2023. 5. 18.

  • AlexNet
  • VGG
  • GoogLeNet
  • ResNet

AlexNet

  • 기존으로 non-딥러닝 모델을 능가하는 성능을 보여주었다.
  • 최초로 딥러닝과 conv net을 적용하여 CNN으로 눈에 뛸 만한 성과를 낸 첫 CNN이다.
  • 구조적으로 LeNet-5와 비슷하나 조금 더 많은 layer를 가진다는 차이가 있다.
  • 2개로 분할하여 2개의 GPU에서 학습하였다.(GTX 580 GPU 2개, 각각 3GB의 메모리

 

  • 첫번째 레이어(conv1)의 output size는?
    • filter가 64개이므로 output의 channel도 64개이다.
    • H/W = (227-11+2*2)/4+1 = 56
    • H/W =(W-K+2P)/S+1
  • 첫번째 레이어(conv1)의 memory(KB)는?
    • output의 개수 : 64*56 * 56 = 200,704
      • C*H'*W'
    • 각 요소당 4bytes : 200,704 * 4 / 1024 = 784
    • 1024bytes = 1KB
  • 첫번째 레이어(conv1)의 parameter 수는?
    • 필터 크기(11x11), 채널(depth, 3), 필터개수(64) : 11 * 11 * 3 * 64 = 23,232
      • Weight shape = Cout x Cin x K x K
    • bias(64) : 23,232 + 64 = 23,296
  • 첫번째 레이어(conv1)의 flop(M)은?
    • flop: 1초당 부동소수점 연산 명령을 몇번 수행할 수 있는지, 컴퓨터의 연산속도를 나타내는 단위
      •  (Cout x H’ x W’) * (Cin x K x K)
    • 72,855,552
  • 두번째 레이어(pool1)의 output size는?
    • pooling layer는 입력데이터의 채널수 그대로 출력데이터로 내보내기 때문에 채널수가 변하지 않는다.
    • H/W = floor((H-K)/S+1) = floor((56-3)/2+1) = 27
  • 두번째 레이어(pool1)의 params는?
    • pooling layer는 가중치가 없고, 그저 특정 영역에서 특정 값을 선택만 하면 되기 때문에 학습을 기다리는 파라미터가 없다. 즉 0.
  • 두번째 레이어(pool1)의 flop(M)은?
    • (64*27*27)*(3*3) = 419,904 = 0.4 MFLOP
    • conv와 pool의 차이는 극대하게 차이나는 것을 볼 수 있다.
  • flatten
    • C*H*W = 256*6*6 = 9216
  • conv layer 경우 채널 수는 항상 필터의 수와 같다.
  • output = (W-K+2P)/S+1
  • 도식에서 layer가 2개로 분할되어 진행이 되는데, 이는 당시 GPU의 성능이 좋지 못해(GTX 580, 3GB mem) 두 부분으로 나눠서 각각 GPU를 하나씩 사용해서 학습할 수 있도록 하였기 때문이다. conv1, conv2, conv4, conv5는 동일한 GPU의 feature map과 연결되어 있다. 그러나 conv3, FC6, FC7, FC8은 바로 전 단계의 모든 feature map과 연결(즉 2개로 분할된 각각의 레이어와 모두 communication)하여 진행했다.

 

 
 
ZFNET

  • AlexNet의 하이퍼파라미터를 개선한 모델
  • 구조, 레이어 수는 같지만 stride size, filter수를 조절하여 error rate를 개선
  • CONV1 : 11*11 stride 4 → 7*7 stride 2
  • CONV3,4,5 : 384, 384, 256개의 필터 → 512, 1024, 512개의 필터
  • 16.4% → 11.7%

 


VGG : Deeper Networks, Regular Design

  • VGG모델은 네트워크의 깊이와 모델 성능 영향에 집중한 것이다.
  • 커널 사이즈를 Alexnet과는 다르게 3 x 3으로 고정하였는데, 커널 사이즈가 크면 이미지 사이즈 축소가 급격하게 이루어져 깊은 층 만들기가 어렵고, 파라미터 개수와 연산량이 많이 필요하기 때문이다.
  • 작은 필터를 사용함으로써 더 많은 ReLU함수를 사용할 수 있고(depth를 늘릴 수 있다.) 더 많은 비선형성 확보할 수 있다.

 

 
1. 위의 3x3 커널을 2개 적용한 경우 3x3x2 = 18 개
2. 5x5 커널을 1개 적용한 경우 5x5 = 25 개
 

  • AlexNet에서 11x11, 5x5와 같은 넓은 크기의 커널로 Convolutation연산을 적용하는 것보다 여러 개의 3x3 Convolution 연산을 수행하는 것이 더 뛰어난 Feature를 추출한다.
  • AlexNet 대비 더 많은 채널수와 깊은 Layer 구성한다.
  • 3x3 크기의 커널을 연속해서 Convolution 적용한 뒤에 Max Pooling 적용하여 Convolution Feature map Block을 생성
  • Block 내에는 동일한 커널 크기와 Channel 개수를 적용하여 동일한 크기의 feature map들을 생성
  • 이전 Block 내에 있는 Feature Map의 크기는 2배로 줄어들지만 채널은 2배로 늘어남
  •  


GoogLeNet : Focus on Efficiency

GoogLeNet은 22개의 층으로 이루어져 있다. 파란색 블럭(Conv)의 층수만 세보면 22개의 층다. 겉으로 보기에 다른 모델보다 엄청 복잡해 보인다.

  • 22 Layers를 사용했는데, network가 더 깊어지면서 계산 효율이 증대되었다.
  • Inception module을 여러개 쌓아서 만들었다.
  • No FC layers(파라미터를 줄이기 위해)
  • AlexNet보다 12배 적은 500만개의 파라미터를 가진다

 

Inception Module

  • 다양한 크기의 필터로 convoluntion을 병렬적으로 진행한 후, depth 방향으로 모두 합쳐버리는 개념
  • 다양한 필터를 이용해서 다양한 특징 추출!
  • 동일한 입력을 받는 서로 다른 필터들이 병렬로 존재한다.
  • 각 레이어에서 나온 각각의 출력값들을 depth방향으로 합친다. 그렇게 합치면 하나의 tensor로 출력이 결정되고, 이 하나의 출력을 다음 레이어로 전달하는 것이다.
  • 1x1 bottleneck layer : 채널의 차원수를 줄여줌으로 계산량을 조절할 수 있다.

auziliary classifiers

Average pooling도 있고, fc도 붙는다. 이것을 하는 이유는 네트워크가 깊기 때문이다. 네트워크가 너무 깊어서 gradient를 잃어버릴 수가 있어서 보조 분류기를 통해 추가적인 gradient를 얻을 수 있고, 중간 레이어의 학습을 도울 수 있다.
 


ResNet (Residual Networks)

네트워크가 깊어지면 깊어질수록 위와 같은 문제가 발생할 수 있다. 실제로 ResNet개발자들이 VGGNet에 레이어를 더 깊게 쌓아본 결과로 training, test 2군데 다 56개의 레이어보다 20개의 레이어가 더 error가 낮게 나온 것으로 보아 overfitting은 아니라고 판단하였고, 깊은 모델일수록 기울기 손실 문제나 학습해야하는 파라미터수가 많아 optimization(최적화)하는데 어려움의 문제가 아닐까 하고 가설을 세워보았다. 그러고 나서 개발한 것이 Resdual Learning이다.
 

Residual Networks

H(x)를 직접 학습하는 대신에 H(x)-x를 학습할 수 있도록 만들어주는 것이다.
오른쪽의 skip connection은 가중치가 없으며 입력을 identity mappping으로 그래도 출력단으로 내보낸다. 그러면 실제 레이어는 변화량(delta)만 학습하면 된다.
그래서 최종 출력값은 input x + 변화량(residual)이 된다. 이 방법을 사용하면 학습이 더 쉬워진다. 결론적으로 H(x)의 값을 훈련시키기 어려우니 F(x)+x를 통해 x의 변화량을 측정하는 것이 더 효율적이다라는 이야기이다. 그렇다면 이 아이디어가 아까 위에 나온 아이디어처럼 얕은 모델만큼의 성능은 보장될 수 있다. 만약 그전 얕은 모델 레이어의 가중치를 업로드하고 그 전보다 성능이 안 좋다면 나머지 레이어에 가중치가 0이 되어 얕은 모델의 성능은 나온다는 이야기이다.
 
 

Bottleneck은 기본적으로 연산량을 줄이기 위해 사용한다. GoogLeNet의 Inception구조 처럼 demension을 줄이기 위해 1x1 conv를 통해 channel수를 줄였다가 3x3 conv를 거친 후 다시 1x1 conv를 통해 channel수를 늘려주는 방식이다. 위 그림에서 보다시피 연산량은 줄임으로서 complexity도 낮추었고 추가로 non-linear(ReLU)도 추가로 수행하여 학습에 도움을 주게된다.

댓글