非结构化剪枝可获得更高的剪枝率与精度,但是其非结构化特征带来的随机连接使得往往需要专门的软、硬件设计来支持其推理加速,而在现有的边缘硬件上难以满足其应用条件。鉴于此,目前在剪枝领域的研究多集中在结构化剪枝上,如图1.11中所示,右侧三列均属于结构化剪枝的范畴,区别仅在于所选择的剪枝粒度不同。
在本文的研究中主要关注的是卷积核(Filter)剪枝,在一些工作中将与卷积核剪枝有同样效果的剪枝粒度称为通道(Channel)剪枝,两者的区别在于剪枝时所选用的评估指标不同,但剪枝之后最终呈现的效果依然是相同的。例如卷积核剪枝是直接评估卷积层中卷积核的重要性程度,随后剪去筛选出的不重要卷积核以及对应该卷积核的通道;而通道剪枝则是先根据某一评估指标筛选出不重要的通道,再剪去该不重要通道对应的卷积核,例如[103]、[105]以及[107]等工作均属于该类型。卷积核剪枝与Kernel剪枝也同样有联系,如前所述,卷积核剪枝首先会筛选出当前层中不同要的卷积核,随后剪枝,但需要注意到,该层的卷积核剪枝还会影响到下一层的卷积核中的Kernel,因为下一层卷积核的Kernel数是与上一层的输出通道数对应的,两者需要同时改变。
在结构化剪枝方案中,根据评估指标来源所划分的两类剪枝方法,即参数驱动的与数据驱动的方法,鉴于数据驱动的剪枝方案多依赖于训练数据,并根据不同的输入数据计算对应的梯度或损失值等来作为评估依据,相较于参数驱动的方法往往存在更多的计算;同时,参数驱动的方法大多从权值等模型自身数据特征的角度出发来衡量重要性,更符合在不同场景下的应用需求,因此本文研究的剪枝方法也属于参数驱动的剪枝方法。
上述关于评估指标的选择本质是在解决“怎么剪”的问题,而在确定评估指标后,则需求解决“剪多少”的问题。首选需要了解从全局与局部角度进行的剪枝方案划分,局部剪枝方案往往在同一层或同一模块内比较卷积核或通道的重要性;而全局剪枝从直接从整个模型的角度,来统一衡量重要性。两种方案中如何确定最终的剪枝结果,还与如何确定剪枝率的方法息息相关。例如在局部剪枝中,可以提前为所有待剪枝层设置一个固定的剪枝比例,也可以为每一层设置不同的剪枝比例,除了这种提前设置剪枝比例的,还可以根据稀疏后的实际情况,来计算剪枝比例;同样的,这些确定剪枝比例的方法均可应用在全局剪枝中。
待完成剪枝后,在多数剪枝方案中还需要进行微调来恢复模型的精度,但是往往恢复效果较差,或者需要长时间的微调才能得到较好的微调结果,但这种长时间的微调往往其实已经和重新训练并无区别了,因此如何缩短剪枝后的微调时间以及整个剪枝过程所需的时间都是需要优化的。综合上述关于结构化剪枝中的关键问题描述,可得到如图2.4所示的剪枝流程图,图中虚线表示可选。
图2.4 结构化剪枝经典流程图