作者丨林野
学校丨东北大学自然语言处理实验室2019级博士生
研究方向丨机器翻译、模型压缩、模型加速
背景
近年来,随着人工智能的不断兴起,神经网络已经在语音识别、计算机视觉和自然语言处理领域等多个任务上取得了重大突破,以机器翻译任务为例,基于神经网络的神经机器翻译模型在翻译质量和翻译流畅性等方面都明显优于传统的统计机器翻译。
当前神经网络取得的进展除了模型结构本身的因素外,还主要依赖于三种外部因素:1)海量数据集;2)高性能 GPU 设备;3)大规模分布式训练。
深度学习(Deep Learning, DL)的概念源于人工神经网络的研究,是机器学习的第二次浪潮,也是机器学习领域中最集中和最广泛使用的预测模型之一。许多深度学习问题追求的目标都可以分为两个阶段,第一阶段是性能,第二阶段是效率。
在第一阶段中,效率和响应速度并不那么重要,人们更关心的是提出的研究方法和模型是不是真的 work,对模型性能有多少提升,这种发展趋势也使得当前许多深度神经网络无比繁重。
很快,人们意识到了一个问题:模型效率真的很重要!尽管 DL 带来了诸多好处,但模型的训练和存储却变得越来越困难,很难将神经网络相关的计算工作负载部署在计算资源受限的嵌入式边缘设备上。例如:AlphaGo 的惊人性能需要在 2000 个 CPU 和 250 个 GPU 上进行为期 4 到 6 周的训练,总功耗约为 600kW。
在诸如 AlphaGo 这些深度神经网络中,参数并非都对网络起到正向的效果,而是存在冗余,这种冗余的神经网络不仅会对存储和计算资源造成浪费,还可能导致严重的过参数化和过拟合问题。
当前已经有一些关于模型结构优化的研究工作,可以在提升模型性能的前提下显著降低模型的计算代价,但仍需消耗更多更昂贵的计算资源和内存资源。因此,如何在保证模型性能的前提下提升神经网络模型的计算效率,是我们当前亟待解决的一个问题。
低精度神经网络
为了解决神经网络训练代价过高的问题,将神经网络的发展从计算资源和内存资源等硬件限制中解脱出来,当前研究人员已经研究出一些神经网络模型加速和压缩方法,这些方法主要有网络剪枝、知识蒸馏、张量分解、迁移学习、参数量化、低精度神经网络等等,相较于其他方法,低精度神经网络更倾向于从神经网络的底层数值计算角度来进行神经网络模型的优化。
什么是低精度神经网络?
看到这里大家可能会有一个疑问,到底什么是低精度神经网络?
大家都知道,实数是是不可数的,以枚举的方式不能表示整体的实数。在计算机中只能使用有限数量的 bit 位来表示无穷个实数,因此计算机中对实数的表示本身就是一个近似替代问题,替代的准确度取决于我们用多少 bit 位来对数值进行表示。在神经网络中,最常用的数值表示为 32 位浮点数,在某些科学计算领域会使用 64 位浮点进行严格计算,用更低精度数值表示的神经网络我们称之为低精度神经网络。
神经网络低精度化方法最早可以追溯到 20 世纪 90 年代,但由于当时条件和资源限制,并不能很好的验证神经网络低精度化方法在深层神经网络及大规模数据上的有效性。当前随着计算资源和数据资源的极大丰富,对低精度神经网络的研究逐渐提上日程。
常用数值表示
低精度神经网络将神经网络中权重和隐层单元用低精度的数值进行表示,这种低精度表示明显减少了模型的内存带宽和存储要求并提高了模型的计算效率。为了进一步介绍低精度神经网络的优势,我们首先介绍几种精度的数值表示。
1. 浮点数
浮点格式通常用于表示实值。浮点数的表示由三部分组成:符号位,指数位和尾数位。符号位用来表示正负数值,指数给出了浮点格式的表示范围,尾数保证了浮点精度。常用的三种浮点数值的表示方法如图 1 所示。
▲ 图1. 三种常用浮点数值表示
2. 定点数
定点数即小数点位置固定的数,主要包括定点整数和定点小数。相比于浮点数来说,定点数的存储方式更加简单,通常的方式就是对每一个十进制数进行 BCD 编码,然后加上一个额外的符号位,16 位整数和 8 位整数的表示方法如图 2 所示。
▲ 图2. 两种常用整数表示
低精度神经网络分类
低精度神经网络是用低精度数值表示的一类神经网络,网络参数用一些低精度浮点或是定点数进行表示。这种方法的主要目的是通过发挥低精度数值的运算优势,减少神经网络的空间复杂度和计算复杂度,以提升神经网络模型的计算和存储效率,同时还需保证网络的准确率不受影响。在这里,我们将低精度神经网络分为以下几类:1)单精度浮点网络;2)半精度/更低精度浮点网络;3)定点数网络。
1. 单精度浮点网络