4.1,二值网络的梯度下降现在的神经网络几乎都是基于梯度下降算法来训练的,但是二值网络的权重只有 \(\pm 1\),无法直接计算梯度信息,也无法进行权重更新 。为解决这个问题,Courbariaux 等人提出二值连接(binary connect)算法 , 该算法采取单精度与二值结合的方式来训练二值神经网络 , 这是第一次给出了关于如何对网络进行二值化和如何训练二值化神经网络的方法 。过程如下:
- 权重
weight
初始化为浮点 - 前向传播
Forward Pass
:- 利用决定化方式(
sign(x)函数
)把 Weight 量化为+1/-1
, 以0为阈值 - 利用量化后的 Weight (只有+1/-1)来计算前向传播 , 由二值权重与输入进行卷积运算(实际上只涉及加法) , 获得卷积层输出 。
- 利用决定化方式(
- 反向传播
Backward Pass
:- 把梯度更新到浮点的 Weight 上(根据放松后的符号函数,计算相应梯度值,并根据该梯度的值对单精度的权重进行参数更新)
- 训练结束: 把 Weight 永久性转化为
+1/-1
, 以便inference
使用
1,如何对权重进行二值化?
权重二值化一般有两种选择:
- 直接根据权重的正负进行二值化:\(x^{b}=sign(x)\) 。符号函数
sign(x)
定义如下:
- 进行随机的二值化,即对每一个权重,以一定概率取 \(\pm 1\)
二值权重的梯度为0 , 无法进行参数更新 。为解决这个问题,需要对符号函数进行放松,即用 \(Htanh(x) = max(-1, min(1,x))\) 来代替 \(sinx(x)\) 。当 x 在区间 [-1,1] 时,存在梯度值 1,否则梯度为 0。
4.3,二值连接算法改进之前的二值连接算法只对权重进行了二值化,但是网络的中间输出值依然是单精度的 , 于是 Rastegari 等人对此进行了改进 , 提出用单精度对角阵与二值矩阵之积来近似表示原矩阵的算法 , 以提升二值网络的分类性能,弥补二值网络在精度上弱势 。该算法将原卷积运算分解为如下过程:
\[I \times W\approx (I \times B)\alpha\]其中 \(I\in \mathbb{R}^{c\times w_{in}\times h_{in}}\) 为该层的输入张量,\(I\in \mathbb{R}^{c\times w\times h}\) 为该层的一个滤波器,\(B=sign(W)\in \{+1, -1\}^{c \times w\times h}\)为该滤波器所对应的二值权重 。
这里,Rastegari 等人认为单靠二值运算,很难达到原单精度卷积元素的结果,于是他们使用了一个单精度放缩因子 \(\alpha \in \mathbb{R}^{+}\) 来对二值滤波器卷积后的结果进行放缩 。而 \(\alpha\) 的取值,则可根据优化目标:
\[min \left \| W -\alpha B \right \|^{2}\]得到 \(\alpha = \frac{1}{n}\left |W \right |\ell{1}\) 。二值连接改进的算法训练过程与之前的算法大致相同,不同的地方在于梯度的计算过程还考虑了 \(\alpha\) 的影响 。由于 \(\alpha\) 这个单精度的缩放因子的存在,有效降低了重构误差 , 并首次在 ImageNet 数据集上取得了与 Alex-Net 相当的精度 。如下图所示:
文章插图
可以看到的是
权重二值化神经网络(BWN)
和全精度神经网络的精确度几乎一样 , 但是与异或神经网络(XNOR-Net)相比而言 , Top-1 和 Top-5 都有 10+% 的损失 。相比于权重二值化神经网络,异或神经网络将网络的输入也转化为二进制值,所以,异或神经网络中的乘法加法 (Multiplication and ACcumulation) 运算用按位异或 (bitwise xnor) 和数 1 的个数 (popcount) 来代替 。更多内容,可以看这两篇文章:
- https://github.com/Ewenwan/MVision/tree/master/CNN/Deep_Compression/quantization/BNN
- 二值神经网络(Binary Neural Network , BNN)
- 不要使用 kernel = (1, 1) 的
Convolution
(包括 resnet 的 bottleneck):二值网络中的 weight 都为 1bit, 如果再是 1x1 大小,会极大地降低表达能力 - 增大
Channel
数目 + 增大 activation bit 数 要协同配合:如果一味增大 channel 数,最终 feature map 因为 bit 数过低,还是浪费了模型容量 。同理反过来也是 。 - 建议使用 4bit 及以下的
activation bit
, 过高带来的精度收益变?。?而会显著提高 inference 计算量推荐阅读
- tensorflow-gpu版本安装及深度神经网络训练与cpu版本对比
- Learning Records 计算机网络
- Springboot 之 Filter 实现超大响应 JSON 数据压缩
- 手机网络怎么连接上电视(手机通过type-c连接电视)
- 一 网络安全主动进攻之DNS基础和ettercap实现DNS流量劫持
- TCP和UDP的区别与联系以及网络字节序和主机字节序的转换函数实践
- Go的网络编程详解
- 红米note11Pro怎么设置5G_设置5G网络方法
- Springboot 之 Filter 实现 Gzip 压缩超大 json 对象
- 对循环神经网络参数的理解|LSTM RNN Input_size Batch Sequence