当前位置: 首页 > 编程日记 > 正文

信息保留的二值神经网络IR-Net,落地性能和实用性俱佳 | CVPR 2020

出品 | AI科技大本营(ID:rgznai100)

导语:在CVPR 2020上,商汤研究院链接与编译组和北京航空航天大学刘祥龙老师团队提出了一种旨在优化前后向传播中信息流的实用、高效的网络二值化新算法IR-Net。不同于以往二值神经网络大多关注量化误差方面,本文首次从统一信息的角度研究了二值网络的前向和后向传播过程,为网络二值化机制的研究提供了全新视角。同时,该工作首次在ARM设备上进行了先进二值化算法效率验证,显示了IR-Net部署时的优异性能和极高的实用性,有助于解决工业界关注的神经网络二值化落地的核心问题。

动机

二值神经网络因其存储量小、推理效率高而受到社会的广泛关注 [1]。然而与全精度的对应方法相比,现有的量化方法的精度仍然存在显著的下降。

对神经网络的研究表明,网络的多样性是模型达到高性能的关键[2],保持这种多样性的关键是:(1) 网络在前向传播过程中能够携带足够的信息;(2) 反向传播过程中,精确的梯度为网络优化提供了正确的信息。二值神经网络的性能下降主要是由二值化的有限表示能力和离散性造成的,这导致了前向和反向传播的严重信息损失,模型的多样性急剧下降。同时,在二值神经网络的训练过程中,离散二值化往往导致梯度不准确和优化方向错误。如何解决以上问题,得到更高精度的二值神经网络?这一问题被研究者们广泛关注,本文的动机在于:通过信息保留的思路,设计更高性能的二值神经网络。

基于以上动机,本文首次从信息流的角度研究了网络二值化,提出了一种新的信息保持网络(IR-Net):(1)在前向传播中引入了一种称为Libra参数二值化(Libra-PB)的平衡标准化量化方法,最大化量化参数的信息熵和最小化量化误差;(2) 在反向传播中采用误差衰减估计器(EDE)来计算梯度,保证训练开始时的充分更新和训练结束时的精确梯度。

IR-Net提供了一个全新的角度来理解二值神经网络是如何运行的,并且具有很好的通用性,可以在标准的网络训练流程中进行优化。作者使用CIFAR-10和ImageNet数据集上的图像分类任务来评估提出的IR-Net,同时借助开源二值化推理库daBNN进行了部署效率验证。

方法设计

高精度二值神经网络训练的瓶颈主要在于训练过程中严重的信息损失。前向sign函数和后向梯度逼近所造成的信息损失严重影响了二值神经网络的精度。为了解决以上问题,本文提出了一种新的信息保持网络(IR-Net)模型,它保留了训练过程中的信息,实现了二值化模型的高精度。

前向传播中的Libra Parameter Binarization(Libra-PB)

在此之前,绝大多数网络二值化方法试图减小二值化操作的量化误差。然而,仅通过最小化量化误差来获得一个良好的二值网络是不够的。因此,Libra-PB设计的关键在于:使用信息熵指标,最大化二值网络前向传播过程中的信息流。

根据信息熵的定义,在二值网络中,二值参数Qx(x)的熵可以通过以下公式计算:

如果单纯地追求量化误差最小化,在极端情况下,量化参数的信息熵甚至可以接近于零。因此,Libra-PB将量化值的量化误差和二值参数的信息熵同时作为优化目标,定义为:

在伯努利分布假设下,当p=0.5时,量化值的信息熵取最大值。

因此,在Libra-PB通过标准化和平衡操作获得标准化平衡权重,如图2所示,在Bernoulli分布下,由Libra-PB量化的参数具有最大的信息熵。有趣的是,对权重的简单变换也可以极大改善前向过程中激活的信息流。因为此时,各层的二值激活值信息熵同样可以最大化,这意味着特征图中信息可以被保留。

在以往的二值化方法中,为了使量化误差减小,几乎所有方法都会引入浮点尺度因子来从数值上逼近原始参数,这无疑将高昂的浮点运算引入其中。在Libra-PB中,为了进一步减小量化误差,同时避免以往二值化方法中代价高昂的浮点运算,Libra-PB引入了整数移位标量s,扩展了二值权重的表示能力。

因此最终,针对正向传播的Libra参数二值化可以表示如下:

IR-Net的主要运算操作可以表示为:

反向传播中的Error Decay Estimator(EDE)

由于二值化的不连续性,梯度的近似对于反向传播是不可避免的,这种对sign函数的近似带来了两种梯度的信息损失,包括截断范围外参数更新能力下降造成的信息损失,和截断范围内近似误差造成的信息损失。为了更好的保留反向传播中由损失函数导出的信息,平衡各训练阶段对于梯度的要求,EDE引入了一种渐进的两阶段近似梯度方法。

