参数裁剪与共享

原文

参数裁剪与共享

早期的工作表明模型裁剪对减少网络复杂度和处理过拟合问题是很有帮助的。之后研究人员发现裁剪一开始引入是为了减少神经网络的结构并提高泛化能力,也被广泛地研究用来来压缩DNN模型,因为我们可以尝试将那些对模型性能不太重要的参数去掉。这些技术可以进一步分为三个子类:量化和二值化、参数共享以及结构矩阵。

A.量化和二值化

网络量化是通过减少表示每个权重的位数来达到压缩原始网络的目的。Gong[6]和Wu[7]使用k-means标量来对参数值进行量化。Vanhoucke[8]说明8比特参数量化具有非常大的性能提升,而且精度损失很小。[9]在基于随机取整的CNN训练中使用16比特定点表示,这种方法极大减少了内存占用和浮点数计算,而且分类精度损失很小。
[10]使用权重共享和Huffman编码对量化权重和码表进行压缩。如图1所示,一开始正常训练学习,然后裁剪小权重的链接,最后将剩余的稀疏网络重新训练。这种方法在所有基于量化的方法中获得了最好的性能表现。[11]表明Hessian权重可以用来测量网络参数的重要性,还提出可以用最小化平均Hessian权重误差的方法来聚类网络参数。
最极端的量化是使用1比特来表示网络参数,就是二值权重神经网络。有很多方法直接使用二值权重来训练CNN神经网络,比如BinaryConnect[12],BinarayNet[13]以及XNORNetworks[14]。主要思想是直接在训练时学习二值权重或使用二值激活函数。[15]中的系统性研究表明反馈传播训练的神经网络可以变到特殊的权重,包括二值权重。
缺点:在处理大型CNN网络比如GoogleNet时,二值网络精度降低还是非常大。另一个缺点是现有的二值化方案是基于简单的矩阵近似,忽略了二值化对精度的影响。
为了处理这个问题,[16]提出了一个对角Hessian近似的邻近牛顿算法,直接对二值化权重的损失进行最小化。[17]减少了训练过程中浮点乘法的时间,主要通过随机二值化权重,以及把浮点数乘法从隐状态计算变为最高位的改变。

B.裁剪和共享

网络裁剪和共享已经被用来减少网络复杂度以及处理过拟合问题。早期裁剪方法有偏权重衰减[18]。Optimal Brain Damage[19]和Optinmal Brain Surgeon[20]方法通过损失函数的Hessian矩阵减少网络连接的数量,他们的工作暗示这种裁剪比基于梯度的比如权重衰退方法有更好的精度。使用这些方法的训练过程和初始训练过程一致。
这个方向近期的趋势是在预训练CNN模型中裁剪冗余的、无信息的权重。例如,Srinivas & Badu[21]探究神经元的冗余性,提出了一个无需数据的裁剪方法来去掉冗余神经元。Han[22]提出了一种方法来减少整个网络的参数和操作数量。Chen[23]提出一个HashedNets模型,这个模型使用低消耗的哈希函数来讲参数放到hash桶中,达到参数共享的目的。深度压缩方法[10]去除冗余连接并量化权重,然后使用Huffman编码来对量化后的权重进行编码。在[24]中,一个简单的基于温和的权重共享的正则化方法被提出,这个方法包括一次(重)训练的量化和裁剪两部分。以上这些方法典型地用于对CNN进行连接裁剪。
还有一个持续增长的关注点是在稀疏限制下训练简洁的CNN网络。这些稀疏条件典型地包含在优化问题的 l 0 l_0 或者 l 1 l_1 正则化中。[25]通过在卷积滤波器上强加群组稀疏限制来获得结构化的brain Damage,即裁剪在按组进行的卷中裁剪部分卷积核。[26]提出了稀疏正则化矩阵组,在训练CNN网络时,通过减少卷积滤波器来学习更简洁的网络。Wen[27]在每一层增加一个结构化的稀疏正则矩阵来减少试验滤波、通道甚至层数。在滤波器层面的参见中,所有上面这些工作都使用 l 2 , 1 l_{2,1} 范数正则项。[28]使用 l 1 l_1 正则来选择和裁剪不重要的滤波。
缺点:在裁剪和共享中有一些潜在的问题。首先,使用 l 1 l 2 l_1、l_2 正则比通常情况需要更多次迭代才能收敛。而且,所有的裁剪标准都依赖人为地设置层的敏感度,这就需要对参数进行精细调节,对一些应用来说可能是个麻烦。

