查看原文
其他

5种小型设备上深度学习推理的高效算法

CSDN APP AI科技大本营 2019-11-27

作者 | James Le
译者 | 陆离
编辑 | Jane
出品 | AI科技大本营(ID:rgznai100)

【导读】文中为AI实践者和研究者们介绍了5种高效模型推断算法,希望这篇文章能够帮助大家更清楚地认识到,在我们所使用的深度学习库的背后,有多少优化正在被应用,从而在像移动电话等小型边缘设备上实现越来越多的实际应用。


随着深度学习的快速发展,神经网络的规模也变得越来越大。例如,在ImageNet识别挑战赛中, 从2012年到2015年,获奖模型的大小增大了16倍。而在短短的一年时间里,对于百度的深度语音模式来说,用于训练的模型数量增加了10倍。

 
一般来说,当前的嵌入式系统的深度学习面临着如下的三大挑战:
 
1、随着模型的增大,在移动电话上部署模型变得越来越困难。如果模型超过了100 MB,那么如果你不连接到Wi-Fi(一般的情况下)就会无法进行下载;
 
2、模型的训练速度变得极其缓慢。例如,原始的ResNet152的准确率高于ResNet101不到1%,它需要一周半的时间在4个分布式的GPU上进行训练;
 
3、这种庞大的模型难以提高资源利用率。例如,在GO语言环境中,AlphaGo击败了Lee Sedol,它使用了1920个CPU和280个GPU来进行训练,而耗费的电量则花费了有3000美元左右;
 
在这种情况下,在资源受限的设备上运行神经网络需要数据工程和数据科学方面的整体解决方案,这些方案有时候会被称为“算法和硬件协同设计”。源自斯坦福大学Song Han的视频讲座《深度学习的有效方法和硬件设备(efficient methods and hardware for deep learning)》中的一个图表对这个概念进行了阐述:
 
 
在本文中,我们只讨论象限的左上部分。有哪些可以有效地进行推理的最先进算法呢?
 

1、修剪神经网络

 
在机器学习中,模型的修剪包括去除不重要的权值以得到更小更快的网络。
 
模型修剪最早是在1989年由Yann Le Cun在他的论文《最优脑损伤(Optimal Brain Damage)》中提出的。其思想是采用一个经过充分训练过的网络,并去掉那些在删除之后将导致在目标函数中增加最少的权重。每个参数的作用可以用Hessian矩阵来估算得出。一旦去除了不重要的权值,就可以再次训练较小的网络,并且这个过程可以重复执行很多次,直到网络既具有满意的规模又具有合适的性能。
 
从那时起,许多修剪技术的变化已经得到了发展。到了2015年,Han等人在《学习有效神经网络的权值和连接(Learning both Weights and Connections for Efficient Neural Networks)》一文中,提出了一种“三步法”,即训练一个神经网络,然后修剪其权值低于预设阈值的连接,最后重新训练稀疏网络,以学习剩余连接的最终权值。
 
你可能会想:如何确定修剪的阈值呢?非常好的问题。实际上,卷积层和全连接层都可以剪除;然而,经验表明,卷积层对修剪比全连接层更加的敏感。因此,要根据每一层的敏感度来进行阈值的选择和设定,如下图所示(该图来源于Han等人的研究论文):
 
 
论文地址:
https://papers.nips.cc/paper/5784-learning-both-weights-and-connections-for-efficient-neural-network.pdf
 
根据这篇论文的说明,在一个NVIDIA Titan X GPU上对修剪过的AlexNet上进行重新训练需要173个小时。但重新训练时长并不是一个关键的问题,因为最终目标是让更小的模型在资源受限的设备上快速运行。
 
在ImageNet上,该方法将AlexNet的参数数量减少了9倍(从6100万个参数减少到了670万个),将VGG-16的参数数量减少了13倍(从1.38亿个参数减少到了1030万个)。在修剪后,AlexNet和VGGNet对存储的需求要低很多,并且所有的权值都可以被存储在芯片上,而不是芯片外的存储器上(当然这需要耗费更多的资源来进行访问)。
 

2、深度压缩

 
神经网络兼具计算密集型和内存密集型的特点,使得它们很难在硬件资源有限的嵌入式系统上进行部署。为了解决这一局限性,Han等人的关于深度压缩的论文引入了一个三阶段流水线(如下所示):修剪、训练量化和哈夫曼编码,它们互相协作,在不影响神经网络精确度的情况下,将神经网络的存储需求减少了35倍到49倍。
 
 
这个方法首先会通过只学习重要的连接来修剪网络。接下来,它量化权重用以强制权重共享。最后,它使用了哈夫曼编码。在前两个步骤之后,作者们重新训练了网络来微调剩余的连接和量化的中心。修剪过程将连接数减少了9倍到13倍。然后量化过程将表示每个连接的比特数从32减少到了5。
 
在ImageNet上,这个方法将AlexNet所需的存储空间减少了35倍(从240 MB减少到了6.9 MB),而不会造成精确度方面的损失。它还将VGG-16预训练模型的大小减少了49倍(从552 MB减少到了11.3 MB),并且没有任何精确度上的损失。
 
最后,这种深度压缩算法促进了复杂神经网络在移动应用中的使用,但其中的应用规模和下载带宽是受限制的。当以CPU、GPU和移动GPU为基准时,压缩网络的分层加速提高了3倍到4倍,而资源消耗率则改进了3倍到7倍。
 

3、数据量化

 
近些年来,基于卷积神经网络的方法在大量的应用中取得了巨大的成功,并已经成为计算机视觉领域中应用最广泛的体系结构之一。然而,基于卷积神经网络(Convolutional Neural Networks,CNN)的方法计算能力强、资源消耗巨大,因此很难集成到智能手机、智能眼镜和机器人等嵌入式系统中。现场可编码门阵列(Field Programmable Gate Array,FGPA)是一种前景光明的CNN加速平台,但有限的带宽和芯片存储空间限制了其性能。
 
