논문 리뷰, 구현

8. SqueezeNet 논문 리뷰, 구현

jwjwvison 2022. 7. 3. 20:08

이번 포스팅에서는 SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size 논문에 나와있는 SqueezeNet에 대해서 리뷰해 보겠다.

 

Abstract

 최근 CNN의 연구는 주로 정확도를 향상시키는 것에 초점을 두었다. 특정 정확도 레벨의 경우 일반적으로 해당 정확도 레벨을 달성하는 여러 CNN 아키텍쳐를 식별할 수 있다. 동등한 정확도를 낸다는 가정하에서 작은 CNN 구조는 적어도 3가지의 이점을 가지고 있다.

 (1) 소형 CNN은 분산 training중에 서버 간 통신이 더 적게 필요하다.

 (2) 소형 CNN은 클라우드에서 자율 자동차로 새 모델을 내보내는 데 필요한 대역폭이 적다.

 (3) 소형 CNN은 FPGA 및 메모리가 제한된 기타 하드웨어에 더 쉽게 배치할 수 있다.

 

 이 논문의 저자들은 이러한 이점을 제공하기 위해 SqueezeNet이라고 불리는 소형 CNN 구조를 만들었다. SqueezeNet은 AlexNet 수준의 정확도를 무려 50배의 적은 파라미터로 달성했다. 추가적으로, 모델 압축 기술로 이들은 squeezenet 구조를 0.5MB보다 적게 압축할 수 있었는데 이는 AlexNet 보다 510배 작은 구조이다.

AlexNet 구조

 이처럼 소규모의 CNN은 몇몇 이점을 가지고 있다. 이를 염두에 두고, 이들은 잘 알려진 모델에 비해 파라미터는 적지만 정확도를 동등한 CNN 구조를 식별하는 문제에 직접 초점을 맞추었다.

 

Related Work

1. Model Compression

 이 논문 연구에서 매우 중요한 목표는 정확도를 보존하면서 매우 적은 파라미터를 갖는 모델을 찾는 것이다. 이러한 문제를 다루기 위한 실용적인 방법은 이미 존재하는 CNN모델을 가지고 lossy fashion 으로 압축하는 것이다. 꽤나 간단한 접근법은 사전 훈련된 CNN 모델에 SVD를 적용하는 것이다. 이는 사전 훈련된 모델로 시작한 다음, 특정 임계값 미만의 파라미터를 0으로 대체하여 sparse matrix를 형성한 후 마지막으로 sparse CNN에 대해 몇 번의 훈련을 수행한다.

 

2. CNN Microarchitecture

 CNN을 매우 깊이 있게 설계하는 추세로 인해 각 층에 대한 필터 치수를 수동으로 선택하는 것이 번거로워졌다. 이를 해결하기 위해 특정 고정 형태를 가진 여러 컨볼루션 층으로 구성된 다양한 상위 레벨 빌딩 블록(또는 모듈)이 제안되었다. 논문의 저자들은 개별 모듈의 특정 조직과 차원을 지칭하기 위해 CNN microarchitecture라는 용어를 사용한다.

 CNN microarchitecture가 개별 층과 모듈을 지칭하는 반면 이들은 CNN macroarchitecture를 end to end CNN 구조로 여러 모듈의 세스템 레벨 조직으로 정의했다.

 

SqueezeNet: preserving accuracy with few Parameters

 1. Architecture design strategies

 논문의 저자들은 적은 파라미터로 높은 정확도를 나타내기 위해 세가지 전략을 CNN 구조를 디자인할때 사용했다.

 

  1. 3x3 필터를 1x1 필터로 교체하기

 정해진 수의 합성곱 필터 예산이 주어진다면 1x1 필터는 3x3 필터보다 9배 적은 매개변수를 가지므로 이러한 필터의 대부분을 1x1로 만들었다.

 

   2. input 채널의 수를 3x3 필터로 감소시키기

 합성곱층이 3x3 필터로만 구성되어있다고 고려해보자. 파라미터의 총 수는 (input 채널 수) * (필터의 수) * (3*3)이다. 그러므로 CNN에서 적은 파라미터의 수를 유지시키기 위해서는 3x3 필터의 수를 줄일 뿐만 아니라 input 채널의 수를 3x3 필터로 줄여야한다. 이들은 input 채널을 squeeze를 사용하면서 3x3 필터로 줄였다. 이는 다음 섹션에서 설명하겠다.

 

   3, 합성곱 층에 큰 활성화 맵이 있도록 신경망에서 downsample을 늦게 만든다.

 합성곱 신경망에서 각 합성곱층은 최소 1x1의 공간 분해능과 종종 훨씬 큰 1x1 출력 활성화 맵을 생성한다. 이러한 활성화맵의 높이와 너비는 (1) input data의 size (2) CNN 구조에서 다운샘플링할 층 선택에 의해 조절되어진다. 대부분 downsampling은 stride에 의해 발생한다. 만약 선행 층이 큰 stride값을 가진다면 대부분의 층은 작은 활성화 맵을 가질 것이다. 반대로 만약 대부분의 층의 stride가 1이거나 1보다 큰 stride를 갖는 층이 신경망의 말단 쪽으로 집중된다면, 신경망의 많은 층은 큰 활성화 맵을 가질 것이다. 논문 저자들의 직관은 (지연된 다운샘플링에 의한) 큰 활성화 맵이 다른 모든 맵들이 동일하게 유지될 때 더 높은 분류 정확도로 이어질수 있다는 것이다. 이들은 4개의 서로 다른 CNN 구조에 지연된 다운샘플링을 적용했고, 각각의 경우 지연된 다운샘플링은 더 높은 분류 정확도로 이어졌다.

 

 전략 1,2는 정확도를 보존하면서 CNN의 파라미터 수를 줄였다. 전략 3은 제한된 예산의 파라미터 속에서 정확도를 최대화 시켰다.

 

