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|含义:

图片来源于[3]

, 这里表示当|r|<=1时,Sign(r)的梯度等于1;否则,均为0。可见,这样处理,既保留了梯度信息,当r太大时,又取消梯度,加速网络的收敛。这就相当于,用HTanh(x)代替Sign(x)[3]

二值化神经网络(BNN)基础学习(一)的更多相关文章

  1. XNOR-Net:二值化卷积神经网络

    https://www.jianshu.com/p/f9b015cc4514 https://github.com/hpi-xnor/BMXNet  BMXNet:基于MXNet的开源二值神经网络实现 ...

  2. 深度学习实践-强化学习-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) ...

  3. 《opencv学习》 之 OTSU算法实现二值化

    主要讲解OTSU算法实现图像二值化:    1.统计灰度级图像中每个像素值的个数. 2.计算第一步个数占整个图像的比例. 3.计算每个阈值[0-255]条件下,背景和前景所包含像素值总个数和总概率(就 ...

  4. 机器学习实战基础(十二):sklearn中的数据预处理和特征工程(五) 数据预处理 Preprocessing & Impute 之 处理分类特征:处理连续性特征 二值化与分段

    处理连续性特征 二值化与分段 sklearn.preprocessing.Binarizer根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量.大于阈值的值映射为1,而小于或等于阈值的值 ...

  5. [转载+原创]Emgu CV on C# (四) —— Emgu CV on 全局固定阈值二值化

    重点介绍了全局二值化原理及数学实现,并利用emgucv方法编程实现. 一.理论概述(转载,如果懂图像处理,可以略过,仅用作科普,或者写文章凑字数)  1.概述 图像二值化是图像处理中的一项基本技术,也 ...

  6. Opencv实现图像的灰度处理,二值化,阀值选择

    前几天接触了图像的处理,发现用OPencv处理确实比較方便.毕竟是非常多东西都封装好的.可是要研究里面的东西,还是比較麻烦的,首先,你得知道图片处理的一些知识,比方腐蚀,膨胀,仿射,透射等,还有非常多 ...

  7. [置顶] c#验证码识别、图片二值化、分割、分类、识别

    c# 验证码的识别主要分为预处理.分割.识别三个步骤 首先我从网站上下载验证码 处理结果如下: 1.图片预处理,即二值化图片 *就是将图像上的像素点的灰度值设置为0或255. 原理如下: 代码如下: ...

  8. python-opencv 图像二值化,自适应阈值处理

    定义:图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果. 一幅图像包括目标物体.背景还有噪声,要想从多值的数字图像中直接提取出目标物体,常用 ...

  9. 数据预处理:规范化(Normalize)和二值化(Binarize)

    注:本文是人工智能研究网的学习笔记 规范化(Normalization) Normalization: scaling individual to have unit norm 规范化是指,将单个的样 ...

随机推荐

  1. antd pro 分支

    添加图片 这两种都可以 form表单问题 1 @Form.create() 这是绑定表单和组件,必须有,这样就能从this.props 中找到Form了 2 Select 要写initialValue ...

  2. Vue—组件传值及vuex的使用

    一.父子组件之间的传值 1.父组件向子组件传值: 子组件在props中创建一个属性,用以接收父组件传来的值 父组件中注册子组件 在子组件标签中添加子组件props中创建的属性 把需要传给子组件的值赋给 ...

  3. JasperReports® Library | Jaspersoft Community

    JasperReport报表导出踩坑实录 - 小卖铺的老爷爷 - 博客园https://www.cnblogs.com/laoyeye/p/7707149.html jasperreport_百度百科 ...

  4. Java的常量和变量

    一.标识符 如类名,数字不能作为标识符的首字母(以字母或者下划线或者$开头且不能有空格) 注意和Python的区别,Python中标识符由字母.下划线和数字组成,且数字不能开头,也是严格区分大小写(但 ...

  5. git总结一、工作中常用基础命令

    首先来了解两个概念: 工作区:比如你的项目目录 暂存区:git和其他版本控制系统的不同之处就是有这个暂存区的概念. .git不是工作区,而是git 版本库,在版本库中存放着很多东西,比如暂存区(sta ...

  6. 代理与hook

    参考:Java 动态代理 代理是什么 为什么需要代理呢?其实这个代理与日常生活中的“代理”,“中介”差不多:比如你想海淘买东西,总不可能亲自飞到国外去购物吧,这时候我们使用第三方海淘服务比如惠惠购物助 ...

  7. P1438 无聊的数列 (差分+线段树)

    题目 P1438 无聊的数列 解析: 先考虑修改,用差分的基本思想,左端点加上首项\(k\),修改区间\((l,r]\)内每个数的差分数组都加上公差\(d\),最后的\(r+1\)再减去\(k+(r- ...

  8. HTML&CSS_基础04

    一.常见的选择器 1. 元素选择器 选择页面中指定的元素 2. id选择器 语法:#id属性值{} 3. 类选择器 语法:.class属性值{} 可以为同一个元素设置多个属性值,多个值之间用空格隔开 ...

  9. Vue js 的生命周期(看了就懂)

    转自: https://blog.csdn.net/qq_24073885/article/details/60143856 用Vue框架,熟悉它的生命周期可以让开发更好的进行. 首先先看看官网的图, ...

  10. mac与windows共享键盘鼠标(synergy)

    桌面上有两台电脑, 一台mac一台windows, 由于桌面空间紧张, 放两套键盘鼠标有点浪费空间, 如果能让mac和windows共享键盘鼠标就好了, 经过一番搜寻, 找到了一款名为synergy的 ...