OpenHarmony啃论文俱乐部—一种深度神经网压缩算法

系统 OpenHarmony
DeepCABAC 是一种用于 DNN 的通用压缩算法,它基于应用于 DNN 参数的上下文自适应二进制算术编码器(CABAC)。

​想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com​

【技术DNA】

【ELT.ZIP】OpenHarmony啃论文俱乐部—一种深度神经网压缩算法-开源基础软件社区

【智慧场景】

**********

********************

********************

********************

********************

********************

********************

********************

********************

********************

********************

********************

********************

********************

********************

*****************

*****************

场景

自动驾驶 / AR

语音信号

流视频

GPU 渲染

科学、云计算

内存缩减

科学应用

医学图像

数据库服务器

人工智能图像

文本传输

GAN媒体压缩

图像压缩

文件同步

数据库系统

通用数据

技术

点云压缩

‎稀疏快速傅里叶变换‎

有损视频压缩

网格压缩

动态选择压缩算法框架

无损压缩

分层数据压缩

医学图像压缩

无损通用压缩

人工智能图像压缩

短字符串压缩

GAN 压缩的在线多粒度蒸馏

图像压缩

文件传输压缩

快速随机访问字符串压缩

高通量并行无损压缩

开源项目

​Draco​​​ / 基于深度学习算法/​​PCL​​​/​​OctNet​

​SFFT​

​AV1​​​ / ​​H.266编码​​​ / ​​H.266解码​​​/​​VP9​

​MeshOpt​​​ / ​​Draco​

​Ares​

​LZ4​

​HCompress​

​DICOM​

​Brotli​

​RAISR​

​AIMCS​

​OMGD​

​OpenJPEG​

​rsync​

​FSST​

​ndzip​

引言

  • 近年来,为了追求让深度神经网络(DNNs)在复杂的机器学习任务中能够表现出更良好的性能,采取了不断扩大 DNNs 尺寸的方式,这就使模型在内存方面变得越来越复杂,不仅意味着更大的内存需求,还很可能造成更慢的运行时和更多的能量消耗,因此便需要对它们进行有效的压缩已满足多方面要求。DeepCABAC 是一种用于 DNN 的通用压缩算法,它基于应用于 DNN 参数的上下文自适应二进制算术编码器(CABAC)。CABAC 最初是针对于 H.264 / AVC 视频编码标准而设计的,并且成为了视频压缩无损压缩部分的最先进技术。DeepCABAC 运用了一种新的量化方案,实现了最小化信息率失真函数,同时也考虑了量化对 DNN 性能的影响。

  • 深度神经网络成功可以归因于三个现象:(1)获得大量数据(2)研究人员设计了新的优化算法和模型架构,允许训练非常深入的神经网络(3)增长计算资源的可用性。

【ELT.ZIP】OpenHarmony啃论文俱乐部—一种深度神经网压缩算法-开源基础软件社区

  • 在资源受限的设备(如移动可穿戴设备)和分布式学习场景(如联邦学习)上部署深度模型的需求也越来越大。这些方法在隐私、延迟和效率问题上有直接的优势。然而,这些模型所需参数数量不断增长,这意味着模型在内存方面变得越来越复杂。高内存复杂性极大地增加了神经网络在用例中的适用性,特别是在联邦学习中,因为网络的参数是通过带宽有限的通信信道传输的。

【ELT.ZIP】OpenHarmony啃论文俱乐部—一种深度神经网压缩算法-开源基础软件社区

  • 而引出模型压缩显得尤为重要:只留下解决任务所需的内存,降低通信和计算成本,压缩算法有利于生成更高的熵,因为它们使数据更加紧凑。我们使用一个基础数据集,用各种算法压缩每个文件。

