抖音技术能力大揭密!钜惠大礼、深度体验,尽在火山引擎增长沙龙,就等你来! 立即报名>> 了解详情
写点什么

阿里巴巴提出 RNN 多比特量化方法,推断提速 3 倍并减少 10.5 倍内存消耗

2018 年 5 月 07 日

阿里巴巴 ICLR Poster 论文:基于交替方向法的循环神经网络多比特量化

(Alternating Multi-bit Quantization for Recurrent Neural Networks, in ICLR 18)

许晨,姚建强,林宙辰,欧文武,曹元斌,王志荣,查红彬

北京大学 阿里巴巴

* 该工作在阿里巴巴搜索算法组实习期间完成

论文原文地址: https://arxiv.org/abs/1802.00150

介绍

循环神经网络 (RNN) 在语言模型、机器翻译、语音识别、生成图像标题等很多应用上都取得了非常好的效果。然而,这些模型常常是建立在高维的嵌入 (embedding) 或者多层的循环单元中,包含了大量的参数,使得无法在资源有限的移动端部署。此外,RNN 的计算依赖于与当前的隐状态,只能被顺序执行,因此在执行推断时会造成比较大的延时。在拥有大规模并发请求的服务器端,比如语音识别或者机器翻译等应用,为了满足线上苛刻的响应时间要求,需要部署大量的机器。在这项工作中,我们考虑通过量化参数到二值{-1,+1}上来解决上述问题。考虑将模型的权重量化成 1 比特,相对于全精度,直接带来 32 倍的内存压缩。而对 1 比特参数的矩阵乘法,如果不考虑具体实现,相对于全精度乘法,理论上也会带来 32 倍的加速。然而,如果把模型的权重和激活都量化成 1 比特,在循环神经网络中,会带来很大的精度损失。因此,很自然的折中方案就是采用多比特量化(如图 1 所示)。

Figure 1 多比特量化乘法示意

现有的多比特量化方法

1) 均匀 (Uniform) 量化采用下列的 k 比特量化方案:

这样基于规则的量化方法非常容易实现, 但是对于非均匀数据的量化效果很差,而非均匀分布数据在深度神经网络却更为常见。

2) 均衡 (Balanced) 量化通过数据预处理来解决均匀量化的弊端。该方法首先产生 2k 个间隔,每个间隔大致包含等量的数据。然后该方法将每个间隔的中心线性映射到对应的量化编码中。尽管看起来更有效,但是该方法还是基于规则,而这种规则并不能保证对所有的数据分布都起效果。

3) 贪婪法 (Greedy) 近似通过去解下面的带离散约束的分解问题来实现量化:

对于k=1, 上述问题存在闭式解。贪婪近似通过逐步量化余量(residue) 并将其推广到k 比特(k>1) 的情形:

每个子步都有最优解

贪婪法非常高效,尽管不能得到一个高精度的解,但是将量化问题建模成一个优化问题的形式还是非常具有启发性的。

4) 改进版 (Refined) 贪婪近似进一步拓展贪婪法以降低量化误差。在上述第 j 步最小化问题中,该方法加上额外一步最小二乘来修正系数

在原文量化卷积神经网络权重的实验中,修正版贪婪法被证实比原始的贪婪法更有效。然而,正如我们下面要讲的,修正版的贪婪法在量化精度方面仍然不能令人满意。

除了上述通用的多比特量化方案以外,还有文章还提出了三值量化,与1 比特的二值量化相比,三值量化多了可行状态0。三值量化通过解如下问题

来实现编码。然而,原文并未提出一种高效的解法,相反,作者通过经验,将小于\(0.7/n|(|w|)|_1\) 的元素设成0, 并对剩余元素采用如上所述的二值量化。三值量化其实本质上等价于此处的2 比特量化,唯一不同的地方在于多了一个\(α_1=α_2\) 的约束。当二值编码被固定以后,最优系数\(α_1\) (或者\(α_2\) ) 类似地可以通过最小二乘得到。

基于交替方向法的多比特量化方案

