模型压缩简述

如今学术界新提出的神经网络模型越来越大,而在实际应用中很多模型都要被部属在移动端。移动端的存储空间以及算力都有限,无法运行太大的模型,所以模型压缩这个概念就应运而生。本文简单介绍一下在算法(软件)层面的模型压缩方法和paper,不涉及硬件上的技巧。内容大多来自2020年李宏毅老师的课程。
目前在算法层面模型压缩主要有四个流派,简介如下:

Network Pruning

剪枝思想加入神经网络中。将网络中不重要的weight和neuron(网络中每层的层数)删除。

Knowledge Distillation

传说中的知识蒸馏。利用已经训练好的大模型来指导小模型。主要用在分类任务上。

Parameter Quantization

从数据存储角度节省空间,将存储参数的浮点数压缩为更小的单位,用更少的位来表示值。

Architecture Design

调整结构/使用特殊的结构来节省参数,后面再详细介绍。


Network Pruning

前面提到了删除不重要的weight和neuron。对于权重来说,他的范数(比如L1或L2)大小可以看出重要程度:范数太小,不重要。对于神经元,不同输入下的输出是0的频率可以看出重要程度:经常输出0,不重要。删完之后,对新的模型进行fine-tune。这是剪枝最基础的思路,具体每层剪几个,低于多少要剪掉不同paper有提出不同算法。注意可以迭代多次删除,不要一次删除太多。在实践中,删除神经元的方式更容易被执行计算。
下面两张图是对于剪枝降低了参数的示意图:


DNN

CNN

至于为什么不直接训练小的模型,因为大的网络容易训练,小的网络容易陷入局部最优,所以就把大网络裁剪成小网络而不是直接训练小网络。
当然可以剪枝的部分不限于weight和neuron,对于剪枝完之后模型的处理方法也有新的发现。下面给出相关的paper list:

Pruning Filters for Efficient ConvNets(ICLR 2017)
Learning Efficient Convolutional Networks Through Network Slimming(ICCV2017)
Filter Pruning via Geometric Median for Deep Convolutional Neural Networks Acceleration(CVPR2019)
The Lottery Ticket Hypothesis:Finding Sparse,Trainable Neural Networks(ICLR2019)
Rethinking the value of network pruning(ICLR2019)
Deconstructing Lottery Tickets:Zeros,Signs,and the Supermask(ICML2019)


Knowledge Distillation

通过已训练好的teacher模型训练student模型,指导/学习的过程在这里被抽象为蒸馏(distillation)。可以蒸馏模型的输出,直接匹配logits,或者蒸馏模型中间输出的特征feature,直接匹配feature或者学习feature如何转换 。
先说最经典的,对logits的蒸馏。结构如下图:


左边老师右边学生

至于为什么要在softmax前除T,paper给的解释是让softmax的输出更平滑(意为输入更加类似soft target,而不是one-hot那样的hard target)。知识蒸馏还有一个有趣的点就是让小的模型还学会了不同输出label间的关系,比如在mnist模型可以学会label1和7很相似。
对于logits distillation的研究还有Deep Mutual Learning,Born Again Neural Networks,Improved Knowledge Distiilation via Teacher Assistant等研究,在下面的paperlist也有列出。
接下来简单介绍feature distillation。


feature distillation中教师网络指导学生网络中间feature的产生

上面的logits distillation可以看出是直接对结果,对label进行指导/学习。feature distillation则是对中间feature进行指导/学习。上图的意思是,直接logits distillation那学生网络会无法理解,为什么label0和label8很像,只是知道他们很像,而加入feature distillation学生就可以通过中间过程理解,0有一个圈8有两个(当然图中的例子只是为了作者更好阐述这个模型)。
同时在feature distillation过程中,也可以加入注意力机制,让模型知道要学习feature中的那部分。
之前这些,都是针对一次采样,让学生和教师相似。也可以正对每次采样间的关系做知识蒸馏:Relational KD:
Relational KD

类似的研究还有Similarity-Preserving Knowledge Distiilation,下面是paper list:

Distilling the knowledge in a Neural Network(NIPS2014)
Deep Mutual Learning(CVPR2018)
Born Again Neural Networks(ICML2018)
Improved Knowledge Distiilation via Teacher Assistant(AAAI2020)
Paying More Attention to Attention:Improving the Performance of Convolutional Neural Networks via Attention Transfer(ICLR2017)
Relational Knowledge Distiilation(CVPR2019)
Similarity-Preserving Knowledge Distiilation(ICCV2019)


Parameter Quantization

可以用的方法有权重聚类,如下图:


weight clustering

也可以用一些经典的方法比如哈夫曼编码。
还有一种方法是使权重全都是+1或-1:


Binary Weights

Architecture Design

调整结构来节省参数的图示如下:


DNN中

对于卷积结构也类似,传统的卷积结构需要3x3x2x4=72个参数,而以下结构只需要18+8=26个:


Depthwise Separable Convolution

节省了参数,效果并不差

上图中的结构可以把参数从从k x k x I x O的参数降低到k x k x I+I x O。

著名的模型有SqueezeNet,MobileNet,ShuffleNet,Xception。

你可能感兴趣的:(模型压缩简述)