二值化神经网络(BNN)基础学习(一)
1.简介
二值化神经网络,在浮点型(权重值和激活函数值存储类型,32bit)神经网络的基础,将其权重和激活函数值进行二值化(+1,-1存储,只需1bit)得到的神经网络。[1]
BNN可用于嵌入式或移动场景(例如手机端、可穿戴设备、自动驾驶汽车等)[1],这些场景都没有GPU且计算能力和存储容量相对较弱且限制较大,具有研究的价值和意义。
2.优点
既然参数值存储位数变少,其运算速度和存储空间必然能较原来神经网络有所提升,同时在训练效果上有所提升。
存储空间上,通过将权重矩阵二值化,一个权重值只占用一个比特,相比于单精度浮点型权重矩阵,网络模型的内存消耗理论上能减少32倍,因此BNN在模型压缩上具有很大的优势。[1]
运算速度上,权重值和激活函数值进行二值化之后,原来32位浮点型数的乘加运算,可以通过一次异或运算和一次popcnt(population count 统计有多少个为1的位)运算解决,在模型加速上具有很大的潜力。[1]
训练效果上,有的时候二值网络的训练效果甚至会超越全精度网络,因为二值化过程给神经网络的权重和激活值带来了noise,像dropout一样,反而是一种regularization,可以部分避免网络的overfitting。[2]
3.基本原理
方法来自于Bengio组2016年发表《Binarynet: Training deep neural networks with weights and activations constrained to +1 or -1》。
3.1 权重和激活值二值化[3]
Deterministic(确定法):大于等于0,取+1;否则,取-1

Stochastic(统计法):以一定的概率,取+1,或-1
作者采用确定法,在前向传播过程中,经过Sign函数,可以将实数型的权值和激活值量化成+1,-1,当用于预测时,参数值仅为+1或-1,可以减小参数的内存占用和运算量;但是,训练时,仍需要对实数型的权值和激活值计算梯度,并以此更新权值。论文中说到这里如果不是实际值的话,梯度处处为0,无法进行梯度下降。
3.2 乘法优化
用Xnor代替乘法的可行性:
假如用0表示-1,那么原来的二值乘法运算,与Xnor的真值表一样,所以,用Xnor代替乘法是合理、可行的。

例:a=[1,-1, 1, 1, -1],W=[-1,1,1,-1,-1]
正常乘法操作:a1xw1+a2xw2+a3xw3+a4xw4+a5xw5 =1x-1+-1x1+1x1+1x-1+-1x-1=-1
转成Xnor的计算方式:在程序中,a=[1,0,1,1,0],W=[0,1,1,0,0]表示的,
a^W=[1^0,0^1,1^1,1^0,0^0]=[1,1,0,1,0]
Popcount(a^w)=3
用vec_len表示向量元素个数的话,那么用xnor代替正常的乘累加(卷积),可以用通式:-(2Popcount(a^w)-vec_len)来计算,此例结果为 -(2Popcount(a^w)-5) = -1
3.3 权重和激活值更新
网络前向传播算法:

对所有层循环,符合函数对当前权重Wk二值化,记为Wbk ,然后与上层激活值abk-1相乘在进行BN得本层激活值ak ,如果不是最后一层,则ak进行二值化。
网络反向传播算法:

对所有层循环(倒序),如果k不是第一层,则计算梯度gak ,其中1|ak|含义:

