深度学习算法优化系列十 | 二值神经网络(Binary Neural Network,BNN)

前言

昨天介绍的BinaryConnect提出将浮点权重量化到1bit,提出了完整的量化权重训练/测试流程,并且从带噪声权重的角度来解释了量化权重。但这种方法还有一个缺点,即并没有对激活函数进行量化,所以Bengio大神在2016年发表了这篇Binary Neural Network,论文原文和代码链接见附录。

BNN算法

二值化的方法

二值化方法主要有两种,确定式二值化和随机式二值化。二值化将float类型权重转换为两个值,一个非常简单直接的二值化操作基于符号函数:
在这里插入图片描述
其中 w b w_b wb是二值化权重, w w w是实值权重。这是一个确定式的二值化操作,另外一种方案是随机二值化,即以一定的概率更新值:

在这里插入图片描述
其中 σ ( x ) = c l i p ( x + 1 2 , 0 , 1 ) = m a x ( 0 , m i n ( 1 , x + 1 2 ) ) \sigma(x)=clip(\frac{x+1}{2},0,1)=max(0,min(1,\frac{x+1}{2})) σ(x)=clip(2x+1,0,1)=max(0,min(1,2x+1))

第二种方法比第一种方法更合理,但在实现时,每次生成随机数会非常耗时,所以一般使用第一种方法。

梯度计算和累加

虽然BNN的参数和激活值被二值化了,但因为下面两个原因,导致梯度不得不用较高精度的实数而不是二值进行存储,原因如下:

  • 梯度的量级很小。
  • 梯度具有累加效果,即梯度都带有一定的噪音,而噪音一般认为是服从正态分布的,所以,多次累加梯度才能把噪音平均消耗掉。

另一方面,二值化相当于给权重和激活值添加了噪声,而这样的噪声具有正则化的作用,可以防止模型过拟合。因此,二值化可以被看作是Dropout的一种变形,Dropout一般是将激活值变成0,从而造成一定的稀疏性,而二值化则是将激活值变成1或者-1。

离散化梯度传播

直接对确定式的二值化函数求导的话,那么求导之后的值都是0。因此,只能采用一种折中的方法,将sign(x)进行松弛。这样函数就可以求导了。公式如下:

在这里插入图片描述
然后,假设损失函数为 C C C,二值化操作函数如下:

q = S i g n ( r ) q = Sign(r) q=Sign(r)

如果 C C C q q q的导数已经得到了,那么 C C C r r r的求导公式计算如下:

在这里插入图片描述
后面的 1 ∣ r ∣ < = 1 1_{|r|<=1} 1r<=1就是Htanh函数。

在具体使用时,对于隐藏层单元,直接使用使用确定式二值化函数得到二值化的激活值。然后,对于权重,在进行参数更新时要时刻将超出[-1,1]的部分裁掉,即权重参数始终是[-1,1]之间的实数。最后,在使用参数时,要将参数二值化。

BNN的训练

前面已经解决了求导问题,二值化模型就可以直接训练了,具体过程如Algorithm1,这里用了BN层。

Train Algorithm
可以看到整个流程就是前向传播,反向传播,参数更新。

Shift Based Batch Normalization

Batch Normalization,简称BN,即批量归一化。所谓的BN是指在数据经过一层进入下一层之前,需要对数据进行归一化,使之均值为0,方差为1。这样可以使得各层的参数量级上没有太大的差别。BN有三个优点:

  • 加速训练。
  • 减小权重的值的尺度的影响。
  • 归一化带来的噪声也有模型正则化的作用。

我们来看一下BN的计算公式:

BN
可以发现BN在训练时存在大量的矩阵乘法,导致训练比较长。因为二值化这一特点,所以这里可以对BN进行优化,我们可以在不使用乘法的情况下近似计算BN,这即是Shift Based Batch Normalization,如Algorithm2所示:

Shift Based BN

Shift Based AdaMax

同样也是为了加速二值网络的训练,改进了AdaMax优化器。具体算法如Algorithm3所示。

Shift Based AdaMax

First Layer

虽然所有层的激活值和参数都是二值的,但第一层(输入层)的值是连续的,因为是原始图片。如果要整个网络都是二值化的,只需要对输入层做一个变换即可。一般使用8位的值来表示一个像素,输入可以表达为一个 h e i g h t × w i d t h × 8 height\times width\times 8 height×width×8的张量,而权重参数可以表达为 h e i g h t × w i d t h height\times width height×width的全 1 1 1向量。因此,第一层的计算操作如下:

在这里插入图片描述
这个函数就把像素值还原回来了, x n x^n xn表示每个数的第 n n n位。

综上,最后BNN的计算过程如Algorithm5所示。

BNN的前向计算

测试推理阶段

如何前向推理,大致可以分为以下几种方法:

  • 使用二值化weight。
  • 使用浮点数weight。
  • 从浮点权重和随机二值化可以采样出很多二值网络,将它们的预测输出平均一下作为输出。

这篇论文使用了第3种方法,训练过程中用随机二值权重,测试时用浮点权重可以提升性能,证明了论文前面认为的带噪声的权重具有一定的正则性。

实验结果

在MNIST,CIFAR-10,SVHN上使用前向推理介绍的方法3进行测试的结果

性能分析

