본문 바로가기

Data Science/ML & DL

주요 CNN 모델 | VGGNet , ResNet , Mobilenet

ImageNet Dataset

- 페이페이 리 교수가 이끄는 Stanford Vision Lab에서
- 웹상에서 수집한 약 1500만장의 라벨링된 고해상도 이미지로 약 22,000개 카테고리로 구성된 대규모 Image 데이터셋.

 

ILSVRC(ImageNet Large Scale Visual Recognition Challenge) 대회

- 2010년 부터 2017년 까지 진행된 컴퓨터 비전 경진대회.
 
- ImageNet의 이미지중 1000개 카테고리 약 120만장의 학습용이미지, 5만장의 검증 이미지, 15만장의 테스트 이미지를 이용해 대회를 진행한다.
-  2012년 CNN기반 딥러닝 알고리즘인 AlexNet이 2위와 큰 차이로 우승하며 이후 딥러닝 알고리즘이 대세가 되었다.
 
특히 2015년 우승한 ResNet은 0.036의 에러율을 보이며 우승했는데 이는 사람이 에러율이라 알려진 0.05 보다 높은 정확도였다.
 
- ILSVRC에서 우승하거나 좋은 성적을 올린 모델들이 컴퓨터 비전분야 발전에 큰 역할을 해왔으며 이후 다양한 Computer Vision 분야의 네트워크 모델의 백본(backbone)으로 사용되고 있다.

 

주요 CNN 모델

- CNN 기반의 주요 모델들과 그 모델에 쓰인 주요 기법들을 알아본다.

    - VGGNet
    - ResNet
    - Mobilenet

 

VGGNet(VGG16)

 모든 layer들에 3X3 filter, stride =1 , same padding의 Convolution Layer와 2x2, stride=2의 Max pooling사용 -> 단순한 구조로 레이어를 많이 쌓아 성능을 높임. 3X3 필터를 2개 쌓는 것이 적은 파라미터로 더 좋은 성능을 보임


 VGG(Visual Geometry Group)

 ImageNet ILSVRC Challenge 2014에서 2등한 모델, 구조가 간결하고 사용이 편리해 1등한 GoogleNet보다 각광받음

- 단순한 구조이지만 좋은 성능->  Computer Vision Network 모델에서 Feature 추출을 위한 Backbone Network으로 많이 사용
 
- 네트워크 깊이가 어떤 영향을 주는 지 연구 하기 위해 설계된 네트워크, 모든 Layer에서 동일한 kernel size(3 x 3)의 필터를 사용했으며 filter(kernel)의 개수를 늘려가며 레이어를 쌓는 방식으로 구성됨.
 
  - 레이어를 기준으로 했을때?  11 layer, 13 layer, 16 layer, 19 layer 의 네트워크를 테스트함. layer를 많이 쌓는 것을 이용함 (많이 쌓을 수록 성능 향상) -> 19 layer의 성능이 16 layer보다 크게 나아지지 않았고 21개 Layer를 쌓은 모델은 성능이 떨어졌다.
-  Filter의 수?  64, 128, 256, 512 두 배씩 키움. 점점 커짐

- 모든 layer들에 3X3 filter, stride =1 , same paddingConvolution Layer 2x2, stride=2 Max pooling사용

- 이전 AlexNet이 5 X 5 필터를 사용했는데 VGG16은 3 X 3 필터의 Layer를 두개 연속으로 연결했다.
        - 3 x 3 필터 두개를 쌓는 것이 5 x 5  하나를 사용하는 보다 더 적은 파라미터를 사용하며 성능이 더 좋았음

- MAX Pooling 이용해서 Feature map사이즈를 줄임

- 단점 : 추론기에 Fully Connected Layer 3개가 붙어 파라미터가 너무 많아짐 (1억 4천만개 파라미터 중 1억 2천만개 - fully connected layer)

 



ResNet (Resdual Networks)