2. The Fire Module

이들은 fire module을 다음과 같이 정의했다. Figure1에 나와있는것 처럼, fire module은 1x1 필터만 가지고 있는 squeeze 합성곱 층과 이를 뒤따르는 1x1,3x3,필터의 혼합으로 구성되어 있는 expand 층으로 구성되어 있다.

 fire module에서 s1x1,e1x1,e3x3의 3가지 조정 가능한 하이퍼 매개변수가 있다. fire module에서 s1x1은 squeeze 층의 필터 수(모두 1x1), e1x1은 expand 층의 1x1 필터 수, e3x3는 확장 층의 3x3 필터수이다. fire module을 사용할 때 s1x1을 (e1x1+e3x3) 미만으로 설정하므로, squeeze 층은 전략 2에 따라 입력 채널의 수를 3x3 필터로 제한하는데 도움이 된다.

<other squeezenet details>

 1. 1x1 필터와 3x3 필터의 출력 활성화가 높이와 폭이 같도록 입력 데이터에 1픽셀 제로패딩을 expand모듈 3x3 필터에 추가한다.

 2. ReLU 함수가 squeeze와 expand 층에 사용되었다.

 3. 50%의 dropout 층이 fire9 module후에 사용되었다.

 4. SqueezeNet 에는 완전 연결 층이 없다.

 5. 학습률을 0.04로 설정했고 훈련하면서 선형적으로 감소시켰다.

 

 

구현

 Figure 2에서 왼쪽 모델을 처음에 구현하였는데 loss가 줄지 않았다. 이유를 모르겠다 그래서 중간 모델처럼 bypass를 추가하여서 모델을 구현하였다.

def fire_module(x,filters):
  # squeeze module
  squeeze1=Conv2D(filters[0],(1,1),strides=1,padding='same',activation='relu')(x)

  # expand module
  expand1_1=Conv2D(filters[1],(1,1),strides=1,padding='same',activation='relu')(squeeze1)
  expand1_3=Conv2D(filters[2],(3,3),strides=1,padding='same',activation='relu')(squeeze1)

  con1=Concatenate(axis=-1)([expand1_1,expand1_3])
  
  squeeze2=Conv2D(filters[0],(1,1),strides=1,padding='same',activation='relu')(con1)

  expand2_1=Conv2D(filters[1],(1,1),strides=1,padding='same',activation='relu')(squeeze2)
  expand2_3=Conv2D(filters[2],(3,3),strides=1,padding='same',activation='relu')(squeeze2)

  con2=Concatenate(axis=-1)([expand2_1,expand2_3])

  return Concatenate(axis=-1)([con1,con2])
def SqueezeNet():
  # SqueezeNet with simple bypass
  input_im=Input(shape=(32,32,3)) 

  x=Conv2D(96,(3,3),strides=2,padding='same',activation='relu')(input_im)
  x=MaxPool2D((3,3),strides=2,padding='same')(x)

  x=fire_module(x,[16,64,64])
  
  x=MaxPool2D((3,3),strides=2,padding='same')(x)

  x=fire_module(x,[32,128,128])
  
  x=MaxPool2D((3,3),strides=2,padding='same')(x)
 
  x=fire_module(x,[48,192,192])
  
  x=MaxPool2D((3,3),strides=1,padding='same')(x)

  x=fire_module(x,[64,256,256])
  x
  x=MaxPool2D((3,3),strides=2,padding='same')(x)

  x=Flatten()(x)
  x=Dense(512,activation='relu')(x)
  x=Dense(10,activation='softmax')(x)

  model=Model(inputs=input_im,outputs=x)

  return model

 

'논문 리뷰, 구현' 카테고리의 다른 글

10. ResNeXt 리뷰, 구현  (0) 2022.07.05
9. Wide Residual Network 논문 리뷰  (0) 2022.07.04
7. DenseNet 논문 리뷰,구현  (0) 2022.07.03
6. ResNet 논문 리뷰, 구현  (0) 2022.07.03
5.Network in Network 논문 리뷰  (0) 2022.07.03