一种高效的q+1准均匀量化(quasi-uniform quantization)方法及MATLAB实现

  • 简介
  • 算法描述
    • 均匀量化
    • 准均匀量化
  • MATLAB代码
  • 效果
  • 参考文献

简介

在将算法部署到硬件平台时,使用single或double型数据会占用大量的存储空间,因此一般需要将数据进行合适的量化,减少硬件资源使用同时提高算法效率。而常见的均匀量化出现的溢出现象会降低数据精度,影响部署后的算法性能。这里将介绍一种高效的准均匀量化(quai-uniform quantization)方法,其在均匀量化的基础上加入了一个额外的状态比特位,从而实现了在一定数值范围内实现均匀量化,超出该范围后可实现非均匀量化,大大扩展了量化范围,尽可能的保留了数据精度。该方法的出处见参考文献。

算法描述

首先介绍均匀量化,再进一步得出准均匀量化。

均匀量化

假设量化后结果使用qqq个二进制数表示,总量化数为2q−12^{q}-12q−1,设量化间隔为Δ\DeltaΔ,则对于任意实数xxx,其量化结果为:
QΔ(x)=sgn⁡(x)Δ⌊∣x∣Δ+12⌋Q_{\Delta}(x)=\operatorname{sgn}(x) \Delta\left\lfloor\frac{|x|}{\Delta}+\frac{1}{2}\right\rfloor QΔ​(x)=sgn(x)Δ⌊Δ∣x∣​+21​⌋
令N=2q−1−1N=2^{q-1}-1N=2q−1−1,有2N+1=2q−12 N+1=2^{q}-12N+1=2q−1,则max⁡∣QΔ(x)∣=NΔ\max \left|Q_{\Delta}(x)\right|=N \Deltamax∣QΔ​(x)∣=NΔ,量化结果还可表示为QΔ(x)=mΔ(m=−(2q−1−1),−(2q−1−2),…,0,…,2q−1−1)Q_{\Delta}(x)=m \Delta\left(m=-\left(2^{q-1}-1\right),-\left(2^{q-1}-2\right), \dots, 0, \dots, 2^{q-1}-1\right)QΔ​(x)=mΔ(m=−(2q−1−1),−(2q−1−2),…,0,…,2q−1−1),即:
QΔ,q(x)={NΔ,if NΔ−Δ2≤xmΔ,if mΔ−Δ2≤x<mΔ+Δ2for N>m>00,if −Δ2<x<Δ2mΔ,if mΔ−Δ2<x≤mΔ+Δ2for 0>m>−N−NΔ,if x≤−NΔ+Δ2Q_{\Delta, q}(x)=\left\{\begin{array}{cc} N \Delta, & \text { if } \quad N \Delta-\frac{\Delta}{2} \leq x \\ m \Delta, & \text { if } \quad m \Delta-\frac{\Delta}{2} \leq x<m \Delta+\frac{\Delta}{2} \\ & \quad \text { for } N>m>0 \\ 0, & \text { if } \quad-\frac{\Delta}{2}<x<\frac{\Delta}{2} \\ m \Delta, & \text { if } \quad m \Delta-\frac{\Delta}{2}<x \leq m \Delta+\frac{\Delta}{2} \\ & \quad \text { for } 0>m>-N \\ -N \Delta, & \text { if } \quad x \leq-N \Delta+\frac{\Delta}{2} \end{array}\right.QΔ,q​(x)=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧​NΔ,mΔ,0,mΔ,−NΔ,​ if NΔ−2Δ​≤x if mΔ−2Δ​≤x<mΔ+2Δ​ for N>m>0 if −2Δ​<x<2Δ​ if mΔ−2Δ​<x≤mΔ+2Δ​ for 0>m>−N if x≤−NΔ+2Δ​​
将m用q位二进制数表示,即binary⁡(m)=[m0,m1,…,mq−1]\operatorname{binary}(\mathrm{m})=\left[\mathrm{m}_{0}, \mathrm{m}_{1}, \ldots, \mathrm{m}_{\mathrm{q}-1}\right]binary(m)=[m0​,m1​,…,mq−1​],m0\mathrm{m}_{0}m0​为符号位,当mmm为正数是其值为1,负数时其值为0,后q−1q-1q−1位表示∣m∣|m|∣m∣。
扩展量化范围一般有两种方式,即增大量化间隔Δ\DeltaΔ或用更多的二进制位表示数据,前者会损失精度,后者则会带来更多的资源开销和计算复杂度。

准均匀量化

在均匀量化中,待量化数x绝对值大于NΔN \DeltaNΔ时会被截断,当xxx的取值范围分布很广时这会造成很大的精度损失。准均匀量化在均匀量化的基础是增加一个比特,即q+1q+1q+1位,用来表示当数据超出一定范围后将采用非均匀量化。
定义参数增长速率ddd,有d>1d>1d>1,当输入值xxx取值在(−dNΔ,dNΔ)(-d N \Delta, d N \Delta)(−dNΔ,dNΔ)之间时采用均匀量化,量化间隔为Δ\DeltaΔ;若x>NΔx>N\Deltax>NΔ,则将xxx量化为drNΔ,1≤r≤N+1d^{r} N \Delta, 1 \leq r \leq N+1drNΔ,1≤r≤N+1,相似的,当x<−NΔx<-N\Deltax<−NΔ,将x量化为−drNΔ,1≤r≤N+1-d^{r} N \Delta, 1 \leq r \leq N+1−drNΔ,1≤r≤N+1。上述q+1位的准均匀量化的结果用QΔ,q∗(x)Q_{\Delta, q}^{*}(x)QΔ,q∗​(x)表示,如下所示:
QΔ,q∗(x)={dN+1NΔ,if dN+1NΔ≤xdrNΔ,if drNΔ≤x<dr+1NΔfor N≥r≥1QΔ,q(x),if −dNΔ<x<dNΔ−drNΔ,if −dr+1NΔ<x≤−drNΔ,for 1≤r≤N−dN+1NΔ,if x≤−dN+1NΔQ_{\Delta, q}^{*}(x)=\left\{\begin{array}{ccl}d^{N+1} N \Delta, & \text { if } & d^{N+1} N \Delta \leq x \\ d^{r} N \Delta, & \text { if } & d^{r} N \Delta \leq x<d^{r+1} N \Delta \\ & & \text { for } N \geq r \geq 1 \\ Q_{\Delta, q}(x), & \text { if } & -d N \Delta<x<d N \Delta \\ -d^{r} N \Delta, & \text { if } & -d^{r+1} N \Delta<x \leq-d^{r} N \Delta, \\ & & \text { for } 1 \leq r \leq N \\ -d^{N+1} N \Delta, & \text { if } & x \leq-d^{N+1} N \Delta\end{array}\right.QΔ,q∗​(x)=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧​dN+1NΔ,drNΔ,QΔ,q​(x),−drNΔ,−dN+1NΔ,​ if  if  if  if  if ​dN+1NΔ≤xdrNΔ≤x<dr+1NΔ for N≥r≥1−dNΔ<x<dNΔ−dr+1NΔ<x≤−drNΔ, for 1≤r≤Nx≤−dN+1NΔ​
此时将准均匀量化中的mmm扩展为q+1q+1q+1位比特表示,即binary⁡(m)=[m0,m1,…,mq−1,mq]\operatorname{binary}(\mathrm{m})=\left[\mathrm{m}_{0}, \mathrm{m}_{1}, \ldots, \mathrm{m}_{\mathrm{q}-1},\mathrm{m}_{\mathrm{q}}\right]binary(m)=[m0​,m1​,…,mq−1​,mq​],前q位意义不变,mq=0\mathrm{m}_{\mathrm{q}}=0mq​=0,即表示采用均匀量化。x取值超出均匀量化取值范围后,采用非均匀量化,此时将rrr用q+1q+1q+1位比特表示,即binary⁡(r)=[r0,r1,…,rq−1,rq]\operatorname{binary}(\mathrm{r})=\left[\mathrm{r}_{0}, \mathrm{r}_{1}, \ldots, \mathrm{r}_{\mathrm{q}-1},\mathrm{r}_{\mathrm{q}}\right]binary(r)=[r0​,r1​,…,rq−1​,rq​],r0\mathrm{r}_{0}r0​为符号位,rq=1\mathrm{r}_{q}=1rq​=1表示当前采用非均匀量化。有以下两点需要注意:

  1. 该量化方法的均匀量化阶段与一般均匀量化有一点不同,当−(N−1)≤m≤N−1-(N-1) \leq m \leq N-1−(N−1)≤m≤N−1时完全等同于一般均匀量化,而此后有一段长为dNΔ−NΔ+Δ2d N \Delta-N \Delta+\frac{\Delta}{2}dNΔ−NΔ+2Δ​的区间需将mmm强制量化为NNN。
  2. 在非均匀量化阶段,当输入值x>0时,[r1,…,rq−1][\mathrm{r}_{1},\ldots,\mathrm{r}_{q-1}][r1​,…,rq−1​]表示值r−1r-1r−1;当输入值x<0时,[r1,…,rq−1][\mathrm{r}_{1},\ldots,\mathrm{r}_{q-1}][r1​,…,rq−1​]表示值r+1r+1r+1。如设q=3q=3q=3,QΔ,q∗(x)=0011Q_{\Delta, q}^{*}(x)=0011QΔ,q∗​(x)=0011表示r=2r=2r=2,QΔ,q∗(x)=1011Q_{\Delta, q}^{*}(x)=1011QΔ,q∗​(x)=1011表示r=−2r=-2r=−2。

MATLAB代码

minv = -300;
maxv = 300;
global q delta d N;
x = minv + (maxv-minv).*rand; % 生成取值在[minv maxv]之间的数q = 3;      % 二进制位个数
delta = 1;  % 量化间隔
d = 3;      % 增长速率N = 2^(q-1)-1;quq = quasi_uni_quanitization(x);function quq = quasi_uni_quanitization(x)global q delta d N;r = 0;ssign = sign(x);if  x > (-d*N*delta) && x < (d*N*delta)quq = uni_quanitization(x);elseif x >= d^(N+1)*N*deltar = N;bin_abs_r = dec2bin(r,q-1);quq = strcat('0',bin_abs_r,'1');elseif x <= -d^(N+1)*N*deltar = -N;bin_abs_r = dec2bin(abs(r),q-1);quq = strcat('1',bin_abs_r,'1');elseif ssign > 0while x >= d^(r+1)*N*deltar = r+1;end% 注意当输入x>0时,中间的q-1位比特表示的值是(r-1),如q=3时0001表示r=1bin_abs_r = dec2bin(r-1,q-1);quq = strcat('0',bin_abs_r,'1');elseif ssign < 0while x <= -d^(r+1)*N*deltar = r-1;end% 注意当输入x<0时,中间的q-1位比特表示的值是(r+1),如q=3时1001表示r=-1bin_abs_r = dec2bin(abs(r+1),q-1);quq = strcat('1',bin_abs_r,'1');end
end
function uq = uni_quanitization(x)global q delta N;ssign = sign(x);m = 0;if x < delta/2 && x > -delta/2m = 0;uq = dec2bin(m,q+1);elseif ssign > 0while x >= (m*delta + delta/2)m = m+1;end% 注意在准均匀量化中-(N-1)<= m<= N-1这一段才等同于均匀量化,% 此后有一段长度为d*N*Δ-N*Δ+Δ/2的区间需进行截断% 仅使用均匀量化时注意将以下三行注释掉if m > Nm = N;      endbin_abs_m = dec2bin(m,q-1); uq = strcat('0',bin_abs_m,'0');elseif ssign < 0 while x <= (m*delta - delta/2)m = m-1;end% 注意在准均匀量化中-(N-1)<= m<= N-1这一段才等同于均匀量化,% 此后有一段长度为d*N*Δ-N*Δ+Δ/2的区间需进行截断% 仅使用均匀量化时注意将以下三行注释掉if m < -Nm = -N;endbin_abs_m = dec2bin(abs(m),q-1); uq = strcat('1',bin_abs_m,'0');end
end

效果

这里粘贴上原文中图4的结果,将该量化方法应用在LDPC译码中的最小和(MS)算法,其效果如图可见效果是惊人的,有效的降低了LDPC译码在较高信噪比时出现的error floor。

参考文献

X. Zhang and P. H. Siegel, “Quantized Iterative Message Passing Decoders with Low Error Floor for LDPC Codes,” in IEEE Transactions on Communications, vol. 62, no. 1, pp. 1-14, January 2014.

一种高效的q+1准均匀量化(quasi-uniform quantization)方法及MATLAB实现相关推荐

  1. 图解Reformer:一种高效的Transformer

    作者:Alireza Dirafzoon    编译:ronghuaiyang 导读 在单GPU上就可以运行的Transformer模型,而且几乎不损失精度,了解一下? 如果你一直在开发机器学习算法用 ...

  2. EAST:一种高效准确的场景文本检测器

    摘要 先前的场景文本检测方法已经在各种基准测试中取得了令人满意的性能.然而,在处理具有挑战性的场景时,即使配备了深度神经网络模型通常也会失败,因为整体性能取决于流水线中多个阶段和组件的相互作用.在这项 ...

  3. Linux+Qt 下同一数据空间vfork多进程间通信的一种高效便捷方式(信号槽直接调用)

    Linux+Qt 下同一数据空间vfork多进程间通信的一种高效便捷方式(信号槽直接调用) 概述 传统的多进程间通信往往非常麻烦,采用的方法比如管道,共享内存,socket,文件等,大都非常繁琐, 1 ...

  4. Enhanced-RCNN: 一种高效的比较句子相似性的方法 |​WWW 2020

    作者 | 彭爽 出品 | AI科技大本营(ID:rgznai100) 国际顶级会议WWW2020将于4月20日至24日举行.始于1994年的WWW会议,主要讨论有关Web的发展,其相关技术的标准化以及 ...

  5. MessagePack:一种高效二进制序列化格式

    MessagePack是一种高效二进制序列化格式.可以在多种语言中进行快速数据交换,比如JSON格式等.这种格式小巧快速,多个小整数会压缩成一个字节,通常短字符串压缩后只比原来长度增加1个字节.Mes ...

  6. 加速数据分析,这12种高效Numpy和Pandas函数为你保驾护航

    我们都知道,Numpy 是 Python 环境下的扩展程序库,支持大量的维度数组和矩阵运算:Pandas 也是 Python 环境下的数据操作和分析软件包,以及强大的数据分析库.二者在日常的数据分析中 ...

  7. dataframe转化为array_【Python专栏】12 种高效 Numpy 和 Pandas 函数为你加速分析

    来源:机器之心 编译:Jamin.杜伟.张倩 我们都知道,Numpy 是 Python 环境下的扩展程序库,支持大量的维度数组和矩阵运算:Pandas 也是 Python 环境下的数据操作和分析软件包 ...

  8. 停止无效学习,4种高效学习方法,快速提升自己

     来源:此文章为小精灵讲堂原创,仅供学习使用. 目录 1.费曼学习法 Feynman Technique 2.思维导图学习法 Mind Mapping 3.SQ3R 阅读法 4.西蒙学习法 Simon ...

  9. python如何压缩pdf_如何压缩PDF文件?分享4种高效压缩方法!

    原标题:如何压缩PDF文件?分享4种高效压缩方法! 在我们日常学习和日常工作中,我们时常会用到PDF文件,我们时常会发送PDF文件.但是如果PDF文件过大的话,上传就会受到影响,那么如何将PDF文件的 ...

最新文章

  1. Speed4Web 绿色纯净版
  2. 魏哲巍:图神经网络的理论基础 | 青源 Talk 第 7 期
  3. python中__name__属性的取值_Python脚本的“__name__”属性
  4. Unity3dShader_边缘发光效果
  5. H.264(MPEG-4 AVC)级别(Level)、DPB 与 MaxDpbMbs 详解(转载)
  6. 顺序三元组 java_三元组顺序结构实现稀疏矩阵相加,行序优先(Java语言描述)
  7. 实际开发中 dao、entity的代码怎样自动生成?一款工具送给你
  8. 关于LD_PRELOAD在Android API HOOK中的应用
  9. CAD建模软件BricsCAD 22.2.03 for Mac
  10. FileOprSer.class.php(文件上传与下载类)
  11. 读书笔记之《价值》张磊
  12. linux上压缩pdf文件,如何压缩PDF文件?
  13. 这是我见过最好的唐诗,而且通俗易懂2
  14. 怎么让小白理解intel处理器(CPU)的分类
  15. 武汉市10月双软认定好处、认定条件及9月认定名单公示
  16. android app 运行时提示 应用专为旧版 Android 打造
  17. 如何进行滤波器设计软件选择
  18. ghost网络克隆功能实现【批量】计算机操作【系统的安装】,Ghost怎么网络克隆备份还原系统GhostCast教程...
  19. “完全或无”、IND-CPA、IND-CCA1、IND-CCA2的详细说明
  20. 为什么“总结经验”反而把你带进沟里?

热门文章

  1. line-height详解
  2. Zookeeper源码解析 -- 本地事务日志持久化之FileTxnLog
  3. XML Schema学习札记(1)——基础总览
  4. Java设计模式大全
  5. 数字藏品以虚强实,赋能实体经济发展
  6. 服务器cpu 单核过高的影响,一次单核CPU占用过高问题的处理
  7. docker 分析cpu占用过高
  8. 变分原理(Variational Principle)
  9. 计算机少年宫辅导教师总结,学校信息技术教师的个人工作总结
  10. 两种电致发光器件EQE测量方法(光分布法和积分球法)