논문명: ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
학회(출판연도): CVPR (2018)
연구분야: 딥러닝 기반 컴퓨터 비전 백본 네트워크
✓ ShuffleNet
10~150 MFLOPs 수준처럼 연산 자원이 매우 제한적인 모바일 기기에 특화 설계
Pointwise group convolution
Channel shuffle
⇒ 정확도를 높이고 연산량 줄임
✓ 왜 10~150MFLOPs 수준이 연산이 제한적?
- 최신 대형 CNN 모델(VGG-16, ResNet-50 등)은 수십~수백억 FLOPs를 소모함
- VGG-16: 약 15,500 MFOPs(15.3GFLOPs)
- ResNet-50: 약 4 GFLOPs
- 반면, 10~150 MFLOPs는 이런 모델의 1/100 ~ 1/1000 수준에 불과
⇒ 이렇게 적은 연산량은 스마트폰, 드론, IoT 기기처럼 저전력&저성능 CPU나 GPU의 실시간 처리를 할 수 있도록 맞춘 설계
<기존> - 더 깊고 더 큰 합성곱 신경망(CNN)을 구축하자!
✓ 층(Layer)
신경망을 구성하는 연산 단위.
- 입력 → 합성곱 → 활성화 → 풀링 같은 단계 각각이 하나의 층이 될 수 있음
깊이(depth): 층의 개수가 많아질수록 네트워크 깊이가 깊어짐
ex. ResNet-50 → 약 50개의 주요 층
✓ 채널(Channel)
한 층에서 처리하는 특징맵(feature map)의 개수
ex. RGB이미지 → 3개의 채널(R,G,B)
합성곱 층에서는 채널이 필터의 개수와 동일
→ 네트워크가 깊어질수록 채널 수가 늘어나는 경향이 있어서 더 많은 패턴을 병렬 추출 가능하다.
✓ 필터, 특징맵, 채널간의 관계
: 필터(Filter, Kernel) → 특징맵(Feature Map) → 채널(Channel)
필터(Filter, Kernel)
입력 데이터에서 특정 패턴을 감지하는 작은 가중치 행렬
→ 합성곱 연산을 통해 경계, 질감, 모양 등의 특징 추출
하나의 필터 → 입력과 합성곱 → 하나의 특징맵
특징맵(Feature Map)
- 필터가 입력에 대해 합성곱 연산을 한 결과
- 해당 필터가 감지한 패턴의 공간적 분포 나타냄
- CNN 한 층의 출력은 여러 개의 특징맵으로 구성됨
채널(Channel)
- 한 층의 출력에서 특징맵들의 집합을 의미하는 “깊이” 방향의 개수
⇒ 필터: 패턴을 찾는 도구
⇒ 특징맵: 찾은 패턴의 지도
⇒ 채널: 이런 지도들의 묶음
<ShuffleNet의 목표> - 모바일같은 저전력 환경(10~150 MFLOPs)에서 최고 성능을 달성해보자!
<기존>
1) 가지치기(pruning) 2) 압축(compression) 3) 저비트 표현(low-bit representation) 집중
✓ 가지치기(pruning)
네트워크에서 중요도가 낮은 연결(가중치)나 필터를 제거하여 모델을 가볍게!
⇒ 파라미터 수와 연산량(FLOPs) 감소로 추론 속도 향상 및 메모리 절약 가능
✓ 압축(compression)
학습된 모델을 저장&배포하기 쉽게 크기 줄이기
⇒ 저장 공간 절약, 메모리 대역폭 사용량 감소
✓ 저비트 표현(low-bit representation)
가중치나 활성화값을 32비트(부동소수점) 대신 16비트, 8비트, 심하면 1~4비트로 표현
⇒ 모델 크기 축소 + 연산 속도 향상
✓ 왜 기존의 CNN 연구가 여기에 초점을 맞췄을까?
P: CNN은 정확도를 높이려고 점점 층 수 증가 + 채널 수 증가
→ 수십억 FLOPs, 수백MB 모델 크기
→ 스마트폰, 드론, 로봇 같은 저성능&저전력 기기에서 실행 불가S: 이미 잘 학습된 기존 큰 모델을 쓰되, “효율적으로 줄이자”
→ 가지치기, 압축, 저비트 표현 기법 같은 모델 경량화 기법이 연구 초점!
연산범위에 맞춰 효율적인 기본 아키텍처 자체를 새로 설계하자!
P: Xception, ResNeXt 같은 최신 구조도 작은 네트워크 안에서는 효율이 떨어짐
→ 밀집 1x1 합성곱(dense 1x1 convolutions) 때문(비용이 큼)
S
포인트와이즈 그룹 합성곱(pointwise group convolution)
✓ 포인트와이드 그룹 합성곱
일반 1x1 합성곱: 모든 입력 채널과 모든 출력 채널 연결
그룹 합성곱: 채널을 g개의 그룹으로 나눠서, 각 그룹 안에서만 연산
→ 연산량의 약 g배 절감
⇒ P: 그룹끼리 정보가 안 섞임 → 표현력 저하
채널 셔플(channel shuffle)
그룹 합성곱 때문에 줄어드는 채널 간 정보 흐름 문제 해결
채널 순서를 섞어서 그룹 간 정보가 섞이게 끔
⇒ 같은 연산 예산 내에서 더 많은 채널 → 더 많은 정보 인코딩 가능
⇒ MobileNet보다 40MFLOPs 수준에서 Top-1 오류율 7.8% 낮음
⇒ 실제 ARM칩(하드웨어)에서 AlexNet보다 13배 빠름, 정확도는 비슷
✓ 채널 셔플(channel shuffle)
그룹 합성곱 후, 채널을 섞어서 재배치
다음 그룹 합성곱에서 다른 그룹의 채널을 입력으로 받게 함
⇒ 정보가 그룹 간 흐르게 되어 성능 회복!
✓ 1x1 합성곱 연산을 그룹화 → 연산 절감
채널 셔플 → 정보 흐름 유지
이렇게 절감한 연산량으로 채널 수를 늘려서 작은 모델에서 성능을 키울 수 있는듯
✓ ShuffleNet처럼 연산예산이 제한된 경우, 채널수 늘리는 것이 성능 극대화?
채널: 이미지 특징을 담은 필터의 개수
즉, 채널이 많을 수록
- 더 다양한 패턴, 형태, 색상 정보 병렬 추출 가능
- 표현력이 증가 됨
BUT, 무작정 늘릴 수는 없음 → 채널 늘리면 FLOPs도 급증!(속도저하)
⇒ ShuffleNet의 경우
절감한 연산량을 채널수 늘리는데 재투자해서
작은 네트워크에서 부족한 표현력을 보완하여 성능을 키우겠다는 뜻!
효율적인 모델 설계(Efficient Model Designs)
<최근> 고품질의 심층신경망 임베디드 장치에서 실행하려는 수요⬆️ → 효율적 모델 설계 필요성⬆️
Inception모듈Group Convolution(그룹 합성곱)
<도입> AlexNet - 2개의 GPU로 모델을 분산하기 위해 사용
<효율성 입증> ResNet
✓ Depthwise Separable Convolution ← Inception 시리즈의 분리 합성곱 아이디어를 일반화
<최근> MobileNet이 Depthwise Separable Convolution 활용하여 경량 모델 중 최고 성능
⇒ ① 그룹합성곱 과 ② Depthwsie Separable Convolution을 새로운 형태로 일반화!
채널 셔플 연산(Channel Shuffle Operation)
<배경> “채널 셔플”이라는 개념이 이전에는 거의 다뤄지지 않았다.
<기존 사례>
⇒ ShuffleNet은 채널 셔플을 의도적으로 설계의 핵심요소로 도입하여,
모델 가속(Model Acceleration)
목표: 사전 학습된 모델의 정확도를 유지하면서 추론속도를 높이자!
⇒ 신경망 모델을 가볍고 빠르게 만드는 대표적 기법
<현대>동일한 구조의 빌딩 블록을 반복해서 쌓는 형태
Xception & ResNeXt: Depthwise Separable Convolution 또는 Group Convolution 도입
→ 표현력과 계산 비용 사이에서 우수한 균형 달성
BUT!
P: 1x1 합성곱에서의 연산 비용 충분히 고려X
[ResNeXt] 3x3 계층에서만 그룹 합성곱 적용
→ Residual Unit에서 Pointwise Convolution(1x1 Conv)이 전체 연산량의 93.4% 차지
[소형 네트워크] 연산량을 맞추기 위해 채널 수 제한 → Pointwise Conv이 병목되어 정확도 하락
S: 1x1 계층에도 채널 희소 연결(channel sparse connection) → “그룹 합성곱” 적용하자!
→ 각 합성곱 연산이 자신과 대응되는 입력 채널 그룹에서만 작동하므로 연산 비용⬇️
P: 합성곱을 여러층 쌓게 되면, 그룹 간 정보 흐름 차단
→ 표현력 약화
S: 채널 간 흐름 복원 → 다음 그룹 합성곱 층이 이전 층의 다른 그룹으로부터 입력 받을 수 있도록!


