Convolution Neural Networks (CNN) 모델이 커지고 깊어지면서 모바일 등의 저사양 디바이스에 deployment 하기에 다음과 같은 제약 사향이 발생합니다.
- 모델이 커지면서 파라미터의 개수가 매우 많아집니다. ResNet-152 은 6천만 개의 파라미터를 가지고 하나의 파라미터가 32 bit (4 byte)의 메모리가 필요한 것을 생각해봤을 때, 모델을 loading 하기 위해 메모리 공간은 수백 메가가 넘어가게 됩니다.
- 모델의 파라미터를 저장하는 부분 이외에도 중간의 feature map 들을 저장하고 계산하는 run-time memory 도 매우 많이 소요됩니다. 특히 연산량 파워가 작은 임베디드 시스템에서는 큰 문제가 될 수 있습니다.
이 논문에서는 network slimming 이라는 pruning 방법을 제안합니다. 이 방법은 batch normalization 의 scaling factor를 이용하여 중요하지 않은 채널을 제거하고 이를 여러번 반복해 compact 한 네트워크를 구성합니다. 밑의 그림처럼 channel scaling factor를 통해 특정 임계치 미만의 factor 값을 가지면 이를 제거하게 됩니다.
Network slimming
Pruning 은 근본적으로 모델의 sparsity를 야기합니다. Sparsity 는 모델의 개별 파라미터, filter, channel, layer 단에서 구현될 수 있는데, 개별 파라미터의 sparsity는 모델 압축율이 좋지만 sparse matrix 연산을 지원하는 별도의 라이브러리가 필요하며 layer 레벨의 sparsity는 특별한 연산 라이브러리가 필요하지는 않지만 해당 layer를 통으로 날리기 때문에 비효율적입니다. 따라서 channel 레벨의 sparsity가 layer 레벨의 sparsity 보다 더 유연하고 구현이 쉽다는 특징 때문에 pruning에 일반적으로 많이 사용합니다.
Scaling factors
그렇다면 pruning할 channel을 어떻게 결정할까요? 논문에서는 모든 channel에 대해 channel 결과에 곱해지는 scaling factor $\gamma$를 두고 일반적인 훈련 목적 함수에 더해 sparsity를 야기하는 L1 페널티 항을 추가하여 $\gamma$가 작은 channel을 삭제합니다. 밑의 식은 최종 목적함수로 $g$는 L1-norm이 되고 L1-norm은 non-smooth 하기 때문에 subgradient 방식으로 최적화를 수행합니다. 결론적으로 scaling factor 도 같이 훈련 되어 channel을 선택하는 매개체로 사용되게 됩니다.
여기서 드는 의문은 $\gamma$ 를 네트워크의 모든 channel 마다 설정하면 메모리가 더 필요하지 않을까입니다. Pruning할 channel을 선택하기 위해서 $\gamma$를 위한 별도의 메모리를 할당해야 되냐는 것이죠. 논문에서는 batch normalization의 scaling factor를 직접적으로 사용합니다.
Batch normalization은 2015년 발표 이후 거의 모든 CNN 모델의 구성 요소가 된 기술로 하나의 batch 의 통계를 이용하여 입력과 출력의 분포를 일정하게 해줍니다. 밑의 식에서 $z_{in}, z_{out}$은 각각 batch normalization의 입력, 출력이며 $\gamma, \beta$는 훈련가능한 파라미터입니다. $\gamma, \beta$의 차원은 해당 layer의 feature map의 channel 수이므로 논문에서는 이 $\gamma$ 파라미터를 pruning을 위한 scaling factor로 사용합니다.
실제로 이는 굉장히 자연스러운 방법인 것이, batch normalization 없이 scaling layer를 따로 두었을 때 scaling layer와 convolution layer 둘 모두 선형 변환이므로 scaling layer의 값이 큰 의미가 없습니다. 또한, batch normalization 앞에 scaling layer를 따로 두었을 때는 scaling이 batch normalization에 의해 상쇄되고, 뒤에 scaling layer를 두었을 때는 scaling factor가 연속적으로 2개가 생기게 됩니다.
실제 구현 시에는 batch normalization의 $\gamma$에 위 목적함수의 sparsity 유도를 위한 L1-norm 페널티를 추가적인 subgradient 방식으로 추가합니다.
Channel pruning and fine-tuning
Scaling factor를 통해 pruning 할 channel을 선택하고 해당 channel에 연결된 incoming, outgoing 파라미터를 삭제하게 됩니다. 논문에서는 layer 마다 일정 비율이 아닌 네트워크 전체에 대해 scaling factor 분포를 통해 잘라낼 임계치를 설정하고 그 임계치보다 작은 scaling factor를 가지는 channel을 잘라냅니다. 이후 fine-tuning을 통해 손실된 성능을 복구하게 됩니다.
Multi-pass scheme
위의 방법을 한 번이 아닌 여러 번 반복합니다. 이를 반복할 경우 네트워크가 점점 슬림해지며 최종적으로 compact한 네트워크를 얻을 수 있습니다.
Handling cross layer connections and pre-activation structures
ResNet과 DenseNet 처럼 각 layer의 출력이 그 후 여러 layer의 입력으로 연결되는 경우에는 sparsity를 어떻게 적용할까요? 이때에는 해당 layer의 들어오는 부분에 대해서만 sparsity를 적용합니다. 예를 들어 resnet의 한 layer를 구성하는 bottleneck block은 여러 단계의 batch normalization과 convolution이 있습니다. Bottleneck block 에서 마지막 convolution 은 layer의 최종 출력이 되므로 이 convolution에 들어오는 방향으로만 pruning을 적용합니다. 나머지 convolution 들은 최종 출력이 아니므로 들어오고 나가는 방향 모두 pruning을 적용합니다.
마지막으로 이러한 작업을 효율적으로 하기 위해 channel selection layer를 만들어 중요하지 않은 채널의 인덱스를 기록해 마스킹 용도로 사용합니다.
Experiment
CIFAR and SVHN
먼저 CIFAR-10, CIFAR-100, SVHN 데이터셋에 대한 결과는 다음과 같습니다.
Pruning을 수행했을 때, 대부분 모델의 FLOPS가 줄면서도 본래 모델과 비슷한 성능을 가지고 있음을 알 수 있습니다. 특히, 주목할 점은 pruning을 수행하고 fine-tuning한 결과가 본래 네트워크의 성능보다 좋을 때가 있다는 것입니다.
ImageNet
ImageNet에 대한 결과는 50%를 pruning 하였을 때, 파라미터를 5배 정도 감소하느 FLOPS는 30% 정도만 감소했습니다. 이는 pruning이 convolution layer가 아닌 전체 FLOPS에 큰 영향을 미치지 않는 fully connected layer에 대부분 수행되었기 때문입니다.
Multi-pass scheme
위 표는 VGGNet에 대해 multi-pass 로 여러 단계를 거쳐 pruning을 진행한 결과입니다. 이때 매 단계마다 pruning 비율은 50%로 설정하였습니다. 단계를 거칠 때마다 pruning 되는 파라미터와 FLOPS가 많아지고 특히 CIFAR-10 에서는 5회 pruning에서 본래 모델보다 더 높은 성능을 기록했습니다.
Effect of pruned percentage
Pruning 할 channel의 비율을 얼마나 설정해야 할까요? 밑의 그림은 CIFAR-10에 대한 DenseNet-40의 결과입니다. Pruning 비율을 80% 안쪽으로 설정하면 기존 baseline에 비해 높은 성능을 얻을 수 있었고 위의 sparsity를 강제한 페널티를 통해서 훈련시켰을 경우 (Trained with Sparsity 부분) 성능이 더 좋은 것을 알 수 있습니다. 즉, L1-norm을 통한 regularization 효과를 얻었다고 생각할 수 있습니다.
Channel sparsity regularization
L1-sparsity 항은 scaling factor를 0으로 가깝게 하기 위함입니다. 여기서 $\lambda$ 계수를 통해 목적 함수 내에서의 중요도를 결정하게 되는데요. 밑의 그림은 $\lambda$에 따른 scaling factor 분포를 나타냅니다. $\lambda=10^{-4}$ 일 경우 대부분의 scaling factor가 0에 근접합니다. Sparsity regularization이 강하게 적용되다 보니 중요한 채널만 남기고 나머지는 버리는 feature selection 효과가 있는 것으로 생각할 수 있습니다.
밑 그림은 VGGNet의 한 layer에 대한 scaling factor 분포입니다. 훈련을 시작할 때는 모두 동일하지만 훈련이 시작하면서 특정한 scaling factor만 살아남고 나머지는 버려지는 양상을 확인할 수 있습니다.
참조
'Machine Learning Models > Covolutions' 카테고리의 다른 글
Convolution 의 종류 (0) | 2021.05.27 |
---|---|
Slimmable Neural Networks (0) | 2021.03.14 |
Pruning Filters for Efficient Convnets (0) | 2021.03.11 |
EfficientNet (0) | 2021.03.10 |
DenseNet (0) | 2021.03.03 |