论文提到训练时间可以减少60%,但具体怎么计算暂时不清楚,后面了解下源码再说,暂时就理解为计时函数然后比较吧。从下面Table2和Table3的测试结果来看内存访问的耗时比计算耗时要多,相对于32bit的DNN,BNN的内存需求量为原来的1/32,使得能源使用可以减少31/32。

此外,在BNN中,所有的计算都变成了位运算,一个32bit的乘法需要损耗200单位(FPGA上)的能量,而一个位操作只损耗1个单位的能量。这在嵌入式设备上式具有非常大优势的。

能量损耗对比

总结

这篇论文是在BinaryConnect的基础上,同时将权重和激活值量化到1bit,不仅从实验角度证明了量化算法的可行,还分析针对低bit如何进行更有效的计算,整理出了同时量化权重和激活值到1bit的算法流程,且针对内部的硬件计算,给出了具体实现,例如Shift-based Batch Normalization、XNOR-Count,最终训练能减少60%的时间,32倍的存储空间。最近是先读一下理论,后面我会去做Pytorch的代码解析,自己动手训练测试二值网络,请持续关注吧。

思考

可以看到BNN在MNIST,CIFAR10,SVHN上实现了和普通DNN类似的精度,那么BNN能否在更复杂的数据集如ImageNet上也实现和DNN类似的精度并保持效果上的优势呢?另外一点是从论文的BNN需要小的学习率,并且收敛速度比DNN慢很多,这也是一个值得探索的问题。。收敛慢的问题可以从Figure1看出。

可以看到BNN收敛慢很多

附录

  • 论文原文:https://arxiv.org/pdf/1602.02830.pdf
  • 代码:https://github.com/itayhubara/BinaryNet

欢迎关注GiantPandaCV, 在这里你将看到独家的深度学习分享,坚持原创,每天分享我们学习到的新鲜知识。( • ̀ω•́ )✧

有对文章相关的问题,或者想要加入交流群,欢迎添加BBuf微信:

在这里插入图片描述

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二值神经网络Binary Neural Network, BNN)是一种特殊的神经网络结构,它在前向和反向传播过程中只使用二进制数值(+1和-1)来表示网络中的权重和激活值。相对于传统的神经网络BNN显著降低了计算复杂度和存储空间要求,因此在资源有限的设备上具有广泛应用前景。本文将介绍BNN的基础知识和实现方法。 1. BNN的结构 BNN的结构和传统的神经网络类似,包含输入层、隐藏层和输出层,每个神经元都有一个二进制的权重值和一个二进制的激活值。不同的是,BNN使用的是二值权重和激活值,可以通过以下公式来计算: $$w_b = \text{sign}(w)$$ $$a_b = \text{sign}(a)$$ 其中,$w$为权重值,$a$为激活值,$\text{sign}$为符号函数,$w_b$和$a_b$为对应的二值化值。这里的符号函数定义为: $$\text{sign}(x) = \begin{cases} 1, & x>0 \\ -1, & x\leq 0 \end{cases}$$ 通过这样的二值化方式,可以将权重和激活值从浮点数转换为二进制数,从而降低了计算复杂度和存储空间要求。 2. BNN的训练 BNN的训练可以使用传统的反向传播算法,但需要在误差反向传播时考虑到二进制权重的影响。具体来说,误差反向传播过程中权重的梯度计算公式为: $$\frac{\partial E}{\partial w} = \frac{\partial E}{\partial w_b} \cdot \frac{\partial w_b}{\partial w}$$ 其中,$E$为损失函数,$w_b$为二进制权重值,$\frac{\partial E}{\partial w_b}$为二进制权重值的误差梯度,$\frac{\partial w_b}{\partial w}$为二进制权重值相对于实际权重值的导数。由于符号函数的导数几乎处处为零,因此可以将$\frac{\partial w_b}{\partial w}$设为常数$c$,比如$c=1$。 对于二值化激活值,可以使用Straight-Through Estimator(STE)方法来进行梯度传递。具体来说,STE方法将实际梯度传递给二值化激活值,但在反向传播时仅传递符号函数的导数。这样可以保证在反向传播时二值化激活值不会被修改。 3. BNN的优缺点 相较于传统的神经网络BNN具有以下优点: - 计算复杂度低:二值化后的权重和激活值只需要进行简单的位运算,大大降低了计算复杂度。 - 存储空间小:二进制权重和激活值可以用更少的存储空间来表示,因此可以在资源有限的设备上使用。 - 低功耗:由于计算复杂度低,BNN可以在功耗有限的环境下运行。 但是,BNN也存在一些缺点: - 精度低:二值化后的权重和激活值只能表示正负两个值,因此可能会影响模型的精度。 - 训练困难:由于二值化的非线性特性,BNN的训练过程可能会比传统神经网络更加困难。 4. BNN的应用 BNN的应用非常广泛,特别是在资源有限的设备上,如嵌入式系统、移动设备等。常见的应用包括: - 物体识别:BNN可以用于嵌入式设备上的物体识别任务,如人脸识别、手势识别等。 - 语音识别:BNN可以用于移动设备上的语音识别任务,如智能语音助手、语音翻译等。 - 自动驾驶:BNN可以用于嵌入式设备上的自动驾驶任务,如车辆识别、路标识别等。 总的来说,BNN是一种非常有前途的神经网络结构,可以在资源有限的环境下实现高效的计算和存储。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值