接下来将介绍本文提出的量化方法,同样我们也是通过解上述的优化问题来实现量化。为了简单起见,首先考虑k = 2 的情形,如果\(α_1\) 和\(α_2\) 已知且满足\(α_1≥α_2\) ,那么可行编码即被限制为以下四种情况\(v=\{-α_1-α_2,-α_1+α_2,α_1-α_2,α_1+α_2\}\) 。对于 w中的任意元素 w, 其编码都是通过最小二乘来确定。我们相应地可以将整个坐标轴分成四份,落在某个区间上的 w 分别对应其中一个量化编码。由最近邻条件可得区间的边界即为量化编码的中间值,也就是 -\(α_1\) 、0 以及\(α_1\) 。下图给出一个示意。

Figure 2 当实系数固定时,最优 2 比特编码示意

对于任意 k 比特量化问题,假设\(\{{α_i\} }_{i=1}^k\) 已知,我们可以类似地将整个坐标轴分成\(2^k\) 个区间,其边界同样通过相邻可行编码的中点来划分。如果直接将待量化的实数 w 与所有区间边界进行比较以确定对应编码,总共需要\(2^k\) 次,当 k 比较大,这种操作非常不经济。事实上,我们可以利用可行编码全集\(v\) 中元素单调递增的性质,将\(v\) 均匀分成两个子集: \(v_{(1:m/2)}\) 和\(v_{(m/2+1:m)}\) , 其中 m 表示v的长度。如果\(w< (v_{m/2}+v_{m/2+1})/2\) , 其可行编码即被限制在子集\(v_{(1:m/2)}\) 上。相反如果\(w≥ (v_{m/2}+v_{m/2+1})/2\) , 其可行编码即被限制在子集\(v_{(m/2+1:m)}\) 上。通过递归地将可行编码子集均匀划分,我们只需要 k 次比较就可以得到最优编码。该过程可以看成是一个二叉搜索树,我们在下图中给出了一个 k=2 时的简单示意。一旦得到量化编码,即可将其一一映射到对应的二值向量\(\{{b_i }\}_{i=1}^k\) 。

Figure 3 二叉搜索树将 2k 次比较降为 k 次比较

基于上面的发现,我们重新来考虑上一节中介绍的改进版贪婪近似。经过最小二乘修正实系数之后,二值编码\(\{{b_i }\}_{i=1}^k\) 不再是最优,而该方法却仍将其固定。为了进一步改进,交替最小化实系数和二值编码变成了一个很自然的选择。一旦用二叉搜索树得到最优的\(\{{b_i }\}_{i=1}^k\) , 可以将其固定,并采用最小二乘更新\(\{{a_i }\}_{i=1}^k\) 。在真实实验中,以贪婪法得到的解作初始化,我们发现只需要两步交替迭代就足以得到高精度的解。

实验结果

我们在语言模型上进行量化实验,分别测试了 LSTM 和 GRU 两种架构。因为

Table 1 不同方法近似 PTB 数据集上训练好的 LSTM 的权重。其中 FP 表示全精度

Table 2 不同方法近似 PTB 数据集上训练好的 GRU 的权重

实验是去预测下一个单词,其效果采用单字复杂度来衡量(perplexity per word, 简写成PPW)。为了检验所有的算法量化精度,我们首先对训练好的全精度权重做近似(没有量化激活或者重训练),结果如表1 和表2 所示。注意到均匀量化和均衡量化是基于规则的,其目标并不在于最小化误差,因此这两种方法会得到差很多的结果。我们还在其他数据集上重复了上述实验,对于两种循环神经网络结构LSTM 和GRU,结果都与此处相似。

Table 3 PTB 数据集上多比特量化 LSTM 和 GRU 的测试 PPW,其中均匀量化和均衡量化为现有论文中的结果,改进版贪婪法为我们自己实现的结果。

Table 4 WikiText-2 数据集上多比特量化 LSTM 和 GRU 的测试 PPW。

Table 5 Text-8 数据集上多比特量化 LSTM 和 GRU 的测试 PPW

我们还进行了权重和激活同时量化的实验,结果如表3、4 和5 所示。从中可以看到,本文提出的交替方向法明显好过现有其他量化方法。即使与表现最好的改进版贪婪法相比,交替方向法实现类似的精度大概可以少用一个比特。

我们还在CPU 中实现了矩阵向量的二值乘法,其结果如表6 所示。

Table 6 CPU 中二值乘法与全精度乘法的时间比较

小节

