system: [SYSTEM]

user: 3. GreedyPruner 假设待剪枝的深度卷积神经网络共有l层，本文将模型压缩问题定义为公式(1)： { ( c 1 ， c 2 ， ⋯ ， c l ) * = a r g m a x   a c c ( M ( c 1 ， c 2 ， ⋯ ， c l ; W ) ; T t e s t ) ， c i ∈ { α c i | α ∈ { 10 % ， 20 % ， ⋯ ， 100 % } } ， s . t   C o s t ( c 1 ， c 2 ， ⋯ ， c l ) < c o n s t r a i n t . (1) 其中，M是通道数为 ( c 1 ， c 2 ， ⋯ ， c l ) 的网络模型，W是卷积核权重，constraint硬件限制。网络剪枝的目的是在硬件限制为constraint的情况下，获得较优的网络模型。然而，直接对公式(1)求解是困难的，且容易陷入局部最优解。为了解决这个问题，本文提出了GreedyPruner，该算法可以将公式(1)的优化问题巧妙地转化为SuperNet的训练。训练后，可以直接从精度队列和压缩池中获得较优的网络结构，而无需任何搜索算法。整个过程简单、高效、可以获得较高的剪枝率。 3.1. SuperNet的结构 为了对公式(1)进行求解，本文构造了一个SuperNet。共享通道块是构建SuperNet的基本结构，图1给出了不同网络结构的共享通道块构建方式。如2.1节所述，本文对解空间做了限制。在设计SuperNet时为卷积层的每一个可行解都设计一个共享通道块，共10个。分别代表保留原卷积核通道数的10%，20%，……，100%。在同一时间内每个卷积层只能有一个共享通道块被激活。如图2所示，对SuperNet的每一个卷积层都进行一次通道块采样便可得到一条路径。图2中所有的红色通道块组成一条路径，所有的黄色通道块组成另一条路径。每条路径代表解空间中的一个网络结构。对于一个L层的网络模型，通过共享通道块，我们仅仅需要使用10 L个通道块，就可以表示全体解空间。 网络构建完成后，SuperNet的输入为代表网络结构的编码向量，通过一次推理就可以得到该网络结构在验证集上的准确率，如公式(2)所示。因为不需要重训练，所以可以通过SuperNet快速预测任一网络结构对应的性能。 a c c = S u p e r N e t ( c 1 ， c 2 ， ⋯ ， c l ; T v a l ) (2) 图2. SuperNet的网络结构 3.2. SuperNet的预训练 本文希望通过SuperNet预测的网络性能与真实的网络性能差距越小越好，这意味着SuperNet中通道块的权值应尽可能的接近真实的权值。在训练过程中，SuperNet中的每一个通道块都被平等的训练。因此本文提出了路径平等策略预训练SuperNet。 在前向传播中，随机生成一个编码向量(表示网络结构的每层通道数)作为SuperNet的输入，与编码向量对应的通道块被激活，其他通道块处于失活状态，每训练一个batchsize，编码向量更新一次。在反向传播中，SuperNet仅更新所选路径上通道块的权值。其它通道块的权值并不发生改变。通过这种方法，迭代一定次数后，所有的通道块都会得到平等的训练。即使某条路径没有被训练过，但是构成这条路径的通道块也一定在以往的迭代中被训练。 预训练完成后，此时的SuperNet不在是传统意义上的网络，而是在特定解空间下的网络性能评估器。SuperNet就相当于一个有向无环图，图中的每一条路径代表压缩后的网络结构，在验证集上对网络性能进行评估时，只需要一次前向传播，就可以大致预测网络性能，省去了传统方法的重训练。 3.3. SuperNet的二次训练 为了使SuperNet能够对解空间中的所有路径进行粗略的评估，本文基于通道块平等策略提出随机采样路径的方法对SuperNet预训练。但是，网络剪枝的目的是满足一定约束条件下，在解空间中找到性能最优的网络结构。因为SuperNet是基于共享通道块的，对性能较差路径上的通道块进行训练可能会反过来影响性能较好路径上的通道块。因此本文又提出对SuperNet进行二次训练，阻止性能较差路径的训练，贪婪的训练性能较好的路径。本文在路径评估时引入平衡因子，在模型剪枝率和准确率上做了平衡，防止准确率很高但压缩率很低这一现象的出现。二次训练结束后，可以直接从候选队列和压缩池中获得最优的网络结构，不需要使用智能优化算法进行搜索。 在二次训练中，网络结构的评估函数为： p r e = μ ∗ a c c + ( 1 − μ ) ∗ r a t i o (3) 其中：ratio为修剪后网络结构的压缩率。在公式(3)中引入参数 μ 作为平衡因子，为算法提供两种压缩模式； 1) 高精度模式( μ ≥ 0.5 )：压缩后网络结构的性能以精度为主，允许较小压缩率的网络结构出现。 2) 高压缩率模式( μ < 0.5 )：压缩后网络结构的性能以剪枝率为主，允许有较大的精度损失。 假设解空间中所有网络结构的性能已知，对所有网络性能进行排序，并定义前k条路径为好路径(good path)，剩下的路径为差路径(bad path)。进行二次训练的目的是对SuperNet中的好路径进行训练，拒绝差路径的训练需求。但是，并不知道哪些路径属于好路径，使用公式(2)对超网络的每一条路径都求解显然是不可接受的。因此本文创建精度队列，通过衰减的 ϵ -greedy算法从SuperNet中对路径进行采样，将每次采样中的前k条路径放入精度队列中，使精度队列可以近似代表好路径。 初始化时，精度队列为空，从SuperNet中随机采样m条路径，对这m条路径进行评估，根据评估结果进行排序，将前k条路径当作好路径放入候选池中。评估时从测试集中固定选取10%样本，对m条路径进行测试，因为只选取测试集样本的1/10，所以基本不会对训练速度造成影响。从第二轮迭代开始，精度队列中已经存在路径，我们认为精度队列的路径都是好路径。但为了保证可以对SuperNet中的路径进行充分探索，本文以 ϵ 的概率从SuperNet中抽取路径，以( 1 − ϵ )的概率从精度队列中抽取路径， ϵ 的值随着训练的进行动态改变。初始时候选队列为空， ϵ = 1 ，随着训练的进行，精度队列不断向好路径空间靠拢，此时，减小 ϵ 的值，贪婪的训练精度队列中的好路径，当 ϵ 减少到一定程度时， ϵ 的值不再发生改变。随着训练的进行，我们就会将主要的训练从全体搜索空间贪婪地转移到候选队列中。 考虑到硬件的要求，精度队列并不是无限大的。在迭代的过程中将k条路径加入精度队列，会出现两种情况：1) 精度队列未满，这时我们取k条路径中不在精度队列里出现的路径，加入精度队列；对原先已经存在精度队列中路径的评估值进行更新；2) 若候选队列已满，对精度队列中性能不佳(评估值较低)的后k条路径进行更新，删除原有的路径加入新的路径。 在GreedyPruner中，允许高压缩率但精度稍微降低的网络架构的存在，为了更好地探索较高压缩率的网络架构，我们设置压缩池，每轮训练时，将m条路径中压缩率最高的两条路径放入压缩池中，每隔n轮对压缩池中的路径进行训练。这样可以保证高压缩率的路径也会得到充分训练。与以往的剪枝算法不同，二次训练结束后，只需要从候选队列和压缩池中取性能最好的网络结构进行权值微调，便可得到最终剪枝的网络模型，不在需要使用智能搜索算法。GreedyPruner整个过程，简单高效，不在需要人类专家的干预，得到的修剪模型也是较优的。 3.4. GreedyPruner的整体流程 GreedyPruner的算法流程如下所示： 1、根据要剪枝的网络模型，搭建SuperNet； 2、对SuperNet进行预训练； 3、对SuperNet进行二次训练； 4、从精度队列和压缩池最性能最优的网络结构，进行权值微调得到最终的修剪模型。 更具体地说： SuperNet的预训练： SuperNet的二次训练：