1. 神经网络的压缩
对于一些大型的神经网络,它的网络结构是十分复杂的(听说华为的一些神经网络有上亿的神经元组成),我们很难在很小的设备中(比如我们的apple watch)上面将这个这个神经网络放上去。这就要求我们能有能力将神经网络进行压缩,也就是 Network Compression。
李宏毅老师在课程中提到了5中神经网络的压缩方式:
- Network Pruning
- Knowledge Distillation
- Parameter Quantization
- Architec Design
- Dynamic Computation
下面我们来一一简单地介绍
1.1 Network Pruning
神经网络的修剪主要是从两个角度去完成:
- 权重的重要性
- 神经元的重要性
其中权重的重要性可以使用常见的 L1 或者 L2 范数去刻画;而神经元的重要性可以通过该神经元在给定数据集时不为零的次数来决定。(仔细想想,这和决策树的剪枝也挺像的)。从下面两幅图,我们也可以看出两种修剪方式的不同。通常情况下,为了使得我们的网络更好搭建,我们选择根据神经元的重要性进行修剪。
1.2 Knowledge Distillation
Knowledge Distillation 就是训练一个小的网络去模拟已经训练出来的大网络的输出结果。如下图所示,小的网络的输出应该尽量和大网络的输出一致。我们一般通过交叉熵损失来衡量这种一致性的好坏。
有时候,我们会去让小网络去模拟一群大网络集成后的结果,具体操作如下图所示:
1.3 Parameter Quantization
Parameter Quantization 的主要思想是使用聚类的方法将相似的权重聚在一起,并统一使用一个值去代替。如下图所示:
1.4 Architec Design
Architec Design 是通过改变网络的结构,以使得网络的参数大大减少。我们先来看一个例子。这个例子有点像矩阵分解里面的 SVD ,对于一个 N × M N \times M N×M 的全连接层,我们通过在其中再加一个长度为 K K K 的线性层,来达到减少参数的目的。我们可以近似地把这个操作看做将 N × M N \times M N×M 的矩阵用 N × K N \times K N×K 和 K × M K \times M K×M 两个矩阵的乘积去代替,当 K K K 远小于 M M M