✓ (c)에서 왜 다운 샘플링?
- [CNN] 보통 Stage가 바뀔 때 공간 크기를 절반으로 줄이고 채널 수를 늘리는 패턴
- 계산량 절감: 해상도를 줄이면 이후 레이어에서 연산량이 줄어듦
- 수용영역 확대: 한 픽셀이 더 많은 영역의 정보를 포괄
- 추상화 수준 상승: 점점 더 고수준 특징 학습 가능
✓ (c)에서 왜 Add 대신 Concat?(합집합 - 크기는 같은 채널수가 다를때 사용)
- stride =2 를 쓰면
- 출력 채널수를 늘리면서 해상도를 줄임
⇒ 채널 수를 늘리면서 연결하기 위함
⇒ <기존> stride=2 블록에서는 채널을 늘리려면 1x1 Conv 같은 연산 해야함(FLOPs 증가)
⇒ stride=2블록은 Concat만 사용해서 채널 확장 → 연산량 거의 없이 채널 증가 가능
<챗지-ShuffleNet 실 사용 순서 예시>
네트워크 설계에서 stage 첫 블록 (c) → 나머지는 (b) / (a)는 비교 실험용으로만
✓ 연산 효율성

→ 뫄뫄한 수식으로 인해 같은 연산 예산 하에서 ShuffleNet은 더 넓은 특징맵 사용 가능
⇒ 작은 네트워크는 정보를 처리할 채널 수가 부족하므로 채널을 넓히는 건 성능향상에 있어 중요!
✓ Depthwise Conv의 사용전략
Shuffle Net 에서는 “병목 특징 맵(Bottleneck featuremap)”에만 적용
Depthwise Conv는 이론적으로는 매우 낮은 복잡도를 갖지만,
실제 저전력 모바일 기기에서는 효율적으로 구현하기 어렵기 때문
⇒ 계산 대비 메모리 접근 비율이 나쁨
→ 불필요한 오버헤드를 최소화 하기 위함

