二值化神经网络——BNN

二值化神经网络——BNN


前言: 最近在研究FBN的时候看到了BNN这个概念,论文中有很多的概念都和BNN相关,这里记录一下对于BNN的理解

什么BNN?

BNN全称Binarized Neural Networks中文译作二值化神经网络。其核心的思想就算把权重矩阵中权重值和各个激活函数的函数值同时二值化得到的神经网络.我们通过有两个二值化函数可以用来完成这个过程。
第一个是Sign函数

x b = Sign ⁡ ( x ) = { + 1  if  x ≥ 0 − 1  otherwise  x^{b}=\operatorname{Sign}(x)=\left\{\begin{array}{ll} +1 & \text { if } x \geq 0 \\ -1 & \text { otherwise } \end{array}\right. xb=Sign(x)={+11 if x0 otherwise 
其中x是真实变量值,Sign(x)是符号函数

第二个是随机式的:
x b = { + 1  with probability  p = σ ( x ) − 1  with probability  1 − p σ ( x ) = clip ⁡ ( x + 1 2 , 0 , 1 ) = max ⁡ ( 0 , min ⁡ ( 1 , x + 1 2 ) ) \begin{aligned} &x^{b}=\left\{\begin{array}{ll} +1 & \text { with probability } p=\sigma(x) \\ -1 & \text { with probability } 1-p \end{array}\right.\\ &\sigma(x)=\operatorname{clip}\left(\frac{x+1}{2}, 0,1\right)=\max \left(0, \min \left(1, \frac{x+1}{2}\right)\right) \end{aligned} xb={+11 with probability p=σ(x) with probability 1pσ(x)=clip(2x+1,0,1)=max(0,min(1,2x+1))

随机式的二值化符号函数看起来要稍微复杂一点,也真是因为它在思想过程中比较困难,在实际运用的过程中也是第一种用的要多一些

BNN有什么优点?

通过将权重矩阵二值化,一个权重只占用一个比特,相当于单精度浮点型权重矩阵,网络模型内存消耗理论上能减少32倍。简单来说就是:模型速度更快,所需内存更小,这也是我们进行模型压缩的优化的主要目的

如何计算梯度?

虽然BNN在训练的过程中使用的是二值化的权重和激活值,但是梯度是不可用二值化存储的,原因在于:

  • 随机梯度下降更新参数的时候,梯度的量级很小;
  • 梯度具有累加效应,梯度中是包含噪声的,而噪声一般都是正态分布的,多次累加可以将噪声平均消耗点

而且在计算参数的梯度时,二值化相当于给权重和激活添加了噪声,这类似于正则化的操作让模型的泛化性能更好,我们训练BNN的方法可以看作是Dropout的一种变体,只是计算参数梯度时的Dropout是把激活值设置为0,而二值化网络是对权重和参数进行二值化。

综上所述,我们不能对梯度进行二值化

在BNN中使用了离散化的梯度传播,在反向传播的过程中要用到Sign函数的导数,然而Sign函数的导数几乎处处为0,这点是不客气的。我们需要对Sign函数就行一定的变形,这就得到了Htanh函数
Htanh ⁡ ( x ) = Clip ⁡ ( x , − 1 , 1 ) = max ⁡ ( − 1 , min ⁡ ( 1 , x ) ) \operatorname{Htanh}(x)=\operatorname{Clip}(x,-1,1)=\max (-1, \min (1, x)) Htanh(x)=Clip(x,1,1)=max(1,min(1,x))
在这里插入图片描述
二值化操作函数为:
q = sign ⁡ ( r ) q=\operatorname{sign}(r) q=sign(r)

假设损失函数为C,C对q的导数已知,那么C对r的导数为:
g r = g q 1 ∣ r ∣ ≤ 1 g_{r}=g_{q} 1_{|r| \leq 1} gr=gq1r1
这就算Htanh函数
在具体的算法应用时,对于隐藏层单元:

我们利用符号函数的非线性获得激活值,即直接使用Sign(a)获得二值化后的激活值。
对于权重
Htanh和Sign两种函数都有用到
在对参数进行更新时,对权重使用Htanh函数进行裁减,使得权重永远在[-1, 1]之间;

量化权重时,使用Sign(w)直接得到二值化的权重值

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
二值化神经网络(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是一种非常有前途的神经网络结构,可以在资源有限的环境下实现高效的计算和存储。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值