XNOR-Net

论文:XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks

Github:https://github.com/allenai/XNOR-Net

yolo的作者Joseph Redmon 作为三作的论文,论文提出了
权重二值网络(Binary-Weight-Networks(BWN))和全二值 异或网络(XNOR-Net)

本篇文章是在Binary-weight-network(BWN)和BinaryConnect(BC)两篇文章基础上做出改进。主要改进有两点:

1.在对权重进行{-1,+1}量化的同时,加入了尺度因子α;

2.除了对权重进行量化,还对特征值进行了量化,同样引入了尺度因子β,不过β因子重要性不及α。

论文翻译
https://blog.csdn.net/weixin_37904412/article/details/80604425?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

背景

其他方法

剪枝:

1)Hessian矩阵剪枝
2)权重排序剪枝
3)减少激活函数
4)hash函数压缩

dropconnect指出二值化是一种正则化,利于提高精度。本文也证明了BNN 的方法不适合大数据集Imagenet,也就是B CNN

2 B CNN

首先通过文章第一幅图来大致说明量化为何能够压缩和加速网络:

为何第二行包括实数,却没有乘法了呢,哦,只改变原数据的正负,取反符号位即可,再做浮点数加法。对吗?
在这里插入图片描述

BWN

只二值权重W
在这里插入图片描述

利用α把二值矩阵近似成全精度矩阵。

已知W 求解 α 和B

就像神经网络,知道真值,损失函数,用SGD等优化算法求权重和偏置;

那么完全可以也用优化算法求a和B啊

转换为优化问题
在这里插入图片描述
拆开,W是一个已知变量,
在这里插入图片描述
只有一个变量,可以再转化为:
在这里插入图片描述

肉眼可解,最优的方案就是
在这里插入图片描述
即:
在这里插入图片描述
B就是 W的符号,±1

下面就是求最优α,一元二次方程最小值在对角线:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
BTB = n ,n = channel * w * h为权重矩阵的元素个数

代入B*,矩阵乘自己的符号累加,负的变正的,正的还是正的,然后加起来。这就是L1L1范数。

在这里插入图片描述

训练方法

在这里插入图片描述
两个过程:

  • 前向传播用二值,
  • 求导反向的时候,最后更新的是高精度W,

所以需要对二值W~进行链式法则求导。
而对二值W~求导涉及到了符号函数的求导,怎么办?

就在前人肩膀上不做改变,使用BNN的Htanh()(crop())函数,可见上篇文章

权重更新公式是反向里最麻烦的,具体推导如下

估计值由上边公式代入可知:
在这里插入图片描述

Wi更新公式:利用链式法则和代入,再根据对估值用乘法的求导,前后导数的和(公式里的α分别用了代入和没代入的,不知道作者为啥这样写,感觉不够统一不方便理解):

在这里插入图片描述
更新之后的 W会得到新的α B,αB就是W~,继续前传。。。

因此核心就是多了个尺度因子α,

Q:但是α也是实数化的矩阵啊,真的起到简化的作用了吗,B也不能算是最后权重,不知道所欲为何

先看全二值吧

XNOR

把激活值输入X也作二值近似,

上述的优化是对W,这里进一步,XW

整体看,就是
在这里插入图片描述

在这里插入图片描述
与上一节衔接,利用已有二值权重的话,把C拆开,就是X也做二值近似
在这里插入图片描述
在这里插入图片描述

对激活值也量化X=βH,其中H也是{-1,1},β是它的尺度系数,

优化转换为

在这里插入图片描述
圆圈点表示elentment-wise乘积,逐个点乘积,
Q:这里为啥把矩阵乘法变成点积?
暂时不管,先按照上节的解法求C*,r*

求解

在这里插入图片描述
在这里插入图片描述
Q:这个近似多除以一个n,可以近似吗?

卷积操作有冗余,咋办

原算法是先算出每个位置(X)的β和H, 其中β = (1 / n)* || X ||,n-=channelwh
实际上H矩阵就是对原矩阵进行sign操作而已,根本没必要对每个位置(X)求对应的H,直接对输入 I 实际上是一个更为简洁的做法 。既然如此,何不直接先算出每个位置对应的β,形成一个β矩阵,然后β矩阵和sign( I )就代表输入的量化了。

实际上减少channel维度的多次冗余。

先对输入I在通道维度求绝对值的均值得到
在这里插入图片描述
然后让A和2D的卷积核k做卷积得到K=A*k
在这里插入图片描述
在这里插入图片描述
A矩阵和均值滤波器k 卷积 对A矩阵均值滤波后得到K矩阵,K矩阵的每个元素实际就是每个位置(X)对应的β,包含了输入I对应的所有缩放因子 β

Q:为什么平均之后就可以去了冗余呢

这样在带入
在这里插入图片描述
这里的 ※表示的是只使用XNOR和bitcount操作,卷积包括重复shift操作和点乘,shift指的是filter在输入图上进行移动,当输入输出都变为二值时,将权重和激活值的尺度系数提取出来之后,卷积可以变成xnor-bitcounting操作。

前向传播

在这里插入图片描述

反向传播与BWN算法相同

plus

可以二值化梯度

可以通过位操作来提高训练效率。

可以kbit 量化

在这里插入图片描述

效果

在这里插入图片描述

上面部分花了很大篇幅去求β矩阵,但是作者实验发现,其实没有β因子,对结果影响不大,所以,代码压根没算β矩阵

CODE

https://github.com/jiecaoyu/XNOR-Net-PyTorch
https://github.com/cooooorn/Pytorch-XNOR-Net

ref
https://www.jianshu.com/p/8a32eae3415e

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值