잔차모듈 (Residiual module) : skip connection이라는 layer를 획기적으로 쌓아 모델 성능을 높이는 구조가 사용됨
   : 레이어를 깊게 쌓을 수록 네트워크 성능이 좋아지는데 최적화 문제 발생 가능, 레이어를 쌓는과정에서 Residual block을 이용해 입력받은 값에 조금씩 수정한 값을 더하면서 최적의 y를 찾는 것이 skip connection 이용하면 성능 유지됨

 

- 역사 : 딥러닝과 반대되는 shallow leanrning -> AlexNet은 파라미터가 있는 layer를 8개 사용함-> layer가 19개까지 올라갈 때는 성능이 좋아졌지만 21개부터는 오히려 성능이 좋지 않음 -> 레이어를 쌓는 것은 성능개선을 하지만 그렇지 않을때 존재

- Skip connection(Shortcut connection)기법을 이용해 Layer를 획기적으로 152개로 늘린 CNN모델 -> Skip connection기법은 최근에 거의 모든 모델에 사용됨

 

 

Skin connection의 구조에서 최적화문제 발생

레이어를 깊게 쌓으면 성능이 좋아지는 이유 : 비선형적이 추가되어 더 많은 특성들을 추출-> 네트워크 모델의 성능이 더 좋아짐
최적화 문제 발생 : 레이어를 깊게 쌓으면 weight를 많이 생성해 최적화가 안되어서 train에서도 성능이 나쁨 overfitting(train에서는 성능이 좋음, test에서 나쁜 것)으로 정확도 개선이 어려워지는 건줄 알았는데 Test set + Train set에서도 성능이 나쁜 문제

 

최적화 문제 해결 : Residual block을 이용한다

-   ResNet의 Skip connection은  입력값 X를 레이어를 통과시켜서 나온 Y( Residual block )에 입력값 X를 더해서 합치도록 구성

 

x: input, H(x): output, F(x): layer통과값 - F(X) + X : 입력값에 연산처리를 한 최종값을 더해서 출력한다.

identity mapping (= skip connection = skipconnection)은 입력인 x를 직접 전달하는 연결( 입력값 그대로 출력하는 block :  X 입력 -> return X ) , 이 논리를 사용하면 파라미터 없이 단순이 값을 더하는 구조이므로 연산량에 크게 영향 X
=> 따라서 성능이 떨어지지 않으면서 깊은 Layer를 쌓음

 

- 지금까지는 입력한 값에 연산처리를 한(convolution -> B/N-> Relu) 최종값만 출력했다면 , 여기서는 연산처리한 최종값 + 최초 입력값을 서로 더해서 출력한다.

- 입력받은 값을 바탕으로 최적의 y를 찾아내는 데,  X조금씩 변화를 주면서 찾아나가는 과정이 잔차학습법이다.

 

 

 

Residual block을 통한 성능 향상

- H(x) = F(x) + x 을 x에 대해 미분하면 최소한 1이므로 Gradient Vanishing 문제를 해결함.

    - 전달 된 gradient가 앞쪽(botton) layer에 그대로 전달되어 gradient가 소실되는 문제가 해결된다.
    - x + y 를 y에 대해 미분하면 1
    - Layer를 많이 쌓을 수 있게 되어 복잡한 Input에 대해 더욱 풍부한 특성들을 추출하게 되어 성능이 향상된다.
 

Residual block 구조

- 일반 Convolution layer(backbone)을 먼저 쌓고 Identity(residual) block들을 계속 쌓음 
- 모든 Identity block은 두개의 3x3 conv layer로 구성 
- 일정 레이어 수 별로 filler의 개수를 두배로 증가 시킴 -> stride를 2로 해서 downsampling함 (pooling layer는 identity  block의 시작과 끝에만 적용)


MobileNet

