课程视频地址:https://study.163.com/courses-search?keyword=CS231

课程主页:http://cs231n.stanford.edu/2017/

这一讲主要从运行效率方面介绍深度学习。

这一讲主要介绍从算法和硬件的角度提升深度学习的效率,内容主要分为以下四个部分:

首先是高效推断的算法:

高效推断的算法

1.剪枝

剪枝的思路很简单,首先训练神经网络,然后去掉低于某个阈值的权重,接着重新训练:

图示如下:

实验表明,这样做基本能保持神经网络的性能,甚至更好:

注意剪枝改变了权重的分布:

2.权重共享

权重共享的思路是将大小相近的权重近似为同一个数,这样可以减少内存的开销:

整个流程如下:

来看一个具体例子:

那么这样做的实际效果如何呢?实验表明,我们只要存储少量的有效数据就可以达到原来模型的性能:

还可以用Huffman编码存储权重,这样可以存储更多有效数字。实际中,剪枝和权重共享可以一起使用,把这两部分结合在一起,得到下图:

3.量化

量化的思路很简单,首先用浮点数的形式进行训练,然后统计权重的信息,将权重转化为定点数,减少内存开销,最后产生的效果也非常好:

4.低秩近似

低秩近似的思路是用多个低维子空间表示某一层神经网络,例子如下:

5.二元/三元网络

二元/三元网络的思路非常大胆——只用两个或三个权重表示神经网络。具体的步骤是在训练时用全部权重,预测时只使用两到三个权重,实验表明,这种方法的效果还不错,可以大大加快预测过程。

6.Winograd转换

Winograd转换可以高效进行卷积操作,过程如下:

这里没有说太多细节,整体思路是先将滤波器转换为矩阵,然后用逐点乘法,最后再变换回结果,算法可以提升几倍效率。

高效推断的硬件

这部分介绍硬件,这里简单过一下,比较有名的芯片如下:

Google TPU

TPU专门设计用于训练神经网络,它做矩阵运算的速度非常快:

EIE

EIE是老师自己设计的芯片,思路是应用刚刚介绍的算法,这可以大大加速:

高效训练的算法

1.并行

首先有数据并行,即一次训练多个数据:

参数更新如下:

其次是模型并行,通过分割权重来进行:

最后是超参数并行,即并行训练很多个网络。

该部分总结如下:

2.16位浮点数和32位浮点数的混合精度

首先看下16位浮点数和32位浮点数消耗的能量差异:

混合精度就是同时使用两者,可以在保证精度的同时减少内存以及能量消耗:

实验表明,这种做法的效果也非常好。

3.模型蒸馏

模型蒸馏的思路是利用大型神经网络来“教”小型神经网络,使其达到接近的效果:

方法是使用软标签:

数学上,可以使用参数$T$来得到更柔和的分布:

4.DSD: Dense-Sparse-Dense Training

DSD的过程为先训练模型,然后减枝训练,最后恢复模型再重新训练:

该方法的直觉是先学习树干,然后学习树叶:

实验结果表明,这种方法可以带来非常不错的效果。

高效训练的硬件

这部分主要介绍一些硬件,从略。