第一阶段:保留反向传播算法的更新能力。将梯度估计函数的导数值保持在接近1的水平,然后逐步将截断值从一个大的数字降到1。利用这一规则,近似函数从接近Identity函数演化到Clip函数,从而保证了训练早期的更新能力。

第二阶段:使0附近的参数被更准确地更新。将截断保持为1,并逐渐将导数曲线演变到阶梯函数的形状。利用这一规则,近似函数从Clip函数演变到sign函数,从而保证了前向和反向传播的一致性。

各阶段EDE的形状变化如图3(c)所示。通过该设计,EDE减小了前向二值化函数和后向近似函数之间的差异,同时所有参数都能得到合理的更新。

实验结果

作者使用了两个基准数据集:CIFAR-10和ImageNet(ILSVRC12)进行了实验。在两个数据集上的实验结果表明,IR-Net比现有的最先进方法更具竞争力。

Deployment Efficiency

为了进一步验证IR-Net在实际移动设备中的部署效率,作者在1.2GHz 64位四核ARM Cortex-A53的Raspberry Pi 3B上进一步实现了IR-Net,并在实际应用中测试了其真实速度。表5显示,IR-Net的推理速度要快得多,模型尺寸也大大减小,而且IR-Net中的位移操作几乎不会带来额外的推理时间和存储消耗。

论文地址:https://arxiv.org/abs/1909.10788

项目地址:https://github.com/htqin/IR-Net

Reference

[1] Rastegari M, Ordonez V, Redmon J, et al. Xnor-net: Imagenet classification using binary convolutional neural networks[C]//ECCV. Springer, Cham, 2016: 525-542.

[2] Xie B, Liang Y, Song L. Diverse neural network learns true target functions[J]. arXiv preprint arXiv:1611.03131, 2016.

【end】◆有奖征文◆防疫、复工如何并行?天云数据推出人工智能监测方案!到底如何做到事前预防,而不是事后诸葛亮?本周四晚8点,天云数据VP陈勇为各位揭晓答案!扫描下方二维码免费报名~
推荐阅读你的企业在什么情况下需要人工智能?快来看看你需要具备哪些条件与能力吧!64% 的企业未实现智能化,5成公司算法工程师团队规模小于 10人,AI 工程师的机遇在哪里?百度成立互联网医院;钉钉招小学生产品体验师;iOS 13.4 上线 | 极客头条5 亿微博数据疑泄露,Python 爬虫如何避免踩天坑?为什么要在油气行业中应用 IoT?这 8 个应用场景告诉你 IoT 在油气行业中可以做什么自称中本聪的他被法官怒怼:你的证词毫无可信度!你点的每个“在看”,我都认真当成了AI

相关文章:

Jq-table最后一行添加样式

豪情姓名QQE-mail豪情249056406jikeytanggmail.comtony1234567puaggmail.comtony1234567puaggmail.comtony1234567puaggmail.comtony1234567puaggmail.com豪情啊不得了真是的运行代码

Same binary weight (位运算)

题目描述 The binary weight of a positive integer is the number of 1s in its binary representation.for example,the decmial number 1 has a binary weight of 1,and the decimal number 1717 (which is 11010110101 in binary) has a binary weight of 7.Give a positi…

Nginx源码分析--基本数据类型的别名

typedef intptr_t ngx_int_t; typedef uintptr_t ngx_uint_t; typedef intptr_t ngx_flag_t; intptr_t在 # /usr/include/stdint.h 中&#xff0c;下面是stdint.h部分代码 #ifndef _STDINT_H #define _STDINT_H 1#include <features.h> #include…

EnterpriseDB Migration 迁移工具使用测试(2)

下面我们来测试EnterpriseDB Migration 工具对于Oracle 大对象(LOB)的迁移情况&#xff1b; 首先在在Oracle实例Scott模式下创建具有LOB对象的表,如&#xff1a; SQL> create table tlob (t1 int primary key,t2 clob,t3 blob); Table created. -- 并填充数据 SQL> begin…

生物学的机器学习:使用K-Means和PCA进行基因组序列分析 COVID-19接下来如何突变?...

作者 | Andre Ye译者 | 孟翔杰来源 | DeepHub IMBA许多人没有想到&#xff0c;病毒就像地球上为生存而挣扎的其他生物一样&#xff0c;它们会进化或变异。只要看一看人类病毒来源的蝙蝠携带的病毒RNA序列片段即可。AAAATCAAAGCTTGTGTTGAAGAAGTTACAACAACTCTGGAAGAAACTAAGTT…以及…

