65.9K
CodeProject 正在变化。 阅读更多。
Home

使用二元算术加速神经网络

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2017 年 5 月 3 日

CPOL

6分钟阅读

viewsIcon

9018

在这篇博文中,我们将重点介绍一类名为二值化神经网络(BNN)的低精度网络,它们的基本概念,并介绍 Neon CPU 和 GPU 的实现。

原始文章发布在 Nervana 网站:使用二进制算术加速神经网络 请访问 Nervana 主页 了解更多关于 Intel Nervana 的深度学习技术。

在 Nervana,我们对加速神经网络的算法和硬件改进深感兴趣。一个特别令人兴奋的研究领域是低精度算术。在这篇博文中,我们将重点介绍一类名为二值化神经网络(BNN)的低精度网络,它们的基本概念,并介绍 Neon CPU 和 GPU 的实现。BNN 在各种数据集上的准确度可与标准神经网络相媲美。

BNN 在所有计算中都使用二值权重和激活。浮点运算是深度学习中所有计算的基础,包括计算梯度、应用参数更新和计算激活。然而,这些 32 位浮点乘法非常昂贵。在 BNN 中,浮点乘法被位异或(XNOR)和左移右移操作所取代。从硬件角度来看,这非常有吸引力:二进制操作可以以低功耗成本在计算上高效地实现。


来源:深度学习资源

图 1:BNN 使用二值权重和激活。符号函数用作激活函数以确保二值激活。

这些优势在推理中比在训练中更为明显。实际上,我们观察到在训练中,虽然每次迭代(前向传播、反向传播和参数更新)都更快,但 BNN 需要比标准神经网络更多的 epoch 才能收敛到相同的精度。对于推理,大部分乘法被简化为二进制操作。Courbariaux 等人认为,推理速度可以提高七倍,并且功耗效率大大提高,而准确性没有任何损失。这些优势对于部署在边缘的推理芯片(如自动驾驶汽车、无人机和智能手机中的芯片)非常有吸引力。

在 BNN 中,标准深度学习网络的常见组件被它们的二值化变体所取代。例如,典型的学习率调度将被基于移位的学习率调度所取代。其他替换包括二值线性层、符号函数、基于移位的批归一化、基于移位的 AdaMax 以及 XNOR 点积。这些变体使用三个基本概念:二值化、位打包和近似二的幂次方移位,用高效的二进制操作取代了浮点乘法。

二值化

BNN 的基本操作是二值化函数。它负责将权重和激活转换为 -1 和 +1。此函数有两种形式:确定性和随机性。确定性函数根据符号对权重或激活进行阈值处理。

随机函数以概率方式选择 -1 和 +1。此函数的实现更困难,因为它需要随机生成比特。

其中 σ(x) 是硬 sigmoid 函数。

二值化函数应用于所有权重层,并用作激活函数。例如,在前向传播中

其中 L 是总层数,Wk 和 θk 分别是给定层 k 的权重和批归一化参数。二值化,特别是随机二值化,可以看作是一种正则化形式。概念上,这与 Dropout 相似,因为某些值是按概率阈值化的。

对于随机梯度下降(SGD),许多噪声更新优于单个精确更新。这提供了 BNN 有效的原因:尽管二值化降低了更新的精度,但噪声被平均掉了,累积起来的更新朝着正确的方向。

需要注意的是,只有权重和激活是二值化的,而不是反向传播期间用于更新参数的梯度。SGD 要正常工作需要实值梯度。权重存储在实值累加器中,并在每次迭代中进行二值化以进行前向传播和梯度计算。请参阅此链接以了解减少反向传播期间计算的见解。

位打包

在 BNN 中,我们需要乘以 -1 和 +1 的矩阵;例如,在前向传播中乘以激活和权重时。GPU 不原生支持二进制操作。使用 32 位或 16 位数字而只需要 1 位是非常浪费的。

通过将 32 位打包到单个 32 位整数中,然后执行位异或(XNOR)操作来模拟二进制算术。换句话说,两个 32 位整数之间的位异或(XNOR)操作会产生 32 个独立的二进制操作。XNOR 在 -1 和 1 的二进制域中充当乘法:如果操作数相同,则结果为 1,如果操作数不同,则结果为 -1。打包整数需要预先付出成本,但每个操作的计算吞吐量是原来的 32 倍。

此概念用于实现 XNOR 点积,该点积用于相乘由 -1 和 +1 组成的两个矩阵。在普通的矩阵乘法 C = AB 中,其中 A、B 和 C 是矩阵,结果矩阵 C 的每个元素是通过 A 的一行和 B 的一列的点积计算的。在简单的 CUDA 内核实现中,对于给定的行和列,我们将看到以下内容

XNOR 点积按行打包 A 的比特,按列打包 B 的比特,然后使用位异或(XOR)和人口计数(population count)操作,如下所示

其中 Ap 和 Bp 是其对应项的位打包版本。为方便起见,-1 表示为 0,1 表示为 1。累积值稍后将在结果矩阵中解包。累加、人口计数和异或(XOR)都得到了高效实现。

近似二的幂次方移位

在深度学习中,我们经常需要缩放值,例如随着训练的进行而降低学习率,计算批归一化的缩放和平移,在学习规则中更新参数,以及其他情况。这些乘法可以用近似二的幂次方移位来代替。例如,假设我们要计算 7*5 的近似值,

其中 AP2 是近似二的幂次方算子,<< 是左二进制移位。这具有两个吸引人的原因:1)近似二的幂次方可以非常高效地计算(可以参考位操作技巧获取灵感),2)与二的幂次方的乘法可以用简单的左移和右移二进制移位来实现。为了了解这在实践中是如何应用的,这里是经典AdaMax的更新规则

其中 gt 和 θt 是步骤 t 的梯度和参数,β1和 β2是 AdaMax 学习规则的超参数,α 是学习率。

最后一行中的乘法可以用近似二的幂次方移位来替换,从而得出基于移位的 AdaMax 更新规则。

其中 <<>> 是左移或右移二进制移位,取决于符号。基于移位的批归一化和学习率调度也遵循此模式。

结论

二值化、近似二的幂次方移位和位打包用于用计算和功率高效的二进制操作取代乘法。这三个概念构成了 BNN 的基础。

Neon 提供了适用于 CPU 和 GPU 的入门级实现,位于此处。我们欢迎您的反馈和贡献,并且一如既往,如有任何疑问,请随时通过 info@nervanasys.com 联系我们。

关于作者

Sathish Nagappan 在 Nervana 的算法和云团队工作。他最近毕业于斯坦福大学,曾在 Andrew Ng 的机器学习小组进行研究。他非常具有创业精神,具有出色的设计感,并且在从硬件到软件的整个工程栈方面都有丰富的经验。他对艺术、设计、人工智能、旅行、电影和巴尔的摩乌鸦橄榄球非常感兴趣。

使用二进制算术加速神经网络 - CodeProject - 代码之家
© . All rights reserved.