--------点击屏幕右侧或者屏幕底部“+订阅”,关注我,随时分享机器智能最新行业动态及技术干货----------
1 背景介绍
深度卷积网络(Deep Neural Networks, DNN)被广泛用于计算机视觉任务,如目标检测、分类与分割。DNN 往往被设计得很深,从而能在训练时能够对大量参数进行微调从而获得更准确得推理结果。因此,DNN 具有计算量大和高功耗等特点。如 VGG-16 网络在对单张图像进行分类时,需要执行 150 亿次运算,同样,YOLOv3 在处理一张图片时需要进行 390 亿个运算。实现这些计算需要大量的计算资源同时也带来了巨大的能耗。
那么,DNN 如何才能部署于低功耗的嵌入式系统和移动设备呢?这些设备往往通过电池或者低电流的 USB 连接供电,并且往往无法使用 GPU。将计算任务部署在云端是一种不错的解决方案,但是在一些没有网络覆盖或网络成本过高的情况,DNN 应用需要直接在低功耗设备上执行,例如,在无人机或者人造卫星上部署 DNN 时。
一些低功耗的计算机视觉技术在只损失很少的精确度的情况下,通过移除一些 DNN 中的冗余部分可以减少 75% 的运算和 50% 的推理时间。为了将 DNN 部署在更小的嵌入式计算机中,进行更多的优化十分必要。因此,推进低功耗的深度学习技术的发展具有重要价值和意义。这篇文章重点从四个方面介绍了低功耗计算机视觉方法(注意:这里主要介绍 DNN 推理,而不是训练)。这四个方面分别是:
- 参数量化及剪枝:通过减小模型参数的比特数量来降低内存和计算消耗;
- 卷积核压缩及矩阵分解:将 DNN 中较大的层分解为较小的层来减小内存需求以及多余的矩阵操作;
- 网络模型搜索(Network Architecture Search,NAS):通过自动最优的 DNN 网络结构达到预期性能;
- 知识蒸馏:训练一个小型的 DNN 来模仿大型 DNN 的输出、特征和激活函数。
本文着重介绍基于软件的低功耗计算机视觉方法,下表 1 对这些方法进行了一些总结:
2 参数量化及剪枝
2.1 深度神经网络的量化
减小内存占用的一个方法是减少 DNN 网络参数的数量,已有不少研究显示这种措施造成的精度损失可忽略不计。图 1 对比了采用不同程度量化的 DNN 结构的功耗和测试误差。结果显示,随着参数占用位宽的下降,功耗降低的同时也会增大测试误差。基于这些发现,LightNN、CompactNet 和 FLightNN 等工作在限制精度的前提下,尝试为 DNN 不同类型的参数寻找最佳位宽。也有方法尝试将参数设置为不同的整数类型,例如二值化的神经网络,其中的每个参数被表示成单比特。此外,这些 DNN 模型也需要更多的层结构以保证高精度。在图 1 中,对于一个给定的 DNN 结构,1-bit 量化(二值化神经网络)具有最小的功耗和最大的误差。量化反向传播梯度可以在训练中实现更好的收敛性,提高二元神经网络的精度。
参数量化也经常和模型压缩一同使用来减小 DNN 的内存需求。首先将参数量化为离散段,再通过 Huffman 编码压缩接近 89% 的模型大小,精度几乎不受影响。
这种方法的优势在于,参数约束能够对训练过程起到正则化作用,因此当参数的位宽下降时,DNN 网络的性能保持不变。除此以外,当对 DNN 设计自定义硬件时,量化为使用平移或者异或非门操作来替代高功耗的乘积累加运算创造了条件,从而减小了回路区域大小和功耗需求。
其劣势在于,经过量化的 DNN 需要进行多次重复训练,降低训练成本能够使得该技术更易于实践。此外,DNNs 内的不同层结构对不同特征较为敏感,对各层采用同样的位宽则会有较差的性能。可在训练过程中采用不同的方式表示精度值,从而为 DNN 中的网络连接选择不同的参数精度。
2.2 剪枝参数与连接
从 DNNs 中去除掉不重要的参数和网络连接能够减少内存访问的次数。Hessian 加权变形测量法(Hessian-weighted distortion measure)可以评估 DNN 中参数的重要性,从而删除冗余的参数以减小网络规模。但这种基于测量的剪枝方法只适用于全连接层。
为了将剪枝扩展到卷积层,Anwar 等人使用粒子滤波定位可剪枝的参数;Polyak 使用样本输入数据,并删掉稀疏激活的连接;Han 等人使用一个全新的损失函数学习参数和连接;Yan 等人利用算法衡量每个参数对最终输出的重要程度。通过结合剪枝、量化和编码的方式,最大可将模型大小缩小 95%。
尽管这些技术能够识别不重要的连接,但同时也造成了不必要的网络稀疏性。而稀疏矩阵需要特定的数据结构,也很难映射到现代 GPU 中。为了解决这一问题,也有方法在剪枝的同时进行稀疏性的限制。
优势在于,如表 2 所示,剪枝可以和量化与编码结合以实现更好的性能。当三种方法结合时,VGG-16 模型可以减少至原始大小的 2%。剪枝也能够降低 DNNs 的复杂度从而减少过拟合的情况。
但剪枝也会造成训练时间的增加,同时使用剪枝和量化时训练时间会增加 600%。当使用稀疏约束的剪枝时,这个问题会更加严重。此外,只有当使用自定义硬件或者用于稀疏矩阵的特定数据结构时,剪枝的优势才得以显现。通道层面的剪枝是一个潜在的改进方向,相较于现有的连接层剪枝,它无需特殊数据结构,也不会产生不必要的矩阵稀疏。
3 卷积核压缩及矩阵分解
3.1 卷积核压缩
较小卷积核的参数量和计算成本远小于更大的卷积核。然而,删除掉所有的大型卷积层意味着影响 DNN 的平移不变性,会降低准确度。有些研究通过识别冗余的卷积核并替换为较小的卷积核。例如 SqueezeNet 就通过三种策略用 11 的卷积核替换 33 的卷积核来减小参数。
表 3 对比了不同卷积核压缩技术的性能:相比于 AlexNet,SqueezeNet 的参数减少了 98%,但增加了大量的操作;MobileNet 在瓶颈层(bottleneck layers)使用深度可分离卷积减小计算量、延迟和参数量;在使用深度可分离卷积时,通过保留较小的特征,只扩展到较大的特征空间,实现了较高的精度。
瓶颈层的卷积核极大程度地减小了 DNN 的内存和延迟需求。对大多数计算机视觉任务来说,这些技术能够达到 SOTA 准确度。卷积核压缩方法与剪枝和量化之间互不影响,三者可以同时使用来进一步减少功耗。
但这种方法的劣势是,在小型 DNN 中,1*1 的卷积核由于计算成本高会导致较差的性能。此外,由于深度可分离卷积运算强度过低,无法有效利用硬件。可以通过提高管理内存的效率增强深度可分离卷积的运算强度,优化缓存中参数的时间和空间局限性以减少内存访问次数。
3.2 矩阵分解
张量分解和矩阵分解以和 - 积的形式加速 DNN 操作,通过将多维张量分解为更小的多个矩阵来消除冗余计算。一些因式分解方法能够将 DDNs 提速至四倍,因为它们创建了更密集的参数矩阵,能够避免非结构化稀疏乘法的局部问题。为了最小化精度损失,每次只实现单层的矩阵分解。首先对一层的参数进行分解,随后根据重构误差来分解后续层。这种按层分解的方法难以应用到大型的 DNNs 中,因为随着 DNN 深度的增加,因式分解的超参数将会呈指数级增长。为了将这种方法在大型 DNNs 中实现,Wen 等人使用了紧凑的核形状和深层结构来减小分解超参数的数量。
因式分解的方法众多,大多数都可以应用于 DNN 的加速,但有些方法无法在精度和计算复杂度之间实现最佳的平衡。例如,典型聚并分解(Canonical Polyadic Decompo[1]sition, CPD)和批量归一化分解(Batch Normalization Decomposition, BMD)在精度上能够取得很好的表现,但 Tucker-2 分解和奇异值分解的精度就较差。典型聚并分解比批量归一化分解具有更好的压缩效果,但是批量归一化分解取得的准确性要优于典型聚并分解。除此以外,典型聚并分解的优化问题有时并不可解,而批量归一化分解的解却始终存在。
这种技术的优势在于,卷积层和全连接层可以使用相同的矩阵分解方法,通过 CPD 和 BMD 均能够取得不错的性能。但由于理论理解的限制,难以说明为什么有些分解方法的效果能够达到较好的精度,有些方法却不能。此外,由于矩阵分解造成及计算开销常常与减小操作量获得的性能抵消。同时随着 DNNs 深度的增加,应用矩阵分解的训练时间整体会呈指数级增长,因此很难应用于大型网络。而这是由于在空间内搜索以寻找正确分解超参数的时间过大,可以在训练过程中学习超时参数,而非在整个空间内进行搜索,从而加速对大型 DNN 的训练。
4 网络模型搜索
设计低功耗计算机视觉应用是可以考虑很多不同的 DNN 模型以及优化方法。当有多种可行的网络模型时,为一个特定任务手动设计最优的 DNN 通常十分困难。网络模型搜索( Network Architecture Search, NAS)是一项为各类任务自动寻找 DNN 模型方案的技术。其使用递归神经网络(Recurrent Neural Network, RNN)进行控制,通过强化学习创建候选 DNN 的结构。对这些候选模型进行训练并且在验证集上测试,验证准确度作为一个回报函数来优化控制器对下一个候选模型的构建。为了能够自动给移动设备寻找有效的 DNNs,MNasNet 在控制器中使用多目标回报函数来实现期望的精度和延迟需求。MNasNet 相比 NASNet 加速 2.3 倍,同时参数减少 4.8 倍,操作更是减少 10 倍。此外,MNasNet 也更为精确。然而大多数 NAS 算法具有很高的计算强度,例如 MNasNet 需要 50000GPU 时才能在 ImageNet 数据集上寻找到一个有效的 DNN 模型。
为减小 NAS 相关的计算成本,一些研究者提出通过代理任务和回报来搜索候选模型。FBNet 通过在较小的数据集上进行优化,比 MNasNet 快 420 倍。也有研究表示在代理任务上的优化无法确保在目标任务上是最优结果,从而提出 Proxyless-NAS 方法克服这一问题。该方法使用路径层面的剪枝减少候选模型的数量,并通过基于梯度的方法解决延迟等目标,最终只需要 300GPU 时便可寻找到有效的模型结构。Single-Path NAS 更是将搜索时间减小至 4 小时。而这些加速的代价是准确度的降低。
NAS 能够通过空间内搜索所有可能的模型在精度、内存和延迟之间取得平衡,无需人为干涉,这种方法在许多移动设备上都取得了精度和功效上目前最佳的性能。但由于计算量的要求,NAS 算法很难应用到大型数据集中,对各个模型训练并进行性能评估所花费的时间和计算成本是巨大的。为减小训练时间,候选 DNNs 可以在不同的子训练集中进行同步训练,由各子训练集得到的梯度可以合并产生一个训练好的 DNN。然而这种平行训练通常会造成较低的准确度,在保持高速收敛的同时,使用自适应学习率可以提高精度。
5 知识迁移和蒸馏
大型 DNNs 比小型 DNNs 具有更好的精度,因为更多数量的参数能够使网络学习更复杂的函数。一些方法通过用小模型模仿大型预训练网络来实现这一目的。首先是知识迁移(Knowledge Tansfer, KT),这种方法将大模型中的“知识”迁移到小模型中,早期的 KT 方法被普遍用于网络模型压缩。关键思想是经过大模型标注的数据会包含大量对小模型有用的信息。例如在多分类问题中,如果大模型对输入图片在一些类中输出较高的概率,那意味着这些类可能共享一些视觉特征。通过让小模型模拟这些概率,可以学习到比训练集可用信息更多的知识。
而 Hinton 等人提出了另一类叫做知识蒸馏(Knowledge Distillation, KD)的方法,训练过程比 KT 简化许多。这种方法以学生 - 教师的模式进行训练,小模型作为学生,一组特定的 DNNs 作为教师。在这项工作中,研究者们发现学生模拟教师输出的方式,会使得小模型存在一定的精度损失。为提高模型精度,Li 等人最小化教师和学生之间特征向量的欧氏距离,FitNet 用类似的方法构建轻量 DNN,让学生模型的每层都模拟教师的特征图。但以上两种方法对学生模型结构具有严格的假设,为解决这一问题并提高泛化能力,可以使用指标间的相关性作为训练过程的优化问题。
基于 KT 和 KD 的方法能够有效地减小大型预训练 DNNs 的计算成本。研究表明,KD 的思想也可以应用于计算机视觉之外的领域,如半监督学习、自适应域等。但是由于这种方法对学生模型的结构和大小具有严格的假设,难以泛化到更多的应用中。除此以外,目前的 KD 方法严重依赖于 softmax 输出,而无法在其他输出层起作用。如果学生能够学习到教师模型中被激活神经元的信息,将会使学生模型具有更灵活的网络结构,并且减少对 softmax 输出层的依赖。
6 讨论
6.1 低功耗计算机视觉指南
没有哪项技术能够单独构建有效的 DNN 结构,大多数可应用的技术能够互相结合以取得更高的功效。对于低功耗的计算机视觉任务,可以得出以下五点结论:
- 量化和减小参数精度能够很大程度上降低模型大小与运算复杂度,但在多数机器学习库上难以手动实现量化。英伟达的 TensorRT 库能够为这类量化提供良好的接口;
- 剪枝和模型压缩对优化大型预训练 DNNs 是有效的选择;
- 当从头训练新的 DNN 时,可以使用压缩卷积核与矩阵分解来降低模型大小和计算量;
- NAS 可以为单个设备寻找最佳模型,多分支的 DNNs 在核心的启动以及 GPU 与 CPU 的同步上需要巨大的成本;
- 知识蒸馏可以用于较小或中等大小的数据集,因为这样对学生和教师的 DNN 模型有较少的假设,从而有更高的准确度。
6.2 评估准则
对于计算机视觉任务使用的低功耗 DNNs 的性能,应该从多方面来评估,而不仅仅是准确度。以下是可以考虑的主要准则:
- 应在大型数据集(如 ImageNet、CIFAR、COCO 等)中评估测试准确度,在训练集较小的情况下,进行多层面的交叉验证十分必要;
- 通常内存的寻求与模型参数数量相关,应该运用量化和剪枝时多个准则的对比;
- 通过评估操作数量来确定计算成本,当使用低精度 DNNs 是,每次操作的成本都会降低。在这种情况下,衡量能量损耗也很重要;
- 参数和操作数量并不总是与模型的能量损耗成正比,因此应当将 DNNs 部署到连接功率计的设备上,以确定模型的能量损耗。