C.设计结构矩阵

在包含全连接层的架构中,探索全连接层参数的冗余性是非常必要的,这些冗余通常是内存占用的瓶颈。这些网络层使用非线性变换 f ( x , M ) = σ ( M x ) f(x,M)=\sigma(Mx) ,这里 σ ( . ) \sigma(.) 是一个对每个元素单独操作的非线性算子,x是输入向量,M是m x n的参数矩阵。当M是一个大的通常的稠密矩阵时,存储m x n个参数的消耗以及计算矩阵向量惩罚的时间复杂度是O(mn)。因此,一个直觉的裁剪参数的方法是给x加上一个参数化的结构矩阵。一个m x n的矩阵可以使用更少的参数来表示,如过它是有特殊结构的。典型地,这种结构不仅仅可以减少内存消耗,还可以对训练和推理过程中的矩阵-向量乘法和梯度计算进行加速。
顺着这个方向,[30],[31]提出一种基于循环投影的简单有效的方法,同事还能保持不错的误差。给定一个向量 r = ( r 0 , r 1 , . . . , r d 1 ) r = (r_0, r_1, ..., r_{d-1}) ,循环矩阵 R R d × d R\in R^{d\times d} 定义如下:

R=circ(r):=\begin{bmatrix}
   r0     & r_{d-1}  & ...      & r2 & r_1 \\
   r1     & r_0      & r_{d-1}  &  & r_2 \\
   ...    & r_1      & r_0      &  &  \\
   r_{d-2} & ...     & ...      &  & r_{d-1} \\
   r_{d-1} & r_{d-2}  & ...     & r1 & r_0 \\
\end{bmatrix}

因此内存消耗从 O ( d 2 ) O(d^2) 降到 O ( d ) O(d) 。这个循环结构还可以使用快速傅里叶变换(FFT)来加速计算。给定一个d为向量r,上面的1-层循环神经网络时间复杂度是 O ( d l o g d ) O(dlogd)
[32]中,一个全新的自适应Fastfood变换被提出来对全连接层的矩阵-向量乘法进行重参数化。自适应的Fastfood变换矩阵 R R n × d R\in R^{n\times d} 定义为:

R=SHG \Pi HB

这里S,G和B是随机对角矩阵。 Π { 0 , 1 } d × d \Pi \in \{0,1\}^{d\times d} 是一个随机置换矩阵,H代表Walsh-Hadamard矩阵。使用自适应Fastfood变换对d个输入和n个输出的全连接层进行重参数化,可以将空间复杂度从 O ( n d ) O(nd) 降为 O ( n ) O(n) ,时间复杂度从 O ( n d ) O(nd) 降为 O ( n l o g d ) O(nlogd)
[29]中的工作表明了结构化矩阵的有效性。他们提出的方法可以被延伸为各种其他的绝够花矩阵,包括快和多层Toeplitz类矩阵,和多维卷积有关。顺着这个思路,[35]提出了一种通用的结构,对CNN的线性层都是有效的。
缺点:这些方法的一个问题是,这种结构化的限制会对性能带来损失,因为这些限制可能会给模型带来偏差。另一方面,如何找到一个合适的结构矩阵也比较困难,目前没有理论方法来解决。

发布了42 篇原创文章 · 获赞 33 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/gaussrieman123/article/details/89228274