在清华大学CNN研究人员的论文《CNN的嵌入式FPGA平台的深入研究(Going Deeper with Embedded FPGA Platform for CNN)》中,提出了一种基于嵌入式FPGA的CNN加速器设计方案,用于ImageNet的大规模图像分类。作者们通过经验表明,在目前最先进的CNN的体系结构中,卷积层以计算为中心,全连接层以存储为中心。因此,他们提出了一种动态精确数据量化方法(如下图所示),用以帮助提高带宽和资源的利用率。
 
 
论文地址:
http://cadlab.cs.ucla.edu/~jaywang/papers/fpga16-cnn.pdf
 
在这种数据量化流中,任意两个固定点之间的分数长度对于不同的层和特征映射集都是动态的,而在一个层中是静态的,用以最小化每个层的截断误差。
 
  • 权重量化阶段目的是为在一个层中的权重找到最佳分数长度。在此阶段,首先分析各层权重的动态范围。之后,初始化分数长度以避免数据溢出;

 
  • 数据量化阶段旨在为两个层之间的一组特征映射找到最佳分数长度。在此阶段,采用贪婪算法(Greedy Algorithm)对定点CNN模型和浮点CNN模型的中间数据进行逐层比较,以减少精确度的损失;

 
他们进一步分析了不同神经网络结构下的不同策略,其结果表明,动态精确度量化比静态精确度量化是更为有利的。通过动态精确度量化,他们可以使用更短的操作表示,同时仍能达到与静态精确度量化相当的精确度。
 

4、低阶近似

 
卷积神经网络(Convolutional Neural Network,CNN)的另一个问题是其高昂的测试时间评估成本,这就使得模型在现实系统中不是很实用。例如,云服务每秒钟需要处理数千个新的请求;手机和平板电脑等便携式设备大多只有CPU或低端的GPU;一些识别任务(例如对象检测)对于处理单个图像仍然非常地耗时,即使在高端GPU上也是如此。因此,降低CNN的测试时间计算具有重要的现实意义。
 
微软(亚洲)研究院关于对非线性卷积网络的高效精确近似值的论文《Efficient and Accurate Approximations of Nonlinear Convolutional Networks》,其中提出了一种加速非线性卷积神经网络的方法。它基于最小化非线性响应的重建误差,受限于一个可以用来降低计算量的低阶约束。为了解决这种极具挑战性的约束优化问题,在作者们将其分解成两个可行的子问题之后进行了迭代处理。随后,他们提出了最小化非对称重建误差的方式,这有效地减少了多个相似层的累积误差。
 
 
论文地址:
https://arxiv.org/pdf/1411.4229.pdf
 
如上图所示,作者们将原始层(由W提供)替换为两个层(由W '和P提供)。矩阵W '在实际上是d '过滤器,其大小为k * k * c(其中k是过滤器的空间大小,c是该层的输入信道的数量)。
 
这些过滤器生成了一个d '维特征图。在这个特征映射上,d * d’的矩阵P可以用以实现1 * 1 * d’的d过滤器。因此P对应于一个具有1 * 1空间支持的卷积层,它将d’维特征图映射到d维特征图。
 
他们在给ImageNet训练的大型网络上应用了这种低阶近似方式,并得出了训练加速的比率提高了4倍的结果。事实上,与AlexNet相比,他们的加速模型的推理速度相对较快,而准确率则提高了4.7%。
 

5、训练三元量化

 
另外一种可以解决在资源有限的移动设备上部署大型神经网络模型的算法是训练三元量化(Trained Ternary Quantization),它可以将神经网络中的权值精确度降低到由三个部分组成的值。这个方法对精确度影响很小,甚至可以提高一些在CIFAR-10上的模型以及ImageNet上的AlexNet模型的精确度。本文从零开始训练AlexNet模型,这意味着它和训练一个正常的、全精确度的模型一样简单。
 
 
上图中所显示的训练量化方法可以同时学习三元值以及三元赋值。首先,作者们通过将每个权值除以最大权重的方式,将全精确度的权值标准化到范围[-1,+1 ]。
 
接下来,他们通过设置阈值将中间的全分辨率权值量化为数组{-1,0,+1}。阈值因子t是一个超参数,它在所有的层都是相同的,这样就可以有效缩小搜索空间。
 
最后,他们通过反向传播两个梯度(虚线所示)来执行训练量化:梯度1到全分辨率权值,梯度2到缩放系数。前者可以学习三元赋值,而后者则可以学习三元值。
 
他们在CIFAR-10上的实验表明,用这种训练的量化方法得到的三元模型分别比ResNet32、ResNet44、ResNet56这三个全精确度的模型要好0.04%、0.16%和0.36%。在ImageNet上,他们的模型比全精确度的AlexNet模型要高出Top-1精确度的0.3%,而比以前的三元模型的精确度高3%。

原文链接:
https://heartbeat.fritz.ai/the-5-algorithms-for-efficient-deep-learning-inference-on-small-devices-bcc2d18aa806?gi=e03a7e08b72b

(*本文为AI科技大本营编译文章,转载微信联系1092722531)



精彩推荐




开幕倒计时13天|2019 中国大数据技术大会(BDTC)即将震撼来袭!豪华主席阵容及百位技术专家齐聚,十余场精选专题技术和行业论坛,超强干货+技术剖析+行业实践立体解读。6.6 折票限时特惠(立减1400元),学生票仅 599 元!

推荐阅读


    你点的每个“在看”,我都认真当成了AI

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存