信源编码

  • 通常所谓的编码,更确切地说是“压缩”,即去掉一些多杂的信息一保留必要的信息,再进行传输,因此在传输前要进行多种处理。其中为 了提高传输效率的有效性编码叫做信源编码。信源编码是信息论的一个分支,研究所谓码的性质。 通常由编码器和解码器两部分组成。

  • 如图,首先,编码器通过两个过程将概率源 P(w)的输入样本 w 映射到二进制表示b,将输入量化,将其映射为整数 i = Q(w)。然后,通过一个二值化过程将该整数映射为其对应的二进制表示形式 b = b (i)。 解码器通过应用逆函数 B−1(B) = i 类比地将二进制表示映射回其整数值,并为其分配一个重构值(或量化点)Q−1(i) = Q。我们强调 Q - 1 不一定是 Q 的倒数。

简单地说,源编码研究的是查找最大限度地压缩一组输入样本的代码,同时在容错约束下保持输入值和重构值之间的误差。我们同时还可以分为两种类型的码,所谓的无损码和有损码(往期的文章里讲述过,感兴趣可以回顾,篇幅原因只做简述)。

无损编码

  • 无损码也称熵编码或可逆编码:Huffman 编码、算术编码、字典编码。

有损编码

  • 有损码也称不可逆码:标量量化、向量量化、预测编码、变换编码、JPEG、子带编码、小波编码、JPEG2000、分析-综合编码。

信道编码

信道是指传输信号的通道,但信号在传输过程中往往由于各种原因,在传输中会产生误码,只要接收设备能判别出1码和0码,信号就不会丢失,因此,在散字信号传输中最重要的,也就是防止误码,也就是要尽量降低误码率,因此,要在信号源的原数码序列中用某些编码,以实现自动纠错或检错的目的,进就是信道编码或纠错编码。

【ELT.ZIP】OpenHarmony啃论文俱乐部—一种深度神经网压缩算法-开源基础软件社区

  • 人类在信道编码上的第一次突破发生在1949年。R.Hamming和M.Golay提出了第一个实用的差错控制编码方案——汉明码。

CABAC

CABAC的发展

  • 比较早流行的是 H.264/AVC ,CABAC(上下自适应二进制算术编码Context-adaptive binary arithmetic coding )是一种用于 H.264/AVC 和 HEVC 的熵编码形式。高效视频编码 (HEVC)由视频编码联合协作团队 (JCT-VC) 开发,它的编码效率有望比 H.264/AVC 提高 50%。HEVC 使用几种新工具来提高编码效率,包括更大的块和变换大小、额外的环路滤波器和高度自适应的熵编码。

CABAC的优势

  • 算术编码是一种熵编码,它可以通过有效地将符号(即语法元素)映射到具有非整数位数的码字来实现接近序列熵的压缩。 在 H.264/AVC 中,CABAC 比基于 Huffman 的 CAVLC 提高了 9% 到 14%。 在 HEVC (HM-3.0) 的早期测试模型中,CABAC 比 CAVLC 提高了 5%–9%。

CABAC涉及三个主要功能

  • CABAC 涉及三个主要功能:二值化、上下文建模和算术编码。

二值化

  • 二值化将语法元素映射到二进制符号(bins)。二值化的方案共有7种:
  1. 一元码(Unary)。
  2. 截断一元码(TU,Truncated Unary)。
  3. k阶指数哥伦布编码(kth order Exp-Golomb,EGk)。
  4. 定长编码(FL,Fixed-Length)。
  5. mb_type与sub_mb_type特有的查表方式。
  6. 4位FL与截断值为2的TU联合二值化方案。
  7. TU与EGk的联合二值化方案(UEGk,Unary/kth order Exp-Golomb)。

上下文建模

  • 以JM中的上下文结构体为例。
//! struct for context management
struct bi_context_type
{
unsigned long count;
byte state; //uint16 state; // index into state-table CP
unsigned char MPS; // Least Probable Symbol 0/1 CP
};
  • 上下文包含两个变量:MPS,pStateIdx(count只是用于计数)。在CABAC编码的过程中会碰到需要修改这两个值的情况(如上面的状态变换),这些修改都是以上下文为单位的。

