0
深度学习在广泛应用于目标检测、分类等计算机视觉任务中。但这些应用往往需要很大的计算量和能耗。例如处理一张图片分类,VGG-16需要做 150亿次计算,而YOLOv3需要执行390亿次计算。
这就带来一个问题,如何在低功耗的嵌入式系统或移动设备中部署深度学习呢?一种解决办法是将计算任务转移到云侧,但这并不能最终解决问题,因为许多深度学习应用程序需要在端侧进行计算,例如部署在无人机(通常会在断网情况下工作)或卫星上的应用。
从2016年起,业界便开始探索模型加速和小型化的研究,也提出了大量小型化方案。这些技术可以消除DNNs中的冗余,可将计算量减少75%以上,推理时间减少50%以上,而同时能够保证精度无损。但要想大规模地在端侧部署DNNs模型,仍然还需要继续优化。
欲砥砺前行,还需要看下当前情况下低功耗计算机视觉的研究进展如何。普渡大学的Abhinav Goel 等人近日针对这一领域的研究进展(主要关注DNN推理,而非训练)做了值得参照的综述。
论文链接:https://arxiv.org/pdf/2003.11066
在这篇文章中,Goel等人将低功耗推理方法分为四类,分别为:
1、参数量化和剪枝:通过减少用于存储DNN模型参数的比特数来降低内存和计算成本。
2、压缩卷积滤波器和矩阵分解:将大的DNN层分解成更小的层,以减少内存需求和冗余矩阵运算的数量。
3、网络架构搜索:自动构建具有不同层次组合的DNN,从而找到期望性能的DNN架构。
4、知识迁移与蒸馏:训练一个紧凑的DNN,来模仿一个计算量更大的DNN的输出、特征和激活。
这四种方法的介绍和优缺点如下图总结:
Goel等人的这篇综述除了对这些方法进行优缺点总结外,更提出了一些可能的改进措施,同事还提出了一套评估指标以便指导未来的研究。
内存访问对DNNs的能量消耗有重要影响。为了构建低功耗的DNNs,一个策略便是在性能和内存访问次数之间进行权衡。针对这一策略,目前有两种方法,一种是进行参数量化,即降低DNN参数的大小;另一种则是剪枝,从DNNs中删除不重要的参数和连接。
有研究表明(Courbariaux et. al.)以不同位宽定点格式存储的参数进行训练,岁参数位宽减小,尽管测试误差有些微的增大(这种误差的变化几乎可以忽略不计),但能耗却能够大幅降低。如下图所示:
基于这种奠定性的研究,于是出现大量工作(例如LightNN、CompactNet、FLightNN等),它们在给定精度约束的情况下,尝试为DNN的参数寻找最佳位宽。甚至Courbariaux、Rastegari等人提出了二值化的神经网络。
为了进一步降低DNNs的内存需求,目前常采用的是参数量化和模型压缩结合的方法。例如Han等人首先将参数量化到离散的bin中,然后使用Huffman编码来压缩这些bin,从而使模型大小减少89%,而精度却基本不受影响。类似的,HashedNet会将DNN的连接量化到散列 bucket 中,这样散列到同一个bucket的连接就会共享同一个参数。不过这种方法需要很高的训练成本,因此它们的应用是有局限的。
优点:当参数的位宽减小时,DNNs的性能基本保持不变。这主要是因为约束参数在训练过程中具有正则化的效果。
缺点及改进方向:1)使用量化技术的DNNs,往往需要进行多次再训练,这使得训练耗能非常大,因此如何降低训练成本是这种技术必须要考虑的;2)DNNs中不同层对特征的敏感性是不同的,如果所有层的位宽都一样,就会导致性能变差,因此如何为每个连接层选择不同精度的参数是提升性能的关键一步,这可以在训练过程中进行学习。
从DNNs中删除不重要的参数和连接可以减少内存访问次数。
Hessian加权变形测量法(Hessian-weighted distortion measure)可以对DNN中参数的重要性进行评估,从而来去掉那些冗余参数,减小DNN模型大小,但这种基于测量的剪枝方法仅适用于全连接层。
为了将剪枝扩展到卷积层,许多学者各显神通。Anwar等人提出了粒子滤波的方法;Polyak等人将样本输入数据,并剪掉哪些稀疏激活的连接;Han等人使用一种新的损失函数来学习DNN中的参数和连接;Yu等人使用一种传播重要性分数的算法来测量每个参数相对于输出的重要性。
也有人试图将剪枝、量化和压缩同时应用到模型当中,将模型大小减小了95%。
图示:不同DNN的模型压缩率。其中P: Pruning, Q: Quantization, C: Compression.
优点:如上表所示,剪枝可以和量化、编码相结合,从而能够获得更加显著的性能收益。例如当三者一同使用时,VGG-16的大小能够降低到原来大小的2%。此外,剪枝能够减少DNN模型的复杂性,从而减少了过度拟合的情况。
缺点及改进方向:同样,剪枝也会带来训练时间的增加。如上表,同时使用剪枝和量化,训练时间增加了600%;如果使用稀疏约束对DNN进行剪枝时,这个问题会更加严重。此外,剪枝的优点,只有当使用自定义硬件或用于稀疏矩阵的特殊数据结构时才会显现出来。因此相比于现在的连接剪枝技术,Channel级的剪枝可能是一个改进方向,因为它不需要任何特殊的数据结构,也不会产生矩阵稀疏。
在DNNs中卷积操作占了很大一部分,以AlexNet为例,其中的全连接层占了近89%的参数。因此若想降低DNNs的功耗,应当减少卷积层的计算量和全连接层的参数量。这也有两个技术方向,分别为:1)采用更小的卷积滤波器;2)将矩阵分解为参数量更小的矩阵。
与较大的滤波器相比,较小的卷积滤波器具有更少的参数,计算成本也较低。
但如果将所有大的卷积层都替换掉,会影响DNN的平移不变性,这将降低DNN模型的精度。因此有人尝试去识别那些冗余的滤波器,并用较小的滤波器将它们替换掉。SqueezeNet正是这样一种技术,它使用了三种策略来将 3×3 的卷积转换成 1 × 1 卷积。
如上图所示,相比于AlexNet,SqueezeNet减少了98%的参数(当然操作数稍微变多了一些),而性能却并没有受到影响。
MobileNets 在瓶颈层(bottleneck layers )使用深度可分离卷积,来减少计算、延迟和参数量。在使用深度可分离卷积(epthwise separable convolutions)时,通过保持较小的特征尺寸,并只扩展到较大的特征空间,从而实现了较高的精度。
优点:瓶颈卷积滤波器大大降低了DNNs的内存和延迟需求。对于大多数计算机视觉任务,这些方法能够获得SOTA性能。滤波压缩与剪枝和量化技术正交(互不影响),因此这三种技术可以一起使用,从而进一步降低能耗。
缺点及改进方向:已经证明 1×1卷积在小型DNN中计算开销很大,导致精度较差,这主要是因为运算强度太低,无法有效利用硬件。通过对内存的有效管理,可以提高深度可分离卷积的运算强度;通过优化缓存中参数的空间和时间局域性,可以减少内存访问次数。
通过将张量或矩阵分解为合积形式(sum-product form),将多维张量分解为更小的矩阵,从而可以消除冗余计算。一些因子分解方法可以将DNN模型加速4 倍以上,因为它们能够将矩阵分解为更密集的参数矩阵,且能够避免非结构化稀疏乘法的局部性问题。
为了最小化精度损失,可以按层进行矩阵分解:首先对一层的参数进行因子分解,然后根据重构误差对后续的层再进行因子分解。但逐层优化的方法使得难以将这些方法应用到大型的DNN模型中,因为分解超参的数量会随着模型深度成指数增长。Wen等人使用了紧凑的核形状和深度结构来减少因子分解超参的数量。
关于矩阵分解,有多种技术。Kolda等人证明,大多数因子分解技术都可以用来做DNN模型的加速,但这些技术在精度和计算复杂度之间不一定能够取得最佳的平衡。例如,CPD(典型聚并分解)和BMD(批量归一化分解)在精度上能够做的非常好,但Tucker-2分解和奇异值分解的精度就不怎么样。CPD在压缩上要比BMD好,但CPD相关的优化问题有时却并不可解,这就会导致没法分解,而BMD的因子分解却始终存在。
优点:矩阵分解可以降低DNN的计算成本,无论在卷积层还是全连接层都可以使用相同的因子分解。
缺点及改进方向:由于缺乏理论解释,因此很难解释为什么一些分解(例如CPD、BMD)能够获得较高的精度,而其他分解却不能;另外,与矩阵分解相关的计算常常与模型获得的性能增益相当,造成收益与损耗抵消。此外,矩阵分解很难在大型DNN模型中实现,因为随着深度增加分解超参会呈指数增长,训练时间主要耗费在寻找正确的分解超参;事实上,超参不需要从整个空间中进行搜索,因此可以在训练时学习如何找到更优的搜索空间,从而来加速对大型DNN模型的训练。
在设计低功耗计算机视觉程序时,针对不同的任务可能需要不同的DNN模型架构。但由于存在许多这种结构上的可能性,通过手工去设计一个最佳DNN模型往往是困难的。最好的办法就是将这个过程自动化,即网络架构搜索技术(Network Architecture Search)。
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相关的计算成本,一些研究人员建议基于代理任务和奖励来搜索候选架构。例如在上面的例子中,我们不选用ImageNet,而用更小的数据集CIFAR-10。FBNet正是这样来处理的,其速度是MNasNet的420倍。但Cai等人表明,在代理任务上优化的DNN架构并不能保证在目标任务上是最优的,为了克服基于代理的NAS解决方案所带来的局限性,他们提出了Proxyless-NAS,这种方法会使用路径级剪枝来减少候选架构的数量,并使用基于梯度的方法来处理延迟等目标。他们在300个GPU时内便找到了一个有效的架构。此外,一种称为单路径NAS(Single-Path NAS)的方法可以将架构搜索时间压缩到 4 个GPU时内,不过这种加速是以降低精度为代价的。
优点:NAS通过在所有可能的架构空间中进行搜索,而不需要任何人工干预,自动平衡准确性、内存和延迟之间的权衡。NAS能够在许多移动设备上实现准确性、能耗的最佳性能。
缺点及改进方向:计算量太大,导致很难去搜索大型数据集上任务的架构。另外,要想找到满足性能需求的架构,必须对每个候选架构进行训练,并在目标设备上运行来生成奖励函数,这会导致较高的计算成本。其实,可以将候选DNN在数据的不同子集上进行并行训练,从而减少训练时间;从不同数据子集得到的梯度可以合并成一个经过训练的DNN。不过这种并行训练方法可能会导致较低的准确性。另一方面,在保持高收敛率的同时,利用自适应学习率可以提高准确性。
大模型比小模型更准确,因为参数越多,允许学习的函数就可以越复杂。那么能否用小的模型也学习到这样复杂的函数呢?
一种方式便是知识迁移(Knowledge Transfer),通过将大的DNN模型获得的知识迁移到小的DNN模型上。为了学习复杂函数,小的DNN模型会在大的DNN模型标记处的数据上进行训练。其背后的思想是,大的DNN标记的数据会包含大量对小的DNN有用的信息。例如大的DNN模型对一个输入图像在一些类标签上输出中高概率,那么这可能意味着这些类共享一些共同的视觉特征;对于小的DNN模型,如果去模拟这些概率,相比于直接从数据中学习,要能够学到更多。
另一种技术是Hinton老爷子在2014年提出的知识蒸馏(Knowledge Distillation),这种方法的训练过程相比于知识迁移要简单得多。在知识蒸馏中,小的DNN模型使用学生-教师模式进行训练,其中小的DNN模型是学生,一组专门的DNN模型是教师;通过训练学生,让它模仿教师的输出,小的DNN模型可以完成整体的任务。但在Hinton的工作中,小的DNN模型的准确度却相应有些下降。Li等人利用最小化教师与学生之间特征向量的欧氏距离,进一步提高的小的DNN模型的精度。类似的,FitNet让学生模型中的每一层都来模仿教师的特征图。但以上两种方法都要求对学生模型的结构做出严格的假设,其泛化性较差。为了解决这一问题,Peng等人使用了指标间的相关性作为优化问题。
优点:基于知识迁移和知识蒸馏的技术可以显著降低大型预训练模型的计算成本。有研究表明,知识蒸馏的方法不仅可以在计算机视觉中应用,还能用到许多例如半监督学习、域自适应等任务中。
缺点及改进方向:知识蒸馏通常对学生和教师的结构和规模有严格的假设,因此很难推广到所有的应用中。此外目前的知识蒸馏技术严重依赖于softmax输出,不能与不同的输出层协同工作。作为改进方向,学生可以学习教师模型的神经元激活序列,而不是仅仅模仿教师的神经元/层输出,这能够消除对学生和教师结构的限制(提高泛化能力),并减少对softmax输出层的依赖。
事实上,没有任何一种技术能够构建出最有效的DNN模型,以上提到的大多数技术是互补的,可以同时来使用,从而降低能耗、减小模型,并提高精度。基于对上述内容的分析,作者在文章最后提炼出5个结论:
1)量化和降低参数精度可以显著降低模型的大小和算术运算的复杂度,但大多数机器学习库很难手工实现量化。英伟达的TensorRT库为这种优化提供了一个接口。
2)在优化大型预训练DNN时,剪枝和模型压缩是有效的选择。
3)当从零开始训练一个新的DNN模型时,应该使用压缩卷积滤波器和矩阵分解来减少模型的大小和计算量。
4)NAS可以用来寻找针对单个设备的最优DNN模型。具有多个分支的DNN(如Proxyless-NAS, MNasNet等)常需要昂贵的内核启动以及 GPU、CPU同步。
5)知识蒸馏能够应用到中小型数据集,因为这对学生和教师的DNN架构要求的假设较少,能够有更高的准确性。
雷锋网雷锋网雷锋网
雷峰网原创文章,未经授权禁止转载。详情见转载须知。