, 这里表示当|r|<=1时,Sign(r)的梯度等于1;否则,均为0。可见,这样处理,既保留了梯度信息,当r太大时,又取消梯度,加速网络的收敛。这就相当于,用HTanh(x)代替Sign(x)[3]
二值化神经网络(BNN)基础学习(一)的更多相关文章
- XNOR-Net:二值化卷积神经网络
https://www.jianshu.com/p/f9b015cc4514 https://github.com/hpi-xnor/BMXNet BMXNet:基于MXNet的开源二值神经网络实现 ...
- 深度学习实践-强化学习-bird游戏 1.np.stack(表示进行拼接操作) 2.cv2.resize(进行图像的压缩操作) 3.cv2.cvtColor(进行图片颜色的转换) 4.cv2.threshold(进行图片的二值化操作) 5.random.sample(样本的随机抽取)
1. np.stack((x_t, x_t, x_t, x_t), axis=2) 将图片进行串接的操作,使得图片的维度为[80, 80, 4] 参数说明: (x_t, x_t, x_t, x_t) ...
- 《opencv学习》 之 OTSU算法实现二值化
主要讲解OTSU算法实现图像二值化: 1.统计灰度级图像中每个像素值的个数. 2.计算第一步个数占整个图像的比例. 3.计算每个阈值[0-255]条件下,背景和前景所包含像素值总个数和总概率(就 ...
- 机器学习实战基础(十二):sklearn中的数据预处理和特征工程(五) 数据预处理 Preprocessing & Impute 之 处理分类特征:处理连续性特征 二值化与分段
处理连续性特征 二值化与分段 sklearn.preprocessing.Binarizer根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量.大于阈值的值映射为1,而小于或等于阈值的值 ...
- [转载+原创]Emgu CV on C# (四) —— Emgu CV on 全局固定阈值二值化
重点介绍了全局二值化原理及数学实现,并利用emgucv方法编程实现. 一.理论概述(转载,如果懂图像处理,可以略过,仅用作科普,或者写文章凑字数) 1.概述 图像二值化是图像处理中的一项基本技术,也 ...
- Opencv实现图像的灰度处理,二值化,阀值选择
前几天接触了图像的处理,发现用OPencv处理确实比較方便.毕竟是非常多东西都封装好的.可是要研究里面的东西,还是比較麻烦的,首先,你得知道图片处理的一些知识,比方腐蚀,膨胀,仿射,透射等,还有非常多 ...
- [置顶] c#验证码识别、图片二值化、分割、分类、识别
c# 验证码的识别主要分为预处理.分割.识别三个步骤 首先我从网站上下载验证码 处理结果如下: 1.图片预处理,即二值化图片 *就是将图像上的像素点的灰度值设置为0或255. 原理如下: 代码如下: ...
- python-opencv 图像二值化,自适应阈值处理
定义:图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果. 一幅图像包括目标物体.背景还有噪声,要想从多值的数字图像中直接提取出目标物体,常用 ...
- 数据预处理:规范化(Normalize)和二值化(Binarize)
注:本文是人工智能研究网的学习笔记 规范化(Normalization) Normalization: scaling individual to have unit norm 规范化是指,将单个的样 ...
随机推荐
- PHP字符串函数、常量、数组排序
PHP字符串函数.常量.数组排序 strlen() 说明:strlen(),可以统计字符串长度 用途:strlen() 常用于循环和其他函数,在确定字符串何时结束很重要时.(例如,在循环中,我们也许需 ...
- npm包--rimraf
含义 rimraf 包的作用:以包的形式包装rm -rf命令,用来删除文件和文件夹的,不管文件夹是否为空,都可删除. 安装 npm install rimraf --save-dev 使用 const ...
- java-环境变量的配置
java基础教程 链接:https://pan.baidu.com/s/1dGHrkghUJi2lew8dbWlIvg 提取码:87mi
- C++购书系统
C++购书系统——来自班里某位同学的小学期作业 这是一个购书系统,模拟网上购书的流程.用户可以在这个小程序里输入对应的数字进行浏览书籍信息,查看用户信息,查找书籍,购买书籍以及查询个人订单的操作. 以 ...
- Excel阅读模式/聚光灯开发技术序列作品之三 高级自定义任务窗格开发原理简述—— 隐鹤
Excel阅读模式/聚光灯开发技术序列作品之三 高级自定义任务窗格开发原理简述—— 隐鹤 1. 引言 Excel任务窗格是一个可以用来存放各种常用命令的侧边窗口(准确的说是一个可以停靠在类名为x ...
- WMI入门教程之WMI中的类在哪里?
Powershell专栏: https://www.jb51.net/list/list_234_1.htm https://www.pstips.net/get-wmiobject-becomes- ...
- python3的字符串和字节
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分.文本总是Unicode(16进制) ...
- Spring MVC 使用介绍(十三)数据验证 (一)基本介绍
一.消息处理功能 Spring提供MessageSource接口用于提供消息处理功能: public interface MessageSource { String getMessage(Strin ...
- [JSOI2009]密码 [AC自动机]
题面 bzoj luogu 首先看到这题就知道随便暴枚 只要是多项式算法都能过 先常规建AC自动机 注意被别的单词包含的单词没有存在的价值 剩余单词状压 大力dp f[长度][节点编号][状态] \( ...
- My Todo-List
有些事情要明着写出来才会去干. 这里是一个不断更新的Todo-List,大致按照重要度和列出时间排序. 主要着眼短期计划,其中的大部分事务应该在一周内解决,争取不做一只鸽子. 填好模板库的坑. 学习树 ...