百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

INQ问世,让深度神经网络百倍无损压缩美梦成真!

wptr33 2025-02-28 17:40 8 浏览

智东西

文 | 英特尔中国研究院

近几年来,深度学习技术在计算机视觉、语音识别和自然语言处理等诸多领域取得的了一系列重大突破。然而,深度学习的发展依然面临诸多问题。尤为突出的是,时下主流的深度神经网络,一般包含数千万甚至是过亿的学习参数,而如此海量的参数给神经网络模型在存储、计算和功耗开销等方面带来了严峻的考验。

针对上述问题,英特尔中国研究院于近期提出了一种名为INQ(Incremental Network Quantization)的神经网络无损低比特量化技术。给定任意结构的全精度浮点神经网络模型(诸如AlexNet, VGGNet, GoogleNet和ResNets),我们此次提出的INQ技术能高效地将其转换成无损的低比特二进制模型,从而很好地解决了现有神经网络量化压缩方法的不足,为深度神经网络在定制化硬件上的部署、加速等开辟了新途径。

神经网络无损低比特量化技术

研究人员此前已经提出了很多神经网络量化压缩方法,但现有方法存在两方面的应用瓶颈:其一,来自量化压缩过程的网络精度损失依然不可忽视,在一定程度上限制了量化后模型的使用接受程度;其二,大多数量化压缩方法仅适用于处理特定的模型结构或者特定类别的层,一定程度上限制了方法的泛化能力和量化压缩的性能。

英特尔中国研究院认知计算实验室的姚安邦、郭怡文、周奥军、徐琳、陈玉荣等研究人员所提出的INQ技术,极其有效地解决了现有方法泛化能力不足,模型精度损失明显,以及重训练时间长等问题。

该技术提出了渐进式神经网络量化思想,其核心是引入了参数分组、量化和重训练三种操作。我们在实现中首先将全精度浮点网络模型中每一层参数分为两组,第一组中的参数将被直接量化并固定,而另一组中的参数将通过重训练以补偿量化给模型造成的精度损失。然后,上述三种操作将依次迭代应用到完成重训练后的全精度浮点参数部分,直到模型完全量化为止。通过巧妙耦合参数分组、量化和重训练操作,该技术抑制了模型量化造成的性能损失,从而在实际中适用于任意结构的神经网络模型。

INQ渐进式网络量化策略

(绿线代表当前已经被量化的网络连接;蓝线代表需要重新训练的网络连接)

值得一提的是,该技术还包含另外两个亮点。其一,在模型量化过程中,所有参数被限制成二进制表示,并包含零值,极限量化结果即为三值网络或者二值网络。这种量化使得最后的模型非常适合在硬件上部署和加速。比如在FPGA上,复杂的全精度浮点乘法运算将被直接替换为简单的移位操作。其二,现有神经网络量化压缩方法在处理二值网络或者三值网络时,为了让模型精度损失不至于太大,往往将模型第一层和最后一层参数依然保留为全精度浮点型,而我们的技术在对模型的所有参数进行量化的同时,实现了性能的全面领先

INQ渐进式网络量化示例

第一行:依次为参数分组、量化与重训练;

第二行:迭代过程

(绿色区域代表当前已经被量化的网络参数;浅紫区域代表需要重新训练的网络参数)

三大实际应用

基于业界最具挑战的ImageNet图像分类任务,英特尔中国研究院的研究人员给出了一系列令人激动的实验应用与结果。

参数二进制化的神经网络模型

首先,我们的研究人员将INQ技术应用到了时下所有的主流深度神经网络结构上。以AlexNet、 VGGNet、 GoogleNet和ResNets为例,通过5比特量化(其中1比特专用于表示零值,下同),我们的模型分类精度全面超越了原始的全精度浮点模型。以ResNet-18为例,在4比特和3比特条件下,INQ技术能够做到无损量化。尽管在三值量化时,量化后的模型精度有少许损失,但损失程度远低于目前业界已知的结果。

(固定比特长度、参数二进制化的神经网络模型性能)

(不同比特长度、参数二进制化的神经网络模型性能)

(三值、二值神经网络模型性能比较)

深度参数二进制化的神经网络模型