在这个工作中,我们主要考虑神经网络的多比特量化压缩加速问题。我们发现,如果编码的实系数固定,那么离散的二值编码{-1,+1}可以通过二叉搜索树高效的求解。基于这个发现,我们相应地提出交替方向法。我们将该方法用于量化语言模型中的LSTM 和GRU 结构,与全精度模型相比,通过2 比特量化,我们可以减少约16 倍的内存消耗,以及在CPU 上实现约6 倍的真实推断加速,而只产生少量的准确率损失。通过3 比特量化,该方法在准确率上可以实现几乎没有损失甚至超过原始模型,并减少约10.5 倍的内存消耗,以及在CPU 上实现约3 倍的真实推断加速。这些结果都远远优于现有量化方法的结果。

如果您也有论文被国际会议录用或者对论文编译整理工作感兴趣,欢迎关注 AI前线(ai-front),在后台留下联系方式,我们将与您联系,并进行更多交流!

2018 年 5 月 07 日 18:111543

评论

发布
暂无评论
发现更多内容

人生苦短,我用Python之小游戏

Bob

开发者 Python 游戏编程 4月日更 -python

Spring Boot + RabbitMQ实现订单过期自动取消功能

Lonely Sufferer

RabbitMQ springboot

假期后来一波干货:一文理清JVM和GC

比伯

Java 程序员 架构 JVM 计算机

3d导航栏

赫鲁小夫

4月日更

“区块链+”,应用积分营销

电微13828808271

区块链

架构实战营模块1作业

竹林七贤

这6个浏览器插件,让你的浏览器大为不同。

彭宏豪95

chrome 浏览器 插件 chrome扩展 4月日更

7 个非常实用的 Shell 拿来就用脚本实例!

JackTian

Linux 编程 Shell 脚本语言 运维工程师

「架构实战营」模块一作业

between

架构实战营

数字化时代,都说企业转型迫在眉睫,如何转型成了关键?

一只数据鲸鱼

物联网 数字化 数据可视化 企业转型

架构实战营模块 1 作业

Geek_2b52aa

架构实战营

超低功耗LoRa无线通信应用实践

不脱发的程序猿

物联网 无线通信 四月日更 LoRa 无线通信模组

牛比特小矿工系统开发|牛比特小矿工软件APP开发

开發I852946OIIO

系统开发

情指勤一体化指挥调度平台建设,重点人员管理平台

13823153121

教你一个著名的流行数据格式:Python JSON

华为云开发者社区

Python 数据 Python JSON JSON序列化 半结构化数据

企业为何开始选择使用成品训练数据集?

澳鹏Appen

人工智能 机器学习 数据集 人工智能大数据 数据流

你在备战“字节”时一定需要这个,程序员进大厂指南+算法已开源

Java架构师迁哥

BBK智能合约系统开发|BBK智能合约APP软件开发

开發I852946OIIO

系统开发

拍乐云 x 扬帆出海 x LiveCloud:音视频出海专家干货分享

拍乐云Pano

flutter ios android WebRTC RTC

【Java 试题】AQS解析

程序员架构进阶

AQS Java源码 28天写作 四月日更 4月日更

CSS实现动画环绕下划线效果

Sakura

四月日更

手起刀落,连斩获阿里(四面)+字节(四面)+美团(三面)三家一线大厂Offer!

Java架构追梦

Java 架构 阿里巴巴面试经历 腾讯面试经历 全套大厂面试真题

架构实战营第一次作业

CmHuang

架构实战营

《iOS应用逆向与安全》

Thrash

读后感

有了这个框架,平台开发谁还手敲代码?

华为云开发者社区

华为云 智慧园区 MainPortal 统一门户 HDC2021

架构实战营-模块1-微信业务架构-学生系统架构备选方案

吴建中

Rust从0到1-结构体-定义和实例化

rust struct 结构体

架构训练营

架构训练营

“区块链+版权”应用保护者

电微13828808271

书单|互联网企业面试案头书之运营篇

博文视点Broadview

模块一:课后作业

a1vin-tian

架构实战营

Study Go: From Zero to Hero

Study Go: From Zero to Hero

阿里巴巴提出RNN多比特量化方法,推断提速3倍并减少10.5倍内存消耗-InfoQ