每年都会开发出更深的模型来执行各种任务,例如对象检测,图像分割等,这些任务始终能够击败最新模型。但是,人们越来越关注使模型更轻便,更高效,以便它们可以在边缘设备和移动设备上运行。这对于弥合机器学习的研究和生产价值之间的差距非常重要。
减少深度神经网络的内存和计算成本的一种方法是二值神经网络的概念。二值神经网络的概念非常简单,其中权重和激活张量的每个值都使用+1和-1表示,以便它们可以以1字节而不是全精度存储(在1-中表示为0 位整数)。使用以下所示的符号函数将浮点值转换为二进制值-
现在,使用阈值函数作为上述函数的一个主要问题是该函数的梯度趋于为零。一种解决方案是使用直通估算器。直通估算器是一种在梯度传递过程中完全照原样通过渐变而不会发生任何变化的估计器。这简化了二值神经网络中阈值函数的反向传播机制,并显示出很好的效果。
在梯度累积阶段,将使用二进制权重和激活来累积每一层的梯度。但是权重更新是对实值原始权重进行的。为什么会这样呢?让我举例说明。
- 我们在神经网络中有一个值为0.05的节点(原始参数)。
- 通过阈值函数传递此值后,我们获得的值为1(二进制参数)。
- 让我们假设在二进制参数处累积的梯度为3。我们使用直通估计器的概念将其照原样传递给原始参数。
- 现在,一旦累积了渐变,我们就可以更新值。
- 如果我们使用二进制值获得新的参数值,则参数的新值将为1–0.1 * 3(其中0.1是学习率),即0.7。
- 如果我们使用原始参数值来获取新参数,则新值将为0.05–0.1 * 3,即-0.25。
- 这是可以注意到差异的地方。当我们执行下一个迭代时,我们将再次通过二进制阈值函数传递新的参数值,它们将给出不同的结果。如果我们继续使用参数的二进制值,则可能永远无法更改该位,因为始终会根据1或-1计算损耗。
当更新参数值时,这些值将被裁剪为介于-1和1之间。主要原因是这些值只会增加/减少,否则对网络没有任何影响。需要注意的一件事是,最后一个激活层中的值未进行二值化,而是按原样用于分类/回归。这些是二值神经网络的基本概念。
可以添加到权重和激活层二值化的另一个改进是使用缩放因子来表示权重和激活。在这里,比例因子只是权重向量中所有值的平均值的绝对值。如果我们有一个2 * 2矩阵,其值[[0.2,0.2],[-0.6,-0.6]],则比例因子α将为0.2,二进制矩阵表示为[[1,1],[-1,- 1]]。
因此,一旦权重和激活连同它们各自的缩放因子一起以二进制形式表示,就可以使用以下公式表示。在此,I和W分别表示激活层和权重层,而激活和权重的缩放因子分别使用κ和α表示。
现在,作为卷积运算基础的乘积(MAC)函数是非常昂贵的运算。现在,可以将其替换为XNOR + 弹出计数操作。 几乎每个CPU都固有地执行按位运算,并且这些运算的执行速度明显更快且成本更低。弹出计数操作只不过是检查设置的位。下面的示例显示了MAC操作可以由XNOR + 弹出计数操作代替。
但是二值神经网络的主要缺点在于,它们无法实现与完全精度的深层网络一样高的精度。但这一直在缓慢地变化,并且每年(与每月发表论文的数量越来越相似),随着差距的缩小,已经有了很多进步。由于人们越来越关注在具有有限计算资源的设备上实施机器学习模型,因此在未来几年中,将会在该领域进行更多的研究。