深度学习在广泛应用于目标检测、分类等计算机视觉任务中。但这些应用往往需要很大的计算量和能耗。例如处理一张图片分类,VGG-16需要做150亿次计算,而YOLOv3需要执行390亿次计算。
这就带来一个问题,如何在低功耗的嵌入式系统或移动设备中部署深度学习呢?一种解决办法是将计算任务转移到云侧,但这并不能最终解决问题,因为许多深度学习应用程序需要在端侧进行计算,例如部署在无人机(通常会在断网情况下工作)或卫星上的应用。
1、参数量化和剪枝:通过减少用于存储DNN模型参数的比特数来降低内存和计算成本。
2、压缩卷积滤波器和矩阵分解:将大的DNN层分解成更小的层,以减少内存需求和冗余矩阵运算的数量。
3、网络架构搜索:自动构建具有不同层次组合的DNN,从而找到期望性能的DNN架构。
4、知识迁移与蒸馏:训练一个紧凑的DNN,来模仿一个计算量更大的DNN的输出、特征和激活。
这四种方法的介绍和优缺点如下图总结:
Goel等人的这篇综述除了对这些方法进行优缺点总结外,更提出了一些可能的改进措施,同事还提出了一套评估指标以便指导未来的研究。
一、参数量化和剪枝
内存访问对DNNs的能量消耗有重要影响。为了构建低功耗的DNNs,一个策略便是在性能和内存访问次数之间进行权衡。针对这一策略,目前有两种方法,一种是进行参数量化,即降低DNN参数的大小;另一种则是剪枝,从DNNs中删除不重要的参数和连接。
1、参数量化
有研究表明(Courbariauxet.al.)以不同位宽定点格式存储的参数进行训练,岁参数位宽减小,尽管测试误差有些微的增大(这种误差的变化几乎可以忽略不计),但能耗却能够大幅降低。如下图所示:
基于这种奠定性的研究,于是出现大量工作(例如LightNN、CompactNet、FLightNN等),它们在给定精度约束的情况下,尝试为DNN的参数寻找最佳位宽。甚至Courbariaux、Rastegari等人提出了二值化的神经网络。
为了进一步降低DNNs的内存需求,目前常采用的是参数量化和模型压缩结合的方法。例如Han等人首先将参数量化到离散的bin中,然后使用Huffman编码来压缩这些bin,从而使模型大小减少89%,而精度却基本不受影响。类似的,HashedNet会将DNN的连接量化到散列bucket中,这样散列到同一个bucket的连接就会共享同一个参数。不过这种方法需要很高的训练成本,因此它们的应用是有局限的。
优点:当参数的位宽减小时,DNNs的性能基本保持不变。这主要是因为约束参数在训练过程中具有正则化的效果。
缺点及改进方向:1)使用量化技术的DNNs,往往需要进行多次再训练,这使得训练耗能非常大,因此如何降低训练成本是这种技术必须要考虑的;2)DNNs中不同层对特征的敏感性是不同的,如果所有层的位宽都一样,就会导致性能变差,因此如何为每个连接层选择不同精度的参数是提升性能的关键一步,这可以在训练过程中进行学习。
2、剪枝
从DNNs中删除不重要的参数和连接可以减少内存访问次数。
Hessian加权变形测量法(Hessian-weighteddistortionmeasure)可以对DNN中参数的重要性进行评估,从而来去掉那些冗余参数,减小DNN模型大小,但这种基于测量的剪枝方法仅适用于全连接层。
为了将剪枝扩展到卷积层,许多学者各显神通。Anwar等人提出了粒子滤波的方法;Polyak等人将样本输入数据,并剪掉哪些稀疏激活的连接;Han等人使用一种新的损失函数来学习DNN中的参数和连接;Yu等人使用一种传播重要性分数的算法来测量每个参数相对于输出的重要性。
也有人试图将剪枝、量化和压缩同时应用到模型当中,将模型大小减小了95%。
图示:不同DNN的模型压缩率。其中P:Pruning,Q:Quantization,C:Compression.
优点:如上表所示,剪枝可以和量化、编码相结合,从而能够获得更加显著的性能收益。例如当三者一同使用时,VGG-16的大小能够降低到原来大小的2%。此外,剪枝能够减少DNN模型的复杂性,从而减少了过度拟合的情况。
二、压缩卷积滤波器和矩阵分解
在DNNs中卷积操作占了很大一部分,以AlexNet为例,其中的全连接层占了近89%的参数。因此若想降低DNNs的功耗,应当减少卷积层的计算量和全连接层的参数量。这也有两个技术方向,分别为:1)采用更小的卷积滤波器;2)将矩阵分解为参数量更小的矩阵。
1、压缩卷积滤波器
与较大的滤波器相比,较小的卷积滤波器具有更少的参数,计算成本也较低。
但如果将所有大的卷积层都替换掉,会影响DNN的平移不变性,这将降低DNN模型的精度。因此有人尝试去识别那些冗余的滤波器,并用较小的滤波器将它们替换掉。SqueezeNet正是这样一种技术,它使用了三种策略来将3×3的卷积转换成1×1卷积。
如上图所示,相比于AlexNet,SqueezeNet减少了98%的参数(当然操作数稍微变多了一些),而性能却并没有受到影响。
MobileNets在瓶颈层(bottlenecklayers)使用深度可分离卷积,来减少计算、延迟和参数量。在使用深度可分离卷积(epthwiseseparableconvolutions)时,通过保持较小的特征尺寸,并只扩展到较大的特征空间,从而实现了较高的精度。
优点:瓶颈卷积滤波器大大降低了DNNs的内存和延迟需求。对于大多数计算机视觉任务,这些方法能够获得SOTA性能。滤波压缩与剪枝和量化技术正交(互不影响),因此这三种技术可以一起使用,从而进一步降低能耗。
2、矩阵分解
通过将张量或矩阵分解为合积形式(sum-productform),将多维张量分解为更小的矩阵,从而可以消除冗余计算。一些因子分解方法可以将DNN模型加速4倍以上,因为它们能够将矩阵分解为更密集的参数矩阵,且能够避免非结构化稀疏乘法的局部性问题。
为了最小化精度损失,可以按层进行矩阵分解:首先对一层的参数进行因子分解,然后根据重构误差对后续的层再进行因子分解。但逐层优化的方法使得难以将这些方法应用到大型的DNN模型中,因为分解超参的数量会随着模型深度成指数增长。Wen等人使用了紧凑的核形状和深度结构来减少因子分解超参的数量。
优点:矩阵分解可以降低DNN的计算成本,无论在卷积层还是全连接层都可以使用相同的因子分解。
三、网络架构搜索
在设计低功耗计算机视觉程序时,针对不同的任务可能需要不同的DNN模型架构。但由于存在许多这种结构上的可能性,通过手工去设计一个最佳DNN模型往往是困难的。最好的办法就是将这个过程自动化,即网络架构搜索技术(NetworkArchitectureSearch)。
NAS使用一个递归神经网络(RNN)作为控制器,并使用增强学习来构建候选的DNN架构。对这些候选DNN架构进行训练,然后使用验证集进行测试,测试结果作为奖励函数,用于优化控制器的下一个候选架构。
NASNet和AmoebaNet证明了NAS的有效性,它们通过架构搜索获得DNN模型能够获得SOTA性能。
为了获得针对移动设备有效的DNN模型,Tan等人提出了MNasNet,这个模型在控制器中使用了一个多目标奖励函数。在实验中,MNasNet要比NASNet快2.3倍,参数减少4.8倍,操作减少10倍。此外,MNasNet也比NASNet更准确。
不过,尽管NAS方法的效果显著,但大多数NAS算法的计算量都非常大。例如,MNasNet需要50,000个GPU时才能在ImageNet数据集上找到一个高效的DNN架构。
优点:NAS通过在所有可能的架构空间中进行搜索,而不需要任何人工干预,自动平衡准确性、内存和延迟之间的权衡。NAS能够在许多移动设备上实现准确性、能耗的最佳性能。
四、知识迁移和蒸馏
大模型比小模型更准确,因为参数越多,允许学习的函数就可以越复杂。那么能否用小的模型也学习到这样复杂的函数呢?
一种方式便是知识迁移(KnowledgeTransfer),通过将大的DNN模型获得的知识迁移到小的DNN模型上。为了学习复杂函数,小的DNN模型会在大的DNN模型标记处的数据上进行训练。其背后的思想是,大的DNN标记的数据会包含大量对小的DNN有用的信息。例如大的DNN模型对一个输入图像在一些类标签上输出中高概率,那么这可能意味着这些类共享一些共同的视觉特征;对于小的DNN模型,如果去模拟这些概率,相比于直接从数据中学习,要能够学到更多。
优点:基于知识迁移和知识蒸馏的技术可以显著降低大型预训练模型的计算成本。有研究表明,知识蒸馏的方法不仅可以在计算机视觉中应用,还能用到许多例如半监督学习、域自适应等任务中。
缺点及改进方向:知识蒸馏通常对学生和教师的结构和规模有严格的假设,因此很难推广到所有的应用中。此外目前的知识蒸馏技术严重依赖于softmax输出,不能与不同的输出层协同工作。作为改进方向,学生可以学习教师模型的神经元激活序列,而不是仅仅模仿教师的神经元/层输出,这能够消除对学生和教师结构的限制(提高泛化能力),并减少对softmax输出层的依赖。
五、讨论
1)量化和降低参数精度可以显著降低模型的大小和算术运算的复杂度,但大多数机器学习库很难手工实现量化。英伟达的TensorRT库为这种优化提供了一个接口。
2)在优化大型预训练DNN时,剪枝和模型压缩是有效的选择。
3)当从零开始训练一个新的DNN模型时,应该使用压缩卷积滤波器和矩阵分解来减少模型的大小和计算量。
4)NAS可以用来寻找针对单个设备的最优DNN模型。具有多个分支的DNN(如Proxyless-NAS,MNasNet等)常需要昂贵的内核启动以及GPU、CPU同步。
5)知识蒸馏能够应用到中小型数据集,因为这对学生和教师的DNN架构要求的假设较少,能够有更高的准确性。