sql server时间转换

--getdate 获取当前时间select getdate()--dateadd 原有时间加&#xff1a; 2013-02-17 13:20:16 此时间加12个月 select dateadd(MONTH,12,2013-02-17 13:20:16) --返回&#xff1a;2014-02-17 13:20:16.000 &#xff08;参数month可以改为 day&#xff0c;year等日期加相应…

cgdb安装与使用

官网&#xff1a;http://cgdb.github.io/ 安装 # wget http://cgdb.me/files/cgdb-0.6.7.tar.gz # tar -zvxf cgdb-0.6.7.tar.gz # cd cgdb-0.6.7 # ./configure --prefix/usr/local # make && make install 使用 1&#xff1a;cgdb分为上下两栏&#xff0c…

[MFC]多线程传参问题 [AfxBeginThread]

前言MFC中使用多线程比较简单&#xff0c;大家都推荐用AfxBeginThread来实现&#xff0c;但使用过程中确遇到传入this之后不能得到对象内部字段数据的问题。正文一、问题代码1.1 Test.h#pragmaonceclassCTest{public: CTest(void); ~CTest(void); voidThreadMethod…

学习Python,这22个包怎能不掌握?

作者 | Erik-Jan van Baaren译者 | 弯月&#xff0c;责编 | 屠敏头图 | CSDN 下载自东方 IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;以下为译文&#xff1a;如今全球各个行业内 Python 的使用状况怎么样呢&#xff1f;这个问题就是我写这篇文章的初衷。我找…

JSTL标签库的一些基础实例

如题所示&#xff0c;只是一些简单的入门实例&#xff0c;代码如下&#xff1a;<% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <%taglib prefix"c" uri"http://java.sun.com/jsp/jstl/core"%…

旷视提Circle Loss,统一优化视角,革新深度特征学习范式 | CVPR 2020

作者 | 旷视研究院本文是旷视 CVPR 2020的被收录论文解读第。它提出用于深度特征学习的Circle Loss&#xff0c;从相似性对优化角度正式统一了两种基本学习范式&#xff08;分类学习和样本对学习&#xff09;下的损失函数。通过进一步泛化&#xff0c;Circle Loss 获得了更灵活…

收藏好玩的网站

1.输名字出照片 http://turnyournameintoaface.com/?name2.看google页面可以做成这样http://mrdoob.com/projects/chromeexperiments/google_gravity/3. 有趣的在线人脸变动物&#xff08;川剧中有变脸&#xff0c;其实你也可以滴&#xff01;&#xff09;http://youwild.org/…

GDB 格式化结构体输出

set print address set print address on 打开地址输出&#xff0c;当程序显示函数信息时&#xff0c;GDB会显出函数的参数地址。系统默认为打开的&#xff0c; show print address 查看当前地址显示选项是否打开。 set print array set print array on 打开数组显示&#xff…

Kinect For Windows V2开发日志九:侦测并绘制人体骨架

简介 在上一篇《侦测、追踪人体骨架》里&#xff0c;介绍了关节点的使用办法&#xff0c;这一篇记录将关节点与OpenCV结合的绘图方法。 代码 #include <iostream> #include <opencv2\imgproc.hpp> #include <opencv2\calib3d.hpp> #include <opencv2\high…

拨号连接或 ××× 连接的错误代码列表

本文列出了在使用Windows 2000、Windows XP 或 Windows Server 2003 作为客户机&#xff0c;建立拨号连接或 连接时可能收到的错误代码。注意&#xff1a;只有在尝试连接到正运行Windows 2000 或更高版本的路由和远程访问服务器时&#xff0c;才会看到编号高于 900 的错误代码…

“程序员数学不行,干啥都不行!”高级开发:90%都是瞎努力!

之前有很多读者留言向我们反馈&#xff1a;数学不好做算法优化&#xff0c;每次遇到不一样的问题就不会了&#xff0c;要是赶上面试基本就凉凉了。平时很难搞懂像数据结构、算法、复杂的语句等等&#xff0c;因为这些核心原理都是数学。而且光会基础数学远远不够&#xff0c;还…

Redis源码分析--lookupKey函数查看value值