其次,我们的研究人员将INQ技术与之前我们发表在NIPS 2016的“动态外科手术”(Dynamic Network Surgery, DNS)技术相结合,实现了深度的神经网络二进制量化压缩。以AlexNet为例,首次实现了接近无损的、百倍级、二进制的神经网络模型

深度参数二进制化的神经网络模型性能

(P: 剪枝;Q: 量化;H: 霍夫曼码)

输入、输出及参数均二进制化的神经网络模型

最后,我们的研究人员进一步将INQ技术从只量化模型参数推广到了不但量化模型参数,还量化网络每一层输入和输出。以VGGNet为例,首次实现了无损的、低比特、全量化的神经网络模型

(输入、输出及参数均二进制化的神经网络模型性能)

目前,该方法相关文章即将发表在ICLR2017。作为深度学习领域的顶级会议,获准发表的论文都会得到业内人士的极大关注,从而对深度学习的发展产生相当的推动作用。据不完全统计,在ICLR2017接收的196篇文章中,英特尔中国研究院的INQ技术是唯一一项完全出自中国内地的研究工作。与这项工作相关的源代码正在逐步开源中,相信将会对学界和工业界产生巨大的影响,欢迎大家持续关注。

相关推荐

十年之重修Redis原理(redis重试机制)

弱小和无知并不是生存的障碍,傲慢才是。--------面试者...

Redis 中ZSET数据类型命令使用及对应场景总结

1.zadd添加元素zaddkeyscoremember...

redis总结(redis常用)

RedisTemplate封装的工具类packagehk.com.easyview.common.helper;importcom.alibaba.fastjson.JSONObject;...

配置热更新系统(如何实现热更新)

整体设计概览┌────────────┐┌────────────────┐┌────────────┐│配置后台服务│--写入-->│Red...

java高级用法之:调用本地方法的利器JNA

简介JAVA是可以调用本地方法的,官方提供的调用方式叫做JNI,全称叫做javanativeinterface。要想使用JNI,我们需要在JAVA代码中定义native方法,然后通过javah命令...

SpringBoot:如何优雅地进行响应数据封装、异常处理

背景越来越多的项目开始基于前后端分离的模式进行开发,这对后端接口的报文格式便有了一定的要求。通常,我们会采用JSON格式作为前后端交换数据格式,从而减少沟通成本等。...

Java中有了基本类型为什么还要有包装类型(封装类型)

Java中基本数据类型与包装类型有:...

java面向对象三大特性:封装、继承、多态——举例说明(转载)

概念封装:封装就是将客观的事物抽象成类,类中存在属于这个类的属性和方法。...

java 面向对象编程:封装、继承、多态

Java中的封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)是面向对象编程的三大基本概念。它们有助于提高代码的可重用性、可扩展性和可维护性。...

怎样解析java中的封装(怎样解析java中的封装文件)

1.解析java中的封装1.1以生活中的例子为例,打开电视机的时候你只需要按下开关键,电视机就会打开,我们通过这个操作我们可以去间接的对电视机里面的元器件进行亮屏和显示界面操作,具体怎么实现我们并不...

python 示例代码(python代码详解)

以下是35个python代码示例,涵盖了从基础到高级的各种应用场景。这些示例旨在帮助你学习和理解python编程的各个方面。1.Hello,World!#python...

python 进阶突破——内置模块(Standard Library)

Python提供了丰富的内置模块(StandardLibrary),无需安装即可直接使用。以下是一些常用的内置模块及其主要功能:1.文件与系统操作...

Python程序员如何调试和分析Python脚本程序?附代码实现

调试和分析Python脚本程序调试技术和分析技术在Python开发中发挥着重要作用。调试器可以设置条件断点,帮助程序员分析所有代码。而分析器可以运行程序,并提供运行时的详细信息,同时也能找出程序中的性...

python中,函数和方法异同点(python方法和函数的区别)

在Python中,函数(Function)...

Python入门基础命令详解(python基础入门教程)

以下是Python基本命令的详解指南,专为初学者设计,涵盖基础语法、常用操作和实用示例:Python基本命令详解:入门必备指南1.Python简介特点:简洁易读、跨平台、丰富的库支持...