→ 이렇게 채널 수를 2배 늘리고
ShuffleNet Unit의 bottleneck 채널수는 출력 채널수의 1/4로 설정
✓ 왜 1/4 비율일까?
✓ Bottleneck 구조: 줄이기 → 처리 → 늘리기
처음 1x1 Conv에서 채널 수를 줄이면 중간 연산(특히, 3x3 Conv 또는 Depthwise Conv)에 필요한 연산량이 비례해서 줄어듦
마지막 1x1 Conv에서 다시 채널수 복원
너무 많이 줄이면→ 연산량이 줄지만 정보손실도 커짐(정확도 하락)
너무 적게 줄이면→ 정보는 남지만, 연산량 절감 효과 떨어짐
⇒ 그냥 경험적으로~ 좋다
✓ g(그룹 수)와 채널 수의 관계
⇒ 그룹 수가 커질수록 같은 연산 내에서 “출력 채널 수(=합성곱필터수)가 많아진다.
더 많은 정보를 인코딩할 수 있게 하지만, 동시에 각 개별 합성곱 필터가 참조할 수 있는 입력 채널수가 제한되므로 성능저하로 이어질 수도 있음.
그냥 쉽게 생각하면,
그룹 합성곱이라는게,
입력 채널을 g개로 나누고 각 그룹별로 독립적으로 합성곱
g가 늘어나면 날수록 각 그룹의 입력 채널수는 당연히 줄겠지
→ 한 개의 필터가 처리하는 연산량이 줄어서 같은 연산량 예산에서 더 많은 출력 채널
을 배치할 수 있었잖어~
⇒ 이렇게 g가 커질수록 한 개의 합성곱 필터가 볼 수 있는 입력 채널수가 제한되기 때문에
입력 특징 정보의 다양성이 줄어들 수 밖에.
⇒ g가 커져도 성능을 유지하려면 그룹 간 정보가 섞여야 함
⇒ Channel Shuffle은
이전 레이어 출력 채널을 재배치해서 다음 그룹 합성곱이 다른 그룹의 정보를 참조하게끔!
✓ 복잡도 조절법

