每年,都会开发出更深的模型来执行各种任务,例如对象检测,图像分割等。

这些任务总是能胜过最新的模型。

但是,人们越来越关注使模型更轻便,更有效,以便它们可以在边缘设备和移动设备上运行。

这对于弥合机器学习研究与生产价值之间的差距非常重要。

减少深度神经网络的内存和计算成本的一种方法是二进制神经网络的概念。

二进制神经网络的概念非常简单,其中权重和激活张量的每个值都由+1和-1表示,因此它们可以存储在1个字节中,而不是全精度(在其中表示为0位整数) 1-)。

使用下面显示的符号函数将浮点值转换为二进制值-现在,将阈值函数用作上述函数的主要问题之一是该函数的梯度趋于零。

一种解决方案是使用传递估计器。

直通估算器是在梯度传递过程中完全通过梯度而没有任何变化的估算器。

这简化了二进制神经网络中阈值函数的反向传播机制,并显示出良好的效果。

在梯度累积阶段,将使用二进制权重和激活来累积每个层的梯度。

但是,权重更新是对实值原始权重执行的。

为什么会这样呢?让我举例说明。

在神经网络中,我们有一个值为0.05的节点(原始参数)。

通过阈值函数传递此值后,我们得到的值为1(二进制参数)。

让我们假设二进制参数处的累积梯度为3。

我们使用传递估计器的概念将其照原样传递给原始参数。

现在,一旦累积了渐变,就可以更新该值。

如果使用二进制值获取新的参数值,则该参数的新值将为10.1 * 3(其中0.1是学习率),即0.7。

如果我们使用原始参数值来获取新参数,则新值将为0.050.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都固有地执行按位操作,并且这些操作明显更快,成本更低。

弹出计数操作只不过是检查设置的位。

下面的示例显示可以用XNOR + pop计数操作代替MAC操作。

但是二进制神经网络的主要缺点是它们无法达到与高精度深度网络相同的高精度。

但是,这种情况正在慢慢改变,并且每年(与每月发表的论文数量越来越相似),随着差距的缩小,已经取得了很多进展。

随着人们越来越关注在具有有限计算资源的设备上实施机器学习模型,未来几年将在该领域进行更多研究。