SqueezeNet, AlexNet-Leval Accuracy with 50x fewer parameters and <0.5 MB Model SIze 논문은 2016에 개제된 논문입니다. 논문 이름을 그대로 번역하면 AlexNet보다 50배 적은 파라미터 수로 AlexNet과 동일한 정확도를 지닌 모델이고, 용량도 0.5MB보다 적습니다. 이처럼 SqueezeNet은 엄청 가벼고 작은 모델입니다. 모델이 가벼우면 어떤 이점이 있을까요?
우선, (1) 연산량이 적기 때문에 학습이 빠릅니다. (2) 실시간으로 정보를 전송해야하는 업무에 적용할 수 있습니다. 예를 들어, 자율 주행 시스템은 주기적으로 차량 정보를 서버에 업데이트 합니다. 계속 바뀌는 정보를 빠르게 처리해야 하기 때문입니다. 모델의 연산량이 적으면, 정보 갱신을 더 빈번하게 할 수 있습니다. (3) FPGA와 임베디드 시스템에 적용할 수 있습니다. FPGA는 10MB로 용량이 제한되어 있는 메모리를 의미합니다. 모델의 용량이 작다면 메모리가 제한되어 있는 분야에서도 딥러닝을 적용할 수 있습니다.
위 장점을 활용하기 위해 논문 저자는 파라미터 수를 낮추고 정확도는 유지시키는 방법에 집중합니다. 그래서 탄생한 것이 SqueezeNet입니다. SqueezeNet은 8개의 Fire module로 구성된 신경망입니다. Fire module이 모델의 파라미터 수를 감소시키는 역할을 합니다.
SqueezeNet
1. Architectural Design Strategies
논문 저자는 파라미터 수는 적지만 정확도는 어느정도 유지하는 CNN 구조를 구축하기 위해 3가지 전략을 적용합니다. 아래 3가지 전략을 적용하여 Fire module이 탄생합니다.
(1) 3x3 filter를 1x1 filter로 대체합니다. 1x1 filter는 3x3 filter 연산량보다 9배 적습니다. 이를 최대한 활용합니다.
(2) 3x3 filter로 입력되는 입력 채널의 수를 감소시킵니다. 3x3 filter의 conv layer 연산량은 (입력 채널) * (필터 수) * (필터 크기) 입니다. 입력 채널을 감소하면 3x3 filter의 연산량이 감소합니다.
(3) pooling layer를 최대한 늦춥니다. pooling layer는 feature map size를 감소시킵니다. pooling layer를 최대한 늦게 배치해 conv layer의 출력 feature map이 고해상도를 지니게 합니다. 큰 크기의 feature map은 정확도를 높일 수 있으며, 이는 실험으로 증명되었습니다.
전략 (1)과 (2)는 정확도를 보존하면서 파라미터 수를 감소시키는 전략이고, 전략(3)은 제한된 파라미터 수에서 정확도를 높이는 방법입니다.
2. The Fire Module
SqueezeNet은 Fire Module로 이루어진 모델입니다. Fire Module이 무엇인지 한번 알아보겠습니다.
위 그림이 Fire Module입니다. Fire Module은 두 가지 layer로 이루어져있습니다. Squeeze layer와 expand layer 입니다. Squeeze layer는 1x1 filter로만 이루어져 있습니다. expand layer는 1x1와 3x3 filter가 석여있습니다. Squeeze layer 내에 있는 1x1 filter들의 출력값은 하나로 합쳐져서 expand로 전달됩니다.
Fire Module에는 하이퍼파라미터가 존재합니다. s1x1, e1x1, e3x3 입니다. s1x1은 squeeze layer에서 1x1 filter 수입니다. e1x1는 expand layer에서 1x1 filter 수입니다. e3x3은 expand layer에서 3x3 filter 수 입니다. s1x1 < (e1x1 + e3x3)로 설정하여 squeeze layer의 channel수가 expand layer의 channel수보다 작게 설정합니다. squeeze layer의 출력값은 expand layer의 입력값으로 생각할 수 있습니다. 입력값을 expand layer의 filter수보다 작게 설정하여 2번 전략을 만족합니다.
3. The SqueezeNet Archtecture
3가지 SqueezeNet의 구조입니다. 첫 번째는 기본 구조 입니다. 두 번째는 기본 구조에 simple bypass가 추가했고 세 번째는 complex bypass를 추가했습니다. bypass는 ResNet의 skip connetcion와 같은 개념입니다. 그림을 보면 fire2의 output과 fire3의 output이 더해져 fire4의 입력값으로 전달됩니다.
bypass를 이용하려면 입력 채널 수와 출력 채널 수가 같아야 합니다. 따라서 bypass를 제한적으로 사용할 수 밖에 없습니다. 두 번째 그림을 보면 절반의 Fire Module에 bypass가 적용되었습니다. 그래서 complex bypass 를 도입합니다. complex bypass는 입력 채널수와 출력 채널 수가 다른 경우에 이용합니다. bypass에 1x1 conv를 추가하여 채널수를 조절합니다. 하지만 실험 결과 simple bypass의 성능이 더 좋았습니다. 아래 표에서 확인할 수 있습니다.
bypass를 추가한 이유는 Fire Module내에서 bottleneck 문제가 발생하기 때문입니다. squeeze layer의 파라미터 수는 expand layer보다 작습니다. squeeze layer가 갖고 있는 파라미터 수가 적기 때문에, 적은 양의 정보가 squeeze layer를 통과한다고 생각할 수 있습니다. 이처럼 차원 감소는 모델을 가볍게 해주지만 정보 손실이 발생합니다. 따라서 bypass를 추가하여 정보 손실을 막습니다.
Evaluation of SqueezeNet
우선, AlexNet을 SqueezeNet으로 압축한 결과입니다. 파라미터 수가 3배 감소했습니다.
다양한 model compression 기법과 비교입니다.
SqueezeNet을 적용했을 때, 파라미터 감소가 제일 컸고, AlexNet 보다 성능이 향상되었습니다. 또한 SqueezeNet에 Deep Compression을 적용시켜 더 압축시킬 수 있다는 것을 보여줍니다. 이를 통해 SqueezeNet에 추가적으로 compression 기법을 적용할 수 있다고 합니다.
참고자료