其他分享
首页 > 其他分享> > 《Towards Model Compression for Deep LearningBased Speech Enhancement》

《Towards Model Compression for Deep LearningBased Speech Enhancement》

作者:互联网

研究动机

近年来都在使用深度学习的语音增强。但是,做增强需要一个大的深度网络,但是大的网络就意味着更大的内存和计算量,这样的话,对硬件就会有更高的要求,不是很友好。所以这篇文章提出了两种压缩模型的方法,可以有效的减少模型的尺寸,减小模型尺寸用到了三种不同的技术:稀疏正则化、迭代式剪枝、基于聚类的量化(翻译过来的,不一定准确)。

INTORDUCTION

深度学习上有很多的模型压缩技术,可以广泛的分成两类,第一类是减小训练的参数量,而减小训练的参数量所用到的比较广泛的技术是网络的剪枝和张量的分解。前者是按照一定的标准把不重要的权重移除掉,有一些文献用到的是这种方法,之后利用的是Hessian matrix的损失函数来确定那些权重是重要的,那些是不重要的,不重要的就被移除掉,剩余被保留下来的就微调一下,为什么要微调?因为删除掉一些权重,即使这些权重不重要,但也会起到一些作用,,删掉以后,这些小作用就没了,所以需要重新把剩下的权重调整了,重新改变一下适应网络的性能,因为压缩的前提是不能让网络的性能下降很多,不然压缩没有任何意义。后者是为了减小冗余度,通过将一个大的权重张量分解为多个小的权重张量,,这样分解是根据权重张量的低秩的原理。(线性代数讲过相关性和无关性,如果在一个矩阵里面,在我的理解里面,低秩就意味着相关性很低,比如一个5行10列的矩阵,如果秩为2的话,那就代表只需要2个列向量就可以把其他剩余的向量进行表示,那原来的这个矩阵的其余8个列向量就是冗余的,如果秩很高的话,那无关性就很强,冗余性就会很低。所以本文根据低秩的原理将冗余度降低应该是这样理解的。)上面说的是模型压缩的第一种类型的两种方法。第二种类型的模型压缩就是模型量化,量化就是减少权重或者激活(activations)或者二者同时的位宽度。

算法的描述

        语音增强的目标就是从带噪或者带混响的声音中提取出纯净语音。

1、 迭代式结构化和非结构化剪枝

        一个典型的网络剪枝包含三部分:训练一个性能比较好的网络、按照一定的标准将训练好的网络里面的一些权重移除、微调剪枝后的网络。

      一种看法是把移除掉的权重看作为0,这样的话,剪枝后的权重就会变成稀疏权重。稀疏的粒度会影响硬件的性能, 。细粒度稀疏是一种稀疏模式---将单个的权重设为0。但是这种稀疏方式不规律,很难应用到硬件加速上,所以就提出一种粗粒度稀疏----这种模式是规则的---研究了结构化和非结构化剪枝。 结构化剪枝是按组把权重去掉,非结构化剪枝是把一个一个权重去掉。

     (结构化剪枝)对于卷积/解卷积,把卷积核作为剪枝的权重组----二维卷积权重组就是一个矩阵,一维卷积就是一个向量。对于全连接和递归层,每一个权重张量就是一个矩阵,其中每一列作为一个权重组用于剪枝。

       如图所示(结构化和非结构化):

     

       输入的是权重验证集、在第l个权重张量中所有非零权重的集合、损失函数、\Theta是网络中所有非零的可训练参数的集合、预定义的容忍项\alpha 1。 输出是对于权重张量的剪枝率。

算法:      如果每一个张量W_{l}符合循环,如果剪枝率在相应的大括号里面,让U成为按照剪枝率剪枝后的集合,更新损失函数,如果损失函数的值要比容忍项的值大,那剪枝率更新为本身减去5%,重复循环,直到损失函数比容忍项低,结束循环。返回对应的剪枝率,如果剪枝率没有被分配相应的值,就初始化为100%。

 举个例子,如果剪枝率为20%,容忍项为0.2,经过剪枝后的损失函数的值为0.3,则剪枝率变为15%,继续循环,如果损失值为0.1,符合,就结束循环,此时的剪枝率为15%。(这个算法的意思是按照剪枝率把权重减掉,用一个容忍项作为阈值,让损失函数更新,使得剪枝率可以控制在一个比较好的范围。)

 下面的结构化剪枝同理。

       第一,现存的一些剪枝的方法用一个阈值来区分重要和不重要的权重,这样会使得剪枝冗余或者过度剪枝,通过本文的敏感性分析可以解决这个问题。(容忍项那边)第二,本文实现的剪枝是迭代和微调式的剪枝,每一轮都会评估增强的性能,这样就会减少过度剪枝的风险以至于损害性能。

 2、稀疏正则化

       它解决的问题是为了在不损害性能的前提下增加剪枝率。用的是L1的正则化,这种正则式让不重要的权重变为0。

              

      组水平的稀疏是这样的。

3、 基于聚类的量化

      将每一个张量的权重分成K组,这个算法和之前的差不多。

算法输出的K类,就代表K个索引值,下面的图第一个代码原始的权重矩阵,第二个是一个码表,索引对应的质心,用原始矩阵按照码表来实现压缩,出现第三个矩阵是基于聚类量化后的权重矩阵,为0就等于被压缩掉了,这样就实现了压缩的目的。

 

C1和C2的两种压缩方式:

 做了几个实验,用了4个基本的模型。

这个是用相应的数据集,不同的信噪比下,不同的压缩方法实现的。可以看出来,C1的压缩率要比C2的强,二者实现的性能差不多,都是相对于对方有高有低。

 这个实验是在测试时额外加了四种噪声,(噪声集DEMAND里面的噪声),效果如下:

下图中,MAC(multiply-accumulate),表三表示未压缩和压缩模型处理4秒再生混合物的MAC的数量

 

 下图表示的是不同的迭代轮数下有和没有稀疏正则化的表现,B很明显参数量要少很多(相同的的迭代轮数下)。

 下面两张图中P,S,Q分别代表剪枝、正则化、量化。

 

      最后这张图是将压缩模型用于多个说话人分离的任务。

 

标签:剪枝,结构化,Towards,Compression,权重,压缩,矩阵,张量,Deep
来源: https://blog.csdn.net/qq_46079584/article/details/122751356