算术编码

  • 该过程可分为5个步骤
    1.通过当前编码器区间范围R得到其量化值ρ作为查表索引,然后利用状态索引pStateIdx与ρ进行查表得出RLPS的概率区间大小。
    2.根据要编码的符号是否是MPS来更新算术编码中的概率区间起点L以及区间范围R。
    3.pStateIdx==0表明当前LPS在上下文状态更新之前已经是0.5的概率,那么此时还输入LPS,表明它已经不是LPS了,因此需要进行LPS、MPS的转换。
    4.更新上下文模型概率状态。
    5.重归一化,输出编码比特。

由上文, 编码器希望用尽可能少的数据样本找到一个(本地)解决方案。Deep- CABAC被提出。

Deep- CABAC

Deep- CABAC 的编码程序

  1. Deep- CABAC 按行长顺序扫描网络各层的权值参数。
  2. 选择一个特定的超参数β,将定义量化点集。
  3. 对权重值应用量化器,以最小化各自的加权率失真函数。
  4. 通过应用改编版本的 CABAC 压缩量化参数。
  5. 对网络进行重构,并对网络的精度进行测量。对于不同的超参数β重复这个过程,直到在精度和网络大小之间达到预期的平衡。
  6. 对一组超参数β重复该过程,直到所需的精度 vs。实现了-size 权衡。

Deep-CABAC 编码器

Deep-CABAC 无损编码器

  1. 第一个SigFlag 决定权重元素是否是一个重要元素,即表示权值是否为 0。然后使用二进制算术编码器对这个 bin 进行编码,根据其各自的上下文模型(用灰色颜色编码)。上下文模型最初设置为 0.5(因此,权重元素为 0 或不为 0 的概率为 50%),但随着 DeepCABAC 编码更多的元素,将自动适应权重参数的本地统计数据。
  2. 如果元素不为 0,则根据其各自的上下文模型对符号库或 SignFlag 进行类似的编码。

  1. 一系列容器被类比编码,确定元素是否大于 1,2,…,n∈n。数字 n 成为编码器的超参数。
  2. 剩余部分使用指数-Golomb 编码代码,其中一元部分的每个 bin 也相对于它们的上下文模型进行编码。只有固定长度的代码部分没有使用上下文模型进行编码(用蓝色颜色编码)。

Deep-CABAC 有损编码器

  • 找到将量化点(或聚类中心)最优分配给每个权重参数的量化器 Q。
  1. 量化点:因为为大量的点找到正确的映射 Q - 1 是非常复杂的,我们用一个特定的步长Δ来约束它们彼此之间的等距离。即,每个点 qk 可以改写为 qk = ΔIk, ik∈Z。这不仅极大地简化了问题,而且也鼓励了定点表示,可以利用定点表示以较低的复杂度执行推理。
  2. 赋值:因此,量化器有两个可配置的超参数β = (Δ, λ),前者定义量化点的集合,后者定义量化强度。一旦给定一个特定的元组,量化器 Qβ将通过最小化加权率失真函数 将每个权重参数赋给对应的量化点 qk。

  1. DeepCABAC-版本1 (DC-v1):在 DC-v1 中,我们首先利用可扩展贝叶斯技术估计 FIM 的对角线。得到了每个参数的平均值μj 和标准差 σj,其中前者可以解释为其(新的)值(即 wi→μi),而后者则是它们对扰动的“鲁棒性”的度量。在估算完 fim -对角线后,我们将考虑的步长集定义如下:

  • 其中σmin 为最小标准差,wmax 为幅度值最大的参数。然后 S 是量化器的超参数,控制量化点的 “粗糙程度”。
  1. DeepCABAC-版本2 (DC-v2):因为版本1需要估计 FIM 的对角线,成本还是很高。考虑对整个 网 络 直 接 尝 试 寻 找 一 个 好 的 候 选 集 合 Δ∈{Δ0 , … , Δm−1}。通过应用第一轮网格搜索算法,同时应用最近邻量化方案(即λ = 0)来实现这一点。在有限的计算预算下,这种方法的优点是我们可以直接搜索更优步长集Δ。

