模型压缩是一种在移动设备上高效部署神经网络模型的关键技术,移动设备仅有有限的计算资源和紧凑的功率预算。常规的模型压缩技术依靠手工制作的启发式方法和基于规则的策略,这些策略要求领域专家探索在模型大小,速度和准确性之间进行权衡的大型设计空间,这通常是次优且耗时的。在本文中,我们提出了用于模型压缩(AMC)的AutoML,该模型利用强化学习来提供模型压缩策略。这种基于学习的压缩策略具有更高的压缩率,更好地保留了准确性并释放了人工,从而优于常规的基于规则的压缩策略。在减少4倍FLOP的情况下,与ImageNet上VGG-16的手工模型压缩策略相比,我们的精度提高了2.7%。我们将此自动化的压缩技术应用于MobileNet,在Android手机上实现了1.81倍的实测推理延迟加速,在Titan XP GPU上实现了1.43倍加速,而ImageNet Top-1精度损失仅为0.1%
在许多机器学习应用程序中,例如机器人技术,自动驾驶汽车和推荐系统,深度神经网络受到等待时间,能量和模型尺寸预算的限制。 已经提出了许多通过模型压缩来提高神经网络的硬件效率的方法。 模型压缩技术的核心是确定每层的压缩策略,因为它们具有不同的冗余度,这通常需要手工制作的启发法和领域专业知识来探索在模型大小,速度和准确性之间进行权衡的大型设计空间。 设计空间是如此之大,以至于人类的启发式方法通常不是最佳选择,而手动模型压缩则非常耗时。 为此,我们旨在自动找到任意网络的压缩策略,以实现比人工设计的基于规则的模型压缩方法更好的性能。
以前,有很多基于规则的模型压缩启发式方法。例如,在第一层中减少参数,减少提取低级特征并具有最少数量的参数;在FC层中剪枝更多参数,因为FC层具有最多的参数;但是,由于深度神经网络中的层不是独立的,因此这些基于规则的剪枝策略不是最优的,并且不会从一种模型转移到另一种模型。神经网络体系结构发展迅速,我们需要一种自动方式来对其进行压缩以提高工程师的效率。随着神经网络的不断深入,设计空间将具有指数复杂性,这是无法通过基于规则的贪婪方法来解决的。因此,我们提出了用于模型压缩(AMC)的AutoML,该模型利用强化学习来自动采样设计空间并提高模型压缩质量。图1说明了我们的AMC引擎。压缩网络时,我们的AMC引擎通过基于学习的策略来自动化此过程,而不是依赖于基于规则的策略和经验丰富的工程师。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gPa15g3I-1576474190446)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1576197927510.png)]
我们观察到,压缩模型的准确性对每一层的稀疏度非常敏感,因此需要一个细粒度的动作空间。因此,我们没有在离散空间上进行搜索,而是提出了一种使用DDPG 代理的连续压缩比控制策略,以通过反复试验来学习:惩罚精度损失,同时鼓励模型缩小和加速。行为者批评结构还有助于减少差异,促进更稳定的训练。具体来说,我们的DDPG代理以分层方式处理网络。对于每个层Lt,代理接收一个嵌入st的层,该st编码该层的有用特性,然后输出精确的压缩比at。在Lt压缩了层Lt之后,代理将移动到下一层Lt + 1。在没有微调的情况下评估剪枝了所有层的剪枝模型的验证精度,这是微调精度的有效代表。这种简单的近似方法可以缩短搜索时间,而不必重新训练模型,并提供高质量的搜索结果。策略搜索完成后,对最佳探索的模型进行微调以获得最佳性能。
我们针对不同的场景提出了两种压缩策略搜索规则。对于更关注延迟的AI应用程序(例如,移动应用程序,自动驾驶汽车和推荐),在硬件资源(例如FLOP,延迟和模型大小)最大的情况下,我们使用资源受限的压缩以实现最佳精度,对于延迟不是硬约束的质量至关重要的AI应用程序(例如Google Photos),我们提出了精度保证的压缩方法,以实现最小的模型而不会损失精度。我们通过限制搜索空间来实现资源受限的压缩,其中限制了操作空间(剪枝率),以使由代理压缩的模型始终低于资源预算。为了保证准确性,我们定义了一种奖励,它是准确性和硬件资源的函数。使用此奖励功能,我们可以探索压缩的极限而不会损害模型的准确性。为了证明其广泛的通用性,我们在包括VGG ,ResNet 和MobileNet 在内的多个神经网络上评估了AMC引擎,并且还测试了压缩模型从分类到对象的泛化能力。检测。大量实验表明,AMC提供的性能优于手工启发式策略。对于ResNet-50,我们将专家调整的压缩比从3.4倍提高到5倍,而不会降低精度。此外,我们将MobileNet的FLOP减少了2倍,达到了最高的70.2%的准确度,这比0.75 MobileNet的帕累托曲线更好,在Titan XP上的速度提高了1.53倍,在一部Android手机上的速度提高了1.95倍。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MQUgi5Ey-1576474190448)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1576198465936.png)]
我们在图1中概述了我们的AutoML for Model Compression(AMC)引擎。我们的目标是自动发现每个层的冗余,其特征是稀疏性。 我们训练一个强化学习代理来预测动作并给出稀疏性,然后执行剪枝。 我们会在剪枝之后微调之前快速评估准确性,以此作为最终准确性的有效代表。 然后,我们通过鼓励使用更小,更快和更准确的模型来更新代理。
模型压缩是通过减少参数的数量和深度神经网络中每一层的计算来实现的。 剪枝分为两类:细粒度剪枝和结构化剪枝。 细粒度剪枝的目的是剪枝重量张量中的各个不重要元素,这可以实现非常高的压缩率而不会损失准确性。 但是,这样的算法导致稀疏的不规则模式,并且需要诸如EIE之类的专用硬件来加速。 粗粒度/结构化剪枝旨在剪枝权重张量的整个规则区域(例如,通道,行,列,块等)。 剪枝后的权重是常规的,可以直接使用现成的硬件和库进行加速。 在这里,我们研究结构化剪枝,该结构剪枝缩小了每个卷积和完全连接层的输入通道。
我们的目标是精确找出每层的有效稀疏度,这在以前的研究中通常是手动确定的。 以卷积层为例。 权重张量的形状为 n ∗ c ∗ k ∗ k n *c *k*k n∗c∗k∗k,其中n、 c是输出和输入通道,k是卷积核大小。 对于细粒度剪枝,稀疏度定义为零元素的数量除以总元素的数量,即 # z e r o s / ( n ∗ c ∗ k ∗ h ) #zeros /(n*c*k*h) #zeros/(n∗c∗k∗h)。 对于通道剪枝,我们将权重张量缩小为 n × c ′ × k × k n×c'×k×k n×c′×k×k(其中 c ′ < c c'
AMC利用强化学习来有效地搜索动作空间。 在这里,我们介绍强化学习框架的详细设置。
状态空间 对于每个层t,我们有11个表征状态 s t s_t st的特征:
( t , n , c , h , w , s t r i d e , k , F L O P s [ t ] , r e d u c e d , r e s t , a t − 1 ) (t,n,c,h,w,stride,k,FLOPs[t],reduced,rest,a_{t-1}) (t,n,c,h,w,stride,k,FLOPs[t],reduced,rest,at−1)
t是层的序号,卷积核的维度为 n ∗ c ∗ k ∗ k n *c *k*k n∗c∗k∗k,输入维度为 c ∗ h ∗ w c*h*w c∗h∗w, F L O P s [ t ] FLOPs[t] FLOPs[t]为第t层的计算量,Reduced是前一层留下来的计算量,Rest是留给下一层的计算量。在传给代理之前,他们被归一化为[0,1]。这些特征是代理识别每一个卷积层的基础信息。
动作空间 现有的大多数研究成果都使用离散空间作为粗粒度的动作空间(例如,通道数常被设为 { 64 , 128 , 256 , 512 } \{64,128,256,512\} { 64,128,256,512})。 对于高精度的模型体系结构搜索,粗略的动作空间可能不是问题。 但是,我们观察到模型压缩对稀疏率非常敏感,并且需要细粒度的动作空间,从而导致离散动作数量激增(第4.2节)。 如此大的动作空间很难有效地探索。 离散化也放弃了顺序:例如,稀疏性10%比20%更具侵略性,远比30%更具侵略性。 因此,我们建议使用连续动作空间 α ∈ ( 0 , 1 ] \alpha \in (0,1] α∈(0,1],这样可以实现更细粒度和更精确的压缩。
DDPG代理 如图1所示,代理从环境中接收层 L t L_t Lt的嵌入状态 s t s_t st,然后输出稀疏率 α t \alpha_t αt作为动作。 使用指定的压缩算法(例如,通道剪枝),以及压缩率 α t \alpha_t αt(舍入为最接近的可行分数)来压缩底层。 然后,代理移动到下一层 L t + 1 L_{t+1} Lt+1,并接收状态 s t + 1 s_{t+1} st+1。 在完成最后一层 L t L_t Lt之后,将在验证集上评估准确性并将其返回给代理。 为了快速探索,我们在不进行微调的情况下评估了准确性,这是对微调精度的良好近似(第4.1节)。
我们使用深度确定性策略梯度(DDPG)来连续控制压缩比,这是一种脱离策略的执行者评判算法(off-policy actor-critic algorithm)。 对于探索噪声过程,我们使用截断正态分布:
μ ′ ( s t ) ∼ T N ( μ ( s t ∣ θ t μ ) , σ , 0 , 1 ) \mu'(s_t)\sim TN(\mu(s_t|\theta_t^\mu),\sigma,0,1) μ′(st)∼TN(μ(st∣θtμ),σ,0,1)
在探索过程中,噪声σ初始化为0.5,并且在每个部分之后呈指数衰减。 按照采用了Bellman方程的变体形式的Block-QNN,部分中的每个变化都是 ( s t , a t , R , s t + 1 ) (s_t, a_t,R,s_{t+1}) (st,at,R,st+1),其中R是网络被压缩后的奖励。 在更新期间,减去基线奖励b以减小梯度估计的方差,该梯度估计是先前奖励的指数移动平均值:
L o s s = 1 N ∑ i ( y i − Q ( s i , a i ∣ ∣ θ Q ) ) 2 y i = r i − b + γ Q ( s i + 1 , μ ( s i + 1 ∣ θ Q ) ) Loss = \frac1N\sum_i(y_i-Q(s_i,a_i||\theta^Q))^2 \\ y_i = r_i-b+\gamma Q(s_{i+1},\mu(s_{i+1}|\theta^Q)) Loss=N1i∑(yi−Q(si,ai∣∣θQ))2yi=ri−b+γQ(si+1,μ(si+1∣θQ))
折扣系数γ设置为1以避免短期奖励的优先级过高。
资源受限的压缩 通过限制动作空间(每一层的稀疏率),我们可以准确地达到目标压缩率。 根据研究成果[57,4,54] ,我们使用以下奖励:
R e r r = − E r r o r R_{err} = -Error Rerr=−Error
该奖励对减少模型尺寸没有任何激励作用,因此我们通过另一种方式来实现目标压缩率:限制动作空间。 以减少模型大小的细粒度剪枝为例:我们允许在前几层进行任意操作; 当我们发现即使在使用最积极的策略压缩以下所有层之后资源预算仍不够时,我们就开始限制操作a。 算法1说明了该过程。 (对于通道剪枝,代码将更长但相似,因为删除 L t L_t Lt层的输入通道还将删除 L t − 1 L_{t-1} Lt−1的相应输出通道,从而减少了两层的参数/ FLOP)。 再次注意,我们的算法不仅限于约束模型大小,还可以由其他资源(例如FLOP或移动设备上的实际推断时间)代替。 根据我们的实验(第4.1节),由于代理没有收到低于预算的诱因,因此可以精确地达到目标压缩率。
精度保证的压缩
通过调整奖励函数,我们可以准确地找出不损失准确性的压缩极限。 我们凭经验观察到, E r r o r Error Error与 l o g ( F L O P s ) log(FLOP s) log(FLOPs)或 l o g ( # P a r a m ) log(\#Param) log(#Param)成反比。 为此,我们设计了以下奖励函数:
R F L O P s = − E r r o r ∗ l o g ( F L O P s ) R P a r a m = − E r r o r ∗ l o g ( # P a r a m ) R_{FLOPs}=-Error*log(FLOPs)\\R_{Param}=-Error*log(\#Param) RFLOPs=−Error∗log(FLOPs)RParam=−Error∗log(#Param)
此奖励函数对错误敏感; 同时,它为减少FLOP或模型尺寸提供了小小的动力。 根据图4.1中的实验,我们注意到我们的代理会自动找到压缩极限。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uhxtgcgL-1576474190449)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1576202391679.png)]
对于细粒度剪枝,我们将权重最小化。卷积层的最大稀疏比 α m a x \alpha_{max} αmax设置为0.8,全连接层的最大稀疏比 α m a x \alpha_{max} αmax设置为0.98。对于通道剪枝,我们使用最大响应选择(根据幅度剪枝权重),并在剪枝过程中保留BN层,而不是将它们合并为卷积层。所有层的最大稀疏比 α m a x \alpha_{max} αmax被设置为0.8。请注意,手动上限 α m a x \alpha_{max} αmax仅用于更快的搜索,可以简单地使用 α m a x = 1 \alpha_{max}=1 αmax=1 来产生相似的结果。我们的执行网络µ具有两个隐藏层,每个隐藏层包含300个单位。最终的输出层是一个sigmoid层,用于限制(0,1)内的动作。我们的评判网络Q也有两个隐藏层,每个都有300个单位。第二隐藏层中包含的动作arr。我们使用τ= 0.01进行软目标更新,并以64作为批处理大小和2000作为重播缓冲区大小来训练网络。我们的代理首先探索100个具有恒定噪声σ= 0.5的情形,然后研究300个具有指数衰减的噪声σ的情形。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-02t0SY89-1576474190450)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1576205939731.png)]
我们进行了广泛的实验,并对CIFAR-10上的AMC进行了全面分析,以验证这两种搜索协议的有效性。 CIFAR数据集由10个类别的50k训练和10k测试的32×32小图像组成。 我们将训练图像分为45k / 5k训练/验证。 在验证图像上获得准确性奖励。 我们的方法计算效率高:RL可以在单个GeForce GTX TITAN Xp GPU上在1小时内完成搜索。 FLOPs受限的压缩 我们使用通道剪枝在CIFAR-10上进行了FLOP约束的实验。 我们将我们的方法与图2中所示的三个经验策略进行了比较:均匀地统一压缩比率,浅层方法和深层方法分别主动剪枝浅层和深层。 基于不同网络的稀疏分布,可以选择不同的策略。在表2中,我们展示了使用奖励Rerr准确找到Plain-20和ResNet-56剪枝50%的稀疏率并将其与经验策略进行比较。 我们在很大程度上优于经验政策。 AMC发现的最佳剪枝设置不同于手工启发式设置(图2)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M6osYwfi-1576474190452)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1576206392454.png)]
保证精度的压缩 通过使用 R P a r a m R_{Param} RParam奖励,我们的代理可以自动找到压缩极限,并且模型尺寸最小且性能损失很小。 如表2所示,我们在CIFAR-10上使用细粒度剪枝压缩ResNet-50。 我们获得的结果具有高达60%的压缩率,在验证集和测试集上的准确性更高,这可能是由于剪枝的正则化效果所致。由于我们的奖励 R P a r a m R_{Param} RParam专注于错误,并且同时几乎没有压缩的驱动力,因此它更喜欢具有无损精度压缩的高性能模型。 为了缩短搜索时间,我们无需验证即可使用验证准确性获得奖励。 我们认为,如果报酬是微调的准确性,则代理应该更积极地压缩,因为微调的准确性非常接近原始准确性。
搜索的加速策略 微调剪枝的模型通常需要很长时间。 我们观察到预微调精度和后微调精度之间的相关性。 如表2所示,获得更高验证精度的策略相应地具有更高的微调精度。 这使我们能够在不进行微调的情况下预测最终模型的准确性,从而可以高效,快速地进行政策探索。 验证集和测试集是分开的,并且我们仅使用验证集在强化学习期间生成奖励。 另外,压缩模型具有较少的参数。 如表2所示,测试精度和验证精度非常接近,表明没有过度拟合。
在ImageNet上,我们使用训练集中的3000张图像来评估奖励功能,以防止过度拟合。 在整个实验过程中,使用224×224输入来测量延迟时间。
推动细粒度剪枝的极限 细粒度剪枝方法基于单个连接剪枝神经网络,以实现权重和激活方面的稀疏性,这可以实现更高的压缩率,并且可以使用诸如EIE的专用硬件进行加速。 但是,它需要迭代剪枝和微调过程以实现良好的性能,并且未经重训练的单次剪枝将大幅度降低大压缩率(例如4倍)的预测准确性,这无法为强化学习提供有用的监督代理。
为了解决这个问题,我们按照[16]中的设置进行了4次剪枝和微调实验,其中完整模型的总体密度在[16]中设置为[50%,35%,25%和20%]每次迭代。对于每个阶段,我们运行AMC来确定给定整体稀疏度的每一层的稀疏率。然后按照通用协议对模型进行剪枝和微调30epochs。利用该框架,我们可以将ImageNet上ResNet-50的专家调整的压缩比从3.4提升到5倍(见图4),而不会损失ImageNet的性能(原始ResNet50的[top-1,top- 5]精度= [76.13%,92.86%]; AMC剪枝模型的精度= [76.11%,92.89%])。每个阶段的每个层的密度如图3所示。峰值和波峰表明RL代理会自动学习剪枝稀疏度较大的3×3卷积层,因为它们通常具有较大的冗余度。而剪枝更紧凑的1×1卷积且稀疏度较低。图4提供了每个块的密度统计。我们可以发现AMC的密度分布与[16]表3.8中的人类专家的结果有很大的不同,这表明AMC可以充分探索设计空间并更好的分配稀疏性。
与启发式通道剪枝的比较 在这里,我们将AMC与现有的最先进的通道剪枝方法进行比较:FP,RNP和SPP。所有方法都提出了启发式策略来设计每一层的剪枝率。 FP提出了一种敏感的分析方案,通过评估单层剪枝的准确性来估计每一层的灵敏度。敏感性较低的图层将被更积极地剪枝。这种方法假设可以将不同剪枝层的误差线性地求和,这在我们的实验中并不成立。 RNP将所有卷积通道分为4组,并训练RL代理根据输入图像确定4组。但是,操作空间非常粗糙(每层只有4个操作),并且无法减小模型大小。 SPP将PCA分析应用于每一层,并以重建误差作为敏感性度量来确定剪枝率。这种分析是基于单个层进行的,没有考虑层之间的相关性。我们还将我们的方法与原始通道剪枝纸(表3中的CP)进行了比较,在这种情况下,剪枝过的VGG-16的稀疏率由人类专家精心调整(跳过了conv5,对conv4和剩余层的稀疏率是1:1.5)。剪枝后的VGG-16的结果显示在表3中。与我们的CIFAR-10实验(第4.1节)一致,AMC在所有启发式方法方面的表现均超过0.9%,在不进行任何人工操作的情况下,击败了人类专家0.3%。
**加速移动端推理 **
常规的模型压缩技术使用人工手动压缩的方式,并且需要领域专家探索较大的设计空间,并在模型大小,速度和准确性之间进行权衡,而这通常是次优且费时的。 在本文中,我们提出了用于模型压缩的AutoML(AMC),该模型利用增强学习自动搜索设计空间,从而大大提高了模型压缩质量。 我们还设计了两种新颖的奖励方案来执行资源受限的压缩和准确性保证的压缩。 Cifar和ImageNet上的MobileNet,MobileNet-V2,ResNet和VGG已证明了令人信服的结果。 从分类到检测任务,压缩后的模型可以很好地概括。 在Google Pixel 1手机上,我们将MobileNet的推理速度从8.1 fps提升到16.0 fps。 AMC有助于在移动设备上进行高效的深度神经网络设计。
DDPG代理输出的是一个压缩率,为什么仅仅依靠指导压缩率就能达到一个很好的剪枝效果?
具体使用的剪枝方法是什么?不需要用强化学习来指导具体剪掉哪些通道或者哪些元素吗?