模型压缩

对于复杂问题建模时,深度学习模型在容纳更多参数的情况下,效果一般更好,但是模型占内存大,预测时间长的,往往限制其在小型或普通配制的硬件上使用。一般使用模型压缩方法给模型减肥,主要方法总结如下。

模型剪枝

移除对结果作用很小的参数权重,如接近0的参数。具体如去掉某些卷积核,或者卷积核中的某些权重,还有对通通道的减枝,对层的减枝,对注意力头的减枝等。 #### 非结构剪枝 非结构剪枝相对比较底层,使模型结构受到影响,pytorch,tensorflow不能支持。常用结构剪枝,相对简单,但没有非结构剪枝效果好。 结构剪枝方法如:DropOut,DropConnect让神经元或连接失活,置0,但仍然会参与计算。 有一些改进,比如根据全局所有参数的分布来计算某一道通路是否被减掉。 #### 结构剪枝 移除通道(Network slimming, 2017),通过减枝和微调不断迭代,可以把yolo3减掉70%。 彩票假设(The Lottery Tickets Hypothesis, ICLR 2019),找彩票子网络(比较特殊的子网络)。 彩票代码: torch.nn.utils.prune.* 其中常用迭代修剪:prune.ln_structured(), prune.global_unstructed()

Pasted image 20220925094745.png

模型量化

减少存储权重所需的比特数,比如将 float32 降到 int8,基于KMeans的量化方案等等(将训练好的所有参数分成几簇,然后把权重转换成簇索引)。它能节约空间,但不能提速。

参数共享

通过共享参数,达到减少网络参数的目的。一个不熟悉的词可由常用词定义,或者用普通单词的嵌入的稀疏组合;又如ALBERT可跨层共享所有参数。它的问题是不能提速。

低秩分解

低秩分解的方法运用了矩阵分解和矩阵乘法的结合律。把较大的卷积核分解为两个级联的行卷积核和列卷积核。比如:将一个3×3的卷积层,替换为一个3×1的卷积层加上一个1×3的卷积核。 它只能用于优化全连接层。

架构设计

使用空洞卷积,线性运算代替卷积。

知识蒸馏

将 teacher 的能力蒸馏到 student上,最近看了一些论文总结如下: * 第一次提出知识蒸馏 外链:论文阅读_神经网络知识蒸馏_DK 内链:论文阅读_神经网络知识蒸馏_DK * 第一次将知识蒸馏用于自然语言处理 外链:论文阅读_BERT知识蒸馏 内链:论文阅读_BERT知识蒸馏 * 针对Transformer结构使用知识蒸馏 外链:论文阅读_模型蒸馏_TinyBERT 内链:论文阅读_模型蒸馏_TinyBERT * 另一篇基于Transformer结构的优化,更易用 外链:论文阅读_知识蒸馏_MobileBERT 内链:论文阅读_知识蒸馏_MobileBERT * 结合元学习和知识蒸馏 外链:论文阅读_知识蒸馏_Meta-KD 内链:论文阅读_知识蒸馏_Meta-KD * 包含蒸馏源码的工具包 外链:EasyNLP 内链:EasyNLP

参考

一文详解文本深度学习模型的压缩