实验

将标量 huffman、csr-huffman和 bzip2无损编码算法应用于量化网络后获得的最佳压缩结果。括号内是结果的top-1精度,括号内是通过非零参数的数量除以参数总数所获得的稀疏比。

【ELT.ZIP】OpenHarmony啃论文俱乐部—一种深度神经网压缩算法-开源基础软件社区

深度压缩包括应用稀疏化技术,然后是k-Means算法,然后是CSR-Huffman熵编码器,最后是将聚类中心微调到损失函数。相比之下,我们可以通过简单地 应用DeepCABAC 获得更高精度的压缩性能,而无需对量化点进行任何后先验微调。

使用三种不同的量化器对Small-VGG网进行量化,然后使用不同的通用无损编码器对它们进行压缩。具体地,我们利用 DC-v2、加权Lloyd算法和最近邻量化器对模型进行量化。然后应用标量Huffman代码、CSR- Huffman代码 、bzip2算法和DeepCABAC的cabac组件。此外,我们还计算了量化网络的一阶熵,从而测量了网络的熵无损压缩所获得的压缩比不同。

【ELT.ZIP】OpenHarmony啃论文俱乐部—一种深度神经网压缩算法-开源基础软件社区

轻易看到,CABAC 能够在所有量化版本的 Small-VGG16 网络中获得更高的压缩增益。使用 CABAC 的好处在于其固有的灵活性,它可以用于获取权重参数的先验统计数据。DeepCABAC通过定义前文所述的二值化过程,能够快速捕获最大值接近于0的单峰分布和非对称分布的统计信息。此外,也方便CABAC捕获一行中元素之间的相关性。这也很重要,因为 CABAC的估计是以自回归的方式更新的,因此,它的压缩性能也取决于扫描顺序。如上表所示,CABAC能够捕捉权重参数之间的相关性,从而将它们压缩到参数分布的一阶熵之外。与之前提出的通用熵编码器(如标量 Huffman、CSR-Huffman)相比,由于其平均码长受到一阶熵的限制,因此不可能获得比 CABAC更低的码长,因此该特性更加突出了它的优越性。

总结

  • H.264/HEVC 和 H.265/HEVC 视频编码标准中采用的最先进的通用无损编码器——上下文的自适应二进制算术编码器 (CABAC),论文中提出了一种新的深度神经网络压缩算法DeepCABAC,码长更短更灵活,减少训练次数和大量数据的访问。技术一代一代更新,后浪奔涌,前浪不是沉舟或病树,而是巨人的肩膀,引领后辈,奔向更神秘的新世界。

​想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com​​。

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2022-09-19 14:25:35

JSON压缩算法

2022-04-07 15:03:07

Harmony计算机鸿蒙

2022-06-08 11:46:29

字符串鸿蒙

2022-05-12 15:05:32

云计算数据压缩

2022-06-08 16:29:45

无损压缩方案分布式

2022-05-13 22:44:35

物联网算法鸿蒙

2022-06-15 16:06:29

LZ4 算法硬件加速

2022-08-22 17:36:13

啃论文方法啃论文俱乐部

2022-06-15 15:44:21

无损数据压缩鸿蒙

2022-04-20 20:37:58

鸿蒙操作系统

2022-09-06 15:46:52

speexdsp鸿蒙

2022-10-18 16:14:28

2022-05-13 23:03:25

大数据Big Data巨量资料

2022-06-27 14:01:31

LZ4 分析数据密集型压缩算法

2022-04-20 21:06:24

LZ 算法鸿蒙操作系统

2022-09-07 15:08:58

操作系统鸿蒙

2022-09-16 15:01:37

操作系统技术鸿蒙

2022-09-13 16:10:15

鸿蒙操作系统

2022-09-14 15:28:19

操作系统鸿蒙

2022-09-15 15:21:22

操作系统鸿蒙
点赞
收藏

51CTO技术栈公众号