테크매니아
SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and 0.5MB model size 본문
SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and 0.5MB model size
SciomageLAB 2024. 10. 18. 00:27이 논문은 2016년 버클리와 스탠포드 저자가 썼다.
아주 특별한 압축 기법은 아니고 네트워크 구조를 새로 제안하는 논문 같다.
며칠 전에 Jaewoo Song님이 유튜브에 좋은 자료를 올려주셨다. (도움이 많이 됐습니다. 고맙습니다.)
- Alexnet과 비슷한 성능, 파라미터 50배 적음, 모델 크기 510배 작음
- squeeze layer(1x1 filters)와 expand layer(1x1, 3x3 filters)가 있음
INTRODUCTION AND MOTIVATION
- 분산교육 중 서버간 통신 감소
- 하드웨어 배포 용이
- (작으면 당연히 좋잖아요)
Key idea = Fire module
상단 Squeeze Layer, 하단 Expand Layer로 이루어진 Fire module이 이 논문의 핵심인데, 이렇게 그림으로만 보면 이해가 어렵다.
위 표가 논문에서 말하는 SqueezeNet의 자세한 구조이다. 일반적인(?) DNN모델과 가장 다른 점은 FC레이어가 따로 없다는 것이다. FC레이어는 많은 논문에서 말하듯이 파라미터 수가 너무 많다. (보통 맨 뒤에 나오는데 그 때 까지의 Conv 값을 다 갖고 있다가 Fully 연결해 버리기 때문에 푸르닝의 대상이 되기도 한다.)
자세한 내용을 보기 위해서 위 테이블에 있는 layer name을 따라 가며 레이어를 하나씩 정리해봤다.
입력 레이어는 shape은 224x224x3이고 여기에 7x7/2 Conv연산을 96채널을 해서 111x11x96 ouput이 나온다. 여기에 3x3/2 maxpool1에 의해 55x55x96 shpae의 output이 나온다.
보통은(?) Conv kernel size가 3x3인데 비해 7x7으로 비교젹 큰 conv를 쓰고 있고, Pooling layer kernel size도 2x2가 아니라 3x3을 쓰고 있다.
이전 maxpooling에 이어서, fire1 layer에 대한 설명이다. fire1은 s1x1, e1x1, e3x3 3개로 이루어져 있다. s1x1은 입력에 대해서 16개 채널로 1x1 conv를 하고 그 결과인 55x55x16 shape을 출력한다. 이 결과를 e1x1과 e3x3이 각각 64개 채널의 1x1과 3x3으로 conv연산한 결과 55x55x64를 연결해서 55x55x128 shpae을 만든다.
이런 식으로 fire layer를 계속 진행해서 fire10 layer까지 진행하게 되고, conv10부터 설명을 이어서 하면...
뒤쪽의 conv10 레이어는 1000채널의 1x1 kernel로 conv 연산을 한다. (1000개인 이유는 1000개의 classification을 위해서이다.) 그 결과 13x13x1000 Tensor를 13x13 avgpooling으로 평균을 내면 1000개의 결과가 나온다.
이 부분이 FC레이어를 대체하는 것이고, 상술한 바와 같이 파라미터가 굉장히 많은 FC레이어를 없애서 이것으로 대신한 것이다.
1x1 kernel으로 파라미터 수를 줄이고 FC레이어를 줄인것이 주요 내용인 것 같다. shortcut(?)을 쓰면 추가로 성능을 조금 더 향상 시킬 수 있고, 8bit, 6bit으로 양자화 하면 0.66MB, 0.47MB까지 압축할 수 있다고 한다. 성능은 당연히 똑같다. (사실은 0.3% 더 좋아진다.)