모델 경량화는 적은 연산량을 사용하면서, 모델의 크기도 줄이면서도 납득할 수 있는 성능을 가진 모델을 개발하는 것. Mobilenet 은 Channel Reduction- Distillation & Compression- Depthwise Seperable Convolution을 이용한 (채널 줄이고 , 두 레이어 연결해서 연산량 줄이고, 높은 모델에서 학습한 내용+중요하지않은 파라미터 손절하는 ) 경량 네트워크 모델. Depthwise convolution Layer 에서는  input shape( Df,Df,M) 에 대해서-> (Dk,Dk,1) shape 필터 M개 생성 하고 한개의 Filter는 한개의 Channel에만 Convolution 연산을 한하게만들어 M개의 channel에 대해서 Convolution 연산처리 를 한다 이후 Pointwise Convolution Layer에서는  (1,1,M) shape의 필터를 N개사용한 것을 곱해주는 연산을 한다. 이러면 shape은 똑같은데 연산량을 줄일 수 있음

이전에는 성능을 높이는 것만 신경썼다면, 가벼운 딥러닝 네트워크 = 경량 네트워크를 위한 연구가 활성화

- 경량화의 조건 = 적은 연산량으로 빠르게 추론할수있으되 , 납득할 수 있는 성능을 내야함

1) 적은 연산량(낮은 계산 복잡도)를 통한 빠른 실행
2) 적은 모델 크기
3) 충분히 납득할만한 정확도
4) 저전력사용

 

Small Deep Neural Network위한 방법

- Channel Reduction ( 채널 줄이기 ) 

- Distaillation ( 내리 학습 ) & Compression ( 중요하지 않은 파라미터 손절)

- Deptwise Seperable Convolution (두 레이어 Depthwise convolution &  Pointwise Convolution 연결해서 연산량 줄이기)

- Remove Fully - Connected Layers

- Kernel Reduction ( kernel(filter)크기 줄임 - 연산량과 파라미터 수 줄임)

- Early Spaced Downsampling ( 최적의 downsampling하는 시점을 찾는 것 )

 

| Mobilenet 은 위의 방법중 3가지를 적용해  경량 네트워크 모델
- Channel Reduction
- Distillation & Compression
- Depthwise Seperable Convolution

< Deptwise Seperable Convolution > 

- 두 레이어 Depthwise convolution &  Pointwise Convolution 연결해서 연산량을 줄인다

1) Depthwise convolution Layer : input shape( Df,Df,M) 에 대해서-> (Dk,Dk,1) shape 필터 M개 생성  -> ⭐한개의 Filter는 한개의 Channel에만 Convolution 연산을 한다 : M개의 channel에 대해서 Convolution 연산처리 

 
  • 기존의 convolution layer에서 filter(1 * H *W) 1개가 layer가 된다 
  • 기존의 convolutional 에서는 conv2d( 3 - 채널, 5 - filter 5개, ...) -> 채널 3개인 필터가 5개 생성됨 그러나 DSC에서는  채널이 1개인 필터가 생성이 되는, 측 채널만큼의 필터가 생성되어 레이어를 구성하는 convolution layer임. -> 필터수가 다음 layer의 채널이 됨.


2) ⭐Pointwise Convolution Layer- 사이즈는 유지하면서 channel을 줄임 - 1X1을 가지는 레이어 => (1,1,M) shape의 필터를 N개사용

 

< 표준 Convolution 과 연산량 비교 >

표준Convolution layer는 한번의 연산량이 Dk^2 X M( 필터의 개수) 이며, 하나의 필터는 Dg^2만큼 이동한다 

그러나 DSC는 (Dk,Dk,1) shape 필터 즉, 필터 1개(1X1 shape)가 하나의 채널에 대응하는 연산을 먼저 실행한후 -> 필터의 개수를 곱해주는 연산을 진행하므로 , 한번의 연산량은 Dk^2이며 Dg^2만큼 이동한다 -> Point wise의 연산에서 M을 곱해준다. Dg^2만큼 이동하는 것도 포함해준다.

 

 

 

 


결론 : 필터의 개수(N)이 1024이고 필터 크기(DK)가 3인경우. 즉 (3,3) 필터 1024개를 사용한 경우 연산량이 1/9정도 줄어든다.
result = (1/1024) + (1/3**2)
print(result)

 > 0.1120876736111111