lookupKey函数查看value值 robj *lookupKey(redisDb *db, robj *key) {dictEntry *de dictFind(db->dict,key->ptr);if (de) {robj *val dictGetVal(de);/* Update the access time for the ageing algorithm.* Dont do it if we have a saving child, as this will t…

PHP获取时间排除周六、周日的两个方法

//方法一&#xff1a; <?php $now time(); //指定日期用法 $now strtotime(2014-01-08) ; $day 3600*24; $total 12;$days array() ;for ($i2;$i<$total;$i) {$timer $now$day*$i;$num date("N",$timer)-2; //周一开始if($num>-1 and $num<3){if(c…

SMS2003 SP3+SQL Server2000 SP4部署(下)

<?xml:namespace prefix o />SMS2003 SP3SQL Server2000 SP4部署(下)<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />E.SMS2003安装在berlin上放入SMS2003光盘镜像&#xff0c;选择SMS2003出现SMS2003安装向导&#xff…

redis源码分析--zslRandomLevel位运算解析

与&运算 0376的二进制就是1111 1110&#xff0c;二进制的与运算规则是&#xff0c;只有两个数同时为1时&#xff0c;则结果才为1&#xff0c;只要有一个数为0&#xff0c;则结果就为0。比如1&11; 1&00; 0&10; 0&00;因此把一个字符与二进制1111 1110进行与…

从零开始构建:使用CNN和TensorFlow进行人脸特征检测

作者 | Shubham Panchal译者 | 孟翔杰来源 | DeepHub IMBA出品 | AI科技大本营&#xff08;rgznai100&#xff09;人脸检测系统在当今世界中具有巨大的用途&#xff0c;这个系统要求安全性&#xff0c;可访问性和趣味性&#xff01;今天&#xff0c;我们将建立一个可以在脸上绘…

scope重定义

.directive(myAttr, function() {return {restrict: E,scope: {customerInfo: info},template: Name: {{customerInfo.name}} Address: {{customerInfo.address}}<br> Name: {{vojta.name}} Address: {{vojta.address}}}; }); directive中的几个属性&#xff1a; restric…

基于轮廓调整的SOTA实例分割方法,速度达32.3fps | CVPR 2020

作者 | VincentLee来源 | 晓飞的算法工程笔记介绍实例分割是许多计算机视觉任务中的重要手段&#xff0c;目前大多数的算法都采用在给定的bbox中进行pixel-wise分割的方法。受snake算法和Curve-GCN的启发&#xff0c;论文采用基于轮廓的逐步调整策略&#xff0c;提出了Deep sna…

Redis运行流程源码解析

原文作者&#xff1a;凡趣科技 pesiwang 原文地址&#xff1a;http://blog.nosqlfan.com/html/4007.html 本文分析源码基于 Redis 2.4.7 stable 版本。 概述 Redis通过定义一个 struct redisServer 类型的全局变量server 来保存服务器的相关信息&#xff08;比如&#xff1a…

2010年5月blog汇总:OpenExpressApp、其他

OpenExpressApp 信息系统开发平台OpenExpressApp &#xff0d; 框架待完善工作事项信息系统开发平台OpenExpressApp &#xff0d; 报表模块支持ReportObjectView信息系统开发平台OpenExpressApp &#xff0d; 从compositewpf到MEF信息系统开发平台OpenExpressApp &#xff0d; …

注意!Linux glibc再曝漏洞,可导致Linux软件劫持

2019独角兽企业重金招聘Python工程师标准>>> glibc是GNU发布的libc库&#xff0c;即c运行库。它是Linux系统中最底层的API&#xff0c;几乎其它运行库都会依赖于glibc。 近日&#xff0c;Google和Red Hat的安全人员发现GNU C Library (glibc)中存在严重的安全漏洞&a…

redis常用命令参考

操作Redis数据库 下面我们来简单的操作一下数据库。在实例开启的情况下&#xff1a; 1、插入数据 redis 127.0.0.1:6379> set name wwl   OK 设置一个key-value对。 2、查询数据 redis 127.0.0.1:6379> get name   "wwl" 取出key所对应的value。 3、删除键…

Script:收集UNDO诊断信息

以下脚本可以用于收集Automatic Undo Management的必要诊断信息&#xff0c;以sysdba身份运行: spool Undo_Diag.out ttitle off set pages 999 set lines 150 set verify off set termout off set trimout on set trimspool onREM REM ----------------------------------…

又要头秃?2020年七大AI编程语言大盘点

作者 | Claire D译者 | 苏本如&#xff0c;编辑 | 伍杏玲来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;人工智能已成为我们日常生活不可或缺的一部分&#xff0c;它被广泛地应用到几百种实际场景中&#xff0c;极大地便利人们的工作和生活。随着近年来的发展&…

I.MX6 bq27441 driver hacking

/************************************************************************** I.MX6 bq27441 driver hacking* 声明&#xff1a;* 本文主要是记录对电池计量芯片bq27441芯片驱动注册过程进行代码跟踪。** 2016-2-…