一、大纲
emmm,硬件及算法加速部分是博主实验室的主要研究领域,总算可以多说点体会而不是疯狂翻译和贴图了。
主讲人是韩松,清华电子系本科,Stanford Phd,深鉴科技创始人之一,主要工作在深度学习的算法和硬件。
内容主要分为四个部分(2x2):算法优化(训练、推理),硬件优化(训练、推理)。也是科研的四个大方向。
二、第一部分:Algorithms for Efficient Inference
这一大类可以分为6个思路:
1. Pruning;
2. Weight Sharing;
3. Quantization;
4. Low Rank Approximation;
5. Binary/Ternary Net;
6. Winograd Transformation.
内容和一篇模型压缩的综述论文比较相似,想要参看具体一些前沿工作的内容,可以参考文献:《Model Compression and Acceleration for Deep
Neural Networks》
1、Pruning (应该可以翻译为 剪枝)
1989由LeCun提出。剪枝的过程同样有生物学上的支持,出生时人脑有50T的突触、在一岁的时候达到1000T,然后到了成年以后降低为500T。
已有很多实验证明,神经网络结构是存在大量的冗余的,从信息论上来说就是网络结构可以有效表示的信息量远超所需要学习的信息量,所以通过剪掉网络中信息量很小的连接,对于网络精度几乎没有降低,同时还可以降低模型复杂度、预防过拟合等好处。
过程是:训练连接、剪掉多余连接、训练权重。然后2、3步循环。
剪枝过程会改变权值的分布。
2、权值共享 Weight Sharing
现在通过剪枝,有了更少的参数量,那么现在我们考虑更少的bit per parameter。
2.09、2.12、1.92、1.87 -> 2.0 我们的想法就是Cluster the Weights。
举个栗子:
对于推理过程,我们对weights 进行k-means clustering,建立一个2bit的字典book索引,以及存储他们的均值。(减少16X的存储空间)
对于反向传播过程,我们将有同样的index的梯度,求和并更新Centroids的值。
在这种trained quantizaiton方法下,权重的分布由连续变为离散。栗子中为16个分立的值,所以可以用4bit来表示。
通过实验,寻找最优的表示位数,前面是CNN,后面是全连接网络。
2.1 哈弗曼编码 Huffman Coding
基本思想是:
不常见的权值 In-frequent weights : 使用更多的bit来表示;
常见的权值 : 更少的bit;
结合这三种方法,可以达到非常brilliant的压缩率。(不损失精度,还可以提升一点精度)
2.2 SqueezeNet
上述方法都是使用的预训练的模型。假如直接根据压缩的思想来设计CNN框架。
使用1x1的Squeeze Layer在3x3conv之前,减少channel数。然后一个类似Inception model的结构,只用了1x1和3x3的conv。
全网络都是使用conv,没有全连接fc,最后一层是一个全局pooling。
针对这样一个已经紧凑设计的网络(未压缩之前,size是4.8M,是AlexNet的1/50),进行compression。结果是压缩完只需要0.47M的size。
3、Quantization
实验结果:
4、低秩分解 low rank approximation
一个conv layer 可以分解为 两个不同卷积核的conv layers。
若要用在FC layer,一个简单的想法是用SVD将一个矩阵分解为2个矩阵。
5、二值/三值网络
近期的工作,训练阶段仍使用全精度;在推理阶段,使用三值权重。(最好检索一下 TTQ Kernel)
在ImageNet上的精度还不是很好。
6、Winograd Transformation
6、Winograd Transformation
是一种降低卷积计算算法强度的方法,论文参见《Fast Convolution for CNN》。已经在cuDNN5 框架中采用,对比cuDNN 3 有着60%-100%的性能提升。
三、Hardware for inference
举了几个ASIC的例子,MIT的经典之作Eyeriss,中科院的DaDiannao,Google的TPU和Stanford的EIE。
都旨在解决一个重要的问题:减少Memory Access 来降低功耗。
Google 的TPU的参数:
接下来将如何设计高效的硬件for inference:以他自己的EIE(Efficient Inference Engine)为例
思想就很简单,略过稀疏,和共享权值。
思想就很简单,略过稀疏,和共享权值。
一个具体的稀疏的矩阵乘法,逻辑和硬件计算如下图:
硬件上,只存储非零权值,
使用一个查找表(lookup table)来解码一个四位的weight 到16bit 的weight。4位的相对index通过地址累加器,得到16位的绝对index地址。
四、Algorithms for Efficient Training
分为四个小点:
1、Parallelization
2、Mixed Precision with FP16 and FP32
3、Model Disitillation
4、DSD : Dense-Sparse-Dense Training
1、Parallelization 并行化
首先老生常谈:摩尔定律已死。然后讲并行化的大势所趋。
数据并行化 一个简单的想法 : 协同权重更新
由一个 master sever来负责梯度更新,其余的sever进行并行的前向计算loss。
模型并行化 另一个想法是: 将模型在多核上并行化
将一个输入图像分割成2x2的小格子,全连接就直接分切矩阵。
超参并行 第三个想法:并行化训练,尝试不同的超参
总结如下:
2、Mixed Precision with FP16 and FP32
这个还是比较老的工作,具体思想如下,在不同的阶段用更适合的精度:
这篇文章,博主恰好看过,详细介绍见另一篇博客
【百度、NV】混合精度训练。
基本没有精度损失,甚至使得精度更优。
3、模型蒸馏 Model Distillation
前两天听一位交大的教授介绍过,他们组想要通过信息论的角度,定量分析神经网络的信息容量,因为实验证明,现在的超深的网络(比如ResNet动辄上百层)往往是信息容量过剩的,通过师生网络,可以通过深网络训练一个很小的网络,同时能够使得小网络的性能达到深网络的性能。
师生网络:
思想是,使用软化的(形象一点就是 数据上更模糊的)output来训练学生网络:
学生网络仅训练了3%的数据,即达到了收敛,精度仅掉了2%。
4、DSD : Dense-Sparse-Dense Training 又是大神的近期工作 orz
在剪枝的时候看到过,如下图,如果再让它变得Dense,增加它的细节表达能力:
大概的意思是啥呢? 就是好比先画一棵树,先画了个枝干,然后再画树叶。
在不同的网络下,增加了1%-4%的精度。 ???感觉怪怪的。
在不同的网络下,增加了1%-4%的精度。 ???感觉怪怪的。
五、Hardware for Efficient Training
1、GPU (N卡党的胜利) —— TITAN V 和 V100 炸天。