[Paper Review] GhostNet : More Features from Cheap Operations
카테고리: Paper
태그: Classification ML
Paper:
- GhostNet : More Features from Cheap Operations
🚀 Abstract
최근 CNN의 발전 과정을 살펴보면 만족할만한 성능을 얻기 위해 점점 거대해지는 경향이 있었다. 따라서 레이어마다 수많은 feature map들이 존재하는데 정말 모든 feature map이 필요할까? 위 그림은 ResNet-50, first layer의 feature map들을 시각화한 그림이다. 자세히 보면 비슷한 쌍들이 몇 보이는데, 저자들의 관점은 다음과 같다. “이들 사이에는 강한 correlation이 존재하므로 본질적인 feature map은 하나이고 나머지는 유령들이다.” 이러한 관점으로 본질적인 feature map들을 먼저 구하고, 이들에게 단순한 linear transform을 적용해 ghost feaure map들을 생성한다. 그러면 훨씬 적은 비용(#parameters, FLOPs)으로 비슷한 효과를 낼 수 있다.
🚀 Introduction
본 논문에서는 더 적은 parameters 로 더 많은 feature들을 생성하는 Ghost Module을 제안한다. 간단히 설명하자면 기존의 Conv layer를 두 파트로 나눈다.
- 1st step : 중요한 feature maps 만들기
- 기존의 conv layer와 동일하지만, feature map의 갯수를 제한한다.
- 2nd step : 첫 파트에서 받은 feature maps에 linear transform을 이용해 새로운 feature maps을 생성한다.
- 각 파트에서 생성한 feature map들을 concat.
기존의 conv layer와 비교했을 때, 결과적으로 input&output channel의 변화는 없으면서도 파라미터 갯수와 계산 복잡도는 크게 감소한다. 이러한 Ghost module을 바탕으로 저자들은 GhostNet이라는 새로운 네트워크를 만들었다. 저자들은 우선 기존 모델들의 conv layer를 ghost module로 단순 교체함으로서 ghost module의 효율성을 입증하였고, 그 다음 GhostNet의 우수성을 입증하였다(SOTA).
🚀 Related Work
앞서 언급했듯이 CNN은 만족할 만한 성능을 얻기 위해 점점 거대해지는 방향으로 발전한 추세가 있는가 하면, 모바일 기기(edge device)에서도 좋은 성능을 보일만큼 효율적이고 가벼운 모델을 만드려는 추세도 있다. 후자에 해당하는 방향에는 두 가지 접근이 존재한다.
- Model Compression : 기존의 큰 모델을 압축해 경량화 하자.
- Pruning : 뉴런 사이 불필요한 connection을 잘라내거나 중요하지 않은 채널들을 제거
- Quantization : weights나 activation을 discrete value로 표현하고 계산을 가속화 (하드웨어측 접근)
- Tensor Decomposition : weights matrix를 low-rank matrix로 만들어 parameters와 계산을 줄임
- Compact Model Design : 애초에 모델을 효율적이고 작게 디자인.
- MobileNet, Xception, ShuffleNet, etc…
- 이러한 모델들은 적은 연산으로도 좋은 성능을 보였지만 feature map들 사이의 redundancy 문제는 해결하지 못했다.
모델을 경량화하는 접근도 충분히 좋은 기술이지만, 베이스라인 모델의 크기에 의존한다는 한계가 존재한다. 따라서 edge device에 넣을 목적이라면 애초에 compact model design이 적합한 방법이라 할 수 있고, GhostNet의 접근 방식 또한 이에 해당한다.
🚀 Model Architecture
Ghost Bottleneck Block
GhostNet의 base block인 ghost-bottlenetck block을 살펴보자. 전체적인 구조는 MobileNet에서 사용한 MBConv block과 유사하다. 차이점은 channel expansion & channel reduction 시 ordinary conv가 아닌 ghost module을 사용했다는 것이다. 또한 latency를 좀 더 빠르게 하기 위해 activation function도 hard-swish에서 ReLU로 교체했다. 참고로 stride = 2 인 경우는 대개 block이 바뀔 때, 즉 width, height가 감소하고 channel의 갯수가 증가할 때이다.
GhostNet
모델 자체가 큰 것 같지는 않은데 번잡해 보인다. 이전에 리뷰한 EfficientNet은 엄청 깔끔하던데…
🚀 Experiments
맨 처음 저자들은 intrinsic feature map에 간단한 linear transform을 적용하는 것만으로도 ghost feature map들을 생성할 수 있다고 주장했다. 먼저 간단한 Toy expreiment로 이를 증명했는데, 실제 feature map들과 ghost module로 생성한 feature map들 사이 아주 작은 MSE가 나왔다고 한다. 여기서 말한 간단한 linear transform이라는 것은 결국 ordinary convolution 연산이다. 저자들은 이 외에도 affine transform이나 wavelet transform 등 다른 linear transform들도 시도해봤지만 conv 만한 것이 없다고 한다.
이번 섹션에서는 우선 기존의 conv layer를 ghost module로 바꿈으로서 ghost module의 효율성을 입증하고, 최종적으로 GhostNet의 성능을 살펴볼 것이다. 결과를 미리 이야기하자면 작은 데이터셋(CIFAR 10), 큰 데이터셋(Imagenet) 모두에서 좋은 성능을 보였다.
Efficiency of Ghost Module
d : kernel size (fix s=2) | 1/s : ratio of intrinsic feature maps (fix d=3) |
---|---|
Ghost module에서 필요한 hyper-parameter는 두 가지이다. 하나는 kernel size, 다른 하나는 본질적인 feature map의 비율을 얼마나 잡을 것이냐 이다. 위 표는 해당 hyper-parameter에 따른 성능을 측정한 것이다. 결과적으로 (hyper parameter만 잘 선택한다면) ghost module은 훨씬 저렴하면서도 conv layer의 훌륭한 대체제라 할 수 있다.
GhostNet on Imagenet
Accuracy | Latency |
---|---|
- Training Setting은 ShuffleNet에서 살짝 변경
- Classification SOTA 달성 (small networks 에서)
🚀 Discussion
최근 CNN에서 가장 인기가 많은 기법은 depthwise separable convolution일 것이다. 비록 GPU와의 궁합이 좋지 않지만 기존 conv의 연산량을 획기적으로 줄였기 때문에 충분히 의미가 있다. 이때 depthwise separable block의 num of parameter 비율을 조사해보면 1by1 conv (pointwise_conv)가 압도적인 비율을 차지한다는 것을 알 수 있다. 하지만 ghost module은 depthwise separable block과의 접근 철학이 다르기 때문에 위와 같은 약점이 존재하지 않는다. 최근 transformer 기반 모델이 classification task까지 들어오고 있던데, cnn은 자리를 지킬 수 있을까? Ghost module과 같은 기발한 아이디어들이 많이 나와야 할 것 같다.
🚀 실습 코드
GhostNet from scratch (pytorch)
class 3개인 데이터로 스크래치 모델 학습해봤는데 쭉쭉 잘 올라간다
댓글 남기기