二值化神经网络——BNN

二值化神经网络——BNN


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

什么BNN?

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

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.
其中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} 网络

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

BNN有什么优势?

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

如何计算梯度?

虽然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))
在这里插入图片描述
二值化操做函数为:
q = sign ( r ) q=\operatorname{sign}(r) spa

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

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

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