神经网络压缩

神经网络压缩

Network pruning

剪枝,直接把没有用的参数直接扔掉。

(1)首先训练一个大模型

(2)评估每一个参数的重要性 / 神经元的重要性

(3)移除(但是通常来说会掉正确率)

(4)fine-turn(微调模型,回调正确率)然后回到步骤(2)

少量多次,慢慢减小

  • 以参数为单位进行裁剪

变成了形状不规则的network,实操不好实现。一是模型定义数量都是固定的,二是GPU不好计算不规则的张量。

但经过实际实验,其实加速不明显,不规则计算GPU计算甚至变慢。

  • 以神经元为单位进行裁剪

实操更简单。一般都是以神经元为单位

  • 为什么不直接train一个较小的network?

原因是:大的network是更容易被训练(更容易被optimize),小的network得不到和大网络的精度。

knowledge distillation

(1)先训练里一个老师网络(大网络),再设置一个学生网络(小网络,老师网络结构的一部分)学习

(2)让学生网络学习老师网络输出的分布

当然,老师网络不一定只会是一整个大模型,还可以是Ensemble的值(多个模型输出的平均值)。

  • Temperature for softmax

训练技巧是平滑输出分布,统一除以一个未知参数$T$(待学习)。

可以让输出分布变得更加平滑,这样可以使学生网络更好学习

parameter quantization

用较少的空间储存一个参数。

  • 用更少的比特替代一个值

  • weight clustering

数值相近的分一个群,每一个群都只利用一个数替代。

  • 用较少的比特表示频繁的簇,用更多的比特表示稀少的簇

终极目标是 只用一个比特(+1 / -1)代表一个参数

Architecture Design - Depthwise Separable Convolution

(1)Depthwise Convolution:有几个channel就有几个filer,每一个filter就只负责一个channel。输出和输入的channel是一样的。(这样就导致跨channel的特征是看不出来的,因此需要步骤2)

(2)Pointwise Convolution:这里定义限制大小都是$1 \times 1$的filter。channel内部的关系是Depthwise Convolution的工作,Pointwise Convolution只专注于考虑channel的关系。

这样子可以缩小参数量

  • 原理是Low rank approximation,如下图所示,从$M\times N$变成$N\times K + K \times M$

当然这样的作法肯定会增加$W$的限制

因此,Depthwise Convolution具体设计为:

Dynamic Computation

如果准备多个网络结构,就需要大量的储存空间。因此,期望模型可以自己调整计算量(不同设备的运算资源不一样 / 同一个设备不同的电量的运算资源也不一样)

  • 网络自己调整网络的深度。通过每一层多加一个layer,判断是否在该层输出。

  • 网络自己调整自己的网络宽度

其他运用任务:对于不同的输入,输入的复杂度也需要不同的算力。