→ 채널 수에 따라 스케일 팩터(scale factor) 적용
ShuffleNet sx : ShuffleNet 1x의 필터 수를 s배로 늘린 모델 의미
→ 전체 연산 복잡도: s^2
✓ 모델이 작을수록 그룹수를 늘리는게 효과적
- 가로(같은 모델에서 g) → 그룹수를 늘리면 같은 연산량 내에서 채널수를 늘릴 수 있어서 성능이 좋아지기도 함
- 세로(같은g에서 모델크기) → 채널수와 연산량이 줄어들면 정확도 떨어짐
✓ 너무 큰 g는 오히려 성능 하락 ex. ShuffleNet 0.5x
✓ 아주 작은 모델의 경우에는 그룹 수가 커질수록 성능이 꾸준히 향상
[평가방법]
ImageNet 2012 분류 데이터셋에서 제안한 모델 평가
[예외]
Weight Decay 값을 4 x 10^(-5) 로 설정
학습률 정책 사용
데이터 전처리에서 “스케일 증강” 약하게 적용
⇒ 작은 네트워크의 경우 “과소적합”에 더 취약하기 때문에 예외를 둠
⇒ 채널 셔플을 적용하면 모든 경우 오류율 감소 + 그룹수(g)가 클수록 효과가 더 큼!
Ablation Study?
→ AI시스템에서 특정부분을 제거함으로써 그 부분이 전체적인 시스템 성능에 기여하는 바를 연구하는 것
즉, 제안한 요소가 모델에 어떤 영향이 미치는지 확인하고 싶을때,
이 요소를 포함한 모델 vs. 요소를 포함하지 않은 모델을 비교하는 것


ShuffleNet은 50개의 계층(layers)로 구성된 반면, MobileNet은 28개의 계층만 가지고 있음
→ ShuffleNet의 stage2~4에서 블록 절반을 없앤 26계층 버전(SuffleNet 0.5 shallow (g=3)) 실험
: 그래도 MobileNet보다 성능이 좋더라
⇒ ShuffleNet의 성능이 “깊이”보다 “효율적인 구조 설계”에 기인한다는 것을 시사

→ ShuffleNet이 비슷한 정확도를 가지면서도 효율적이다
✓ 아키텍쳐 확장성
→ ShuffleNet은 단순한 구조 덕분에, 최신 기법을 쉽게 적용 가능하다

⇒ ShuffleNet이 단순한 구조를 가졌기 때문이다.
ShuffleNet은 그룹수(g)가 큰 경우 성능이 더 좋긴 하지만, 구현에서의 효율성이 떨어짐
→ g=3이 good!
