确定性与随机二值化
决定式的二值化:
随机式的二值化:
第二种方法虽然看起来比第一种更合理,但是在实现时却有一个问题,那就是每次生成随机数会非常耗时,所以一般使用第一种方法。
梯度计算与累积(梯度计算与累加)
虽然BNN的参数和各层的激活值是二值化的,但梯度不得不用较高精度的实数而不是二值进行存储。
通过离散化传播梯度(离散化梯度传播)
如何对权和激活进行二值化。如下图左,二值化函数很简单,就是一个符号函数。但是作者就想了啊,符号函数不好进行梯度的反向传播啊,因此就把它近似成了右边的Htanh(X)的函数,这样在[-1,1]区间内导数就等于1。
在具体的算法使用中于隐含层单元:
激活值,直接使用决定式的二值化函数得到二值化的值。
对于权重:
在更新参数时,要把超出[-1,1]的部分给裁剪了。即权重参数始终在[-1,1]之间。
在使用参数时,要将参数进行二值
前向传播:
那么除第一层(输入层)以外,每一层的前向传播过程如下:
首先权重WK 经过二值化,然后与上层二值化后的激活值ABK - 1 相乘,再进项BatchNormalization得到这一层的激活值AK ,由于BatchNorm的参数θk的不是二值的,因此AK 也不是二值的,我们需要再对它做二值化得到二值化后的激活值abk 。
向后传播:
然后反向传播过程如下,要注意的是权重和激活值的更新并不是二值的,因为如果这样做的话误差会很大。
第一层
尽管所有的层次的激活和参数都是二值化的,但第一层的输入却是连续值的,因为是像素。若要整个网络都是二值化的,只需将输入变化一下即可。
使用8位数字来表示一个像素,那么输入就是一个img_height×img_width×8的向量,而权重参数是一个img_height×img_width的全1向量。比如minist:28x28的图像,输入就是28x28x8bit位宽的向量。
各层计算流程如下:
Batch Normalization
参考:https://blog.csdn.net/whitesilence/article/details/75667002
BN 最大的作用就是加速学习,减少权重尺度影响,带来一定量的正则化,可以提高网络性能,但是,BN 涉及很多矩阵运算(matrix multiplication),会降低运算速度,因此,提出了一种 shift-based Batch Normalization。
因为BN的参数θ(k)不是二值的,所以BN的输出a(k)也不是二值的,需要在进行一次Binarize操作转换成二值输出。
shift-based Batch Normalization:
使用SBN来替换传统的BN,SBN最大的优势就是几乎不需要进行矩阵运算,而且还不会对性能带来损失。(AP2:2的幂次。)
Hardware implementation of AP2 is as simple as extracting the index of the most significant bit from the number’s binary representation
在FPGA上实现是利用阈值判断,目前还不清楚具体怎么提取阈值!
结论:
二值神经网络在深度神经网络的正向传播的过程中将所有的实数权重值量化为-1或者1,并利用符号运算操作(Sign Operation)来代替卷积层和全连接层中的乘法操作,但在权重更新时仍然利用保留的实数形式的权重来进行梯度的积累以保证模型的收敛。