深度学习的26条课堂笔记

八月之初,我参加了在蒙特利尔举办的深度学习暑期课程。课程共持续了 10 天,出席的报告人均是在神经网络领域最著名的研究人员。这次课程,我学到了很多以至于不能够在一篇文章中写出来。所以,我并没有介绍超过 60 小时的神经网络知识,而是做了一个关于暑期课程的各种小却有趣的知识点的整理,通过这篇文章展示出来。

在写作的时候,课程主页 仍然在线,其中包含了所有的演示课件。本文所及的所有的信息和大多数的讲解都来自这些课件,都是这些研究人员的原创工作。同时要提及的是,暑期课程中的报告都已经做了良好的视频录制,希望很快能够出现在网络上供更多的人学习。 好,现在我们开始吧。

1. 对分布式表达的需求

在 Yoshua Bengio 的第一个报告中,他讲到:“这是我最重要的一张 slide。”你可以看看这一张 slide,也是最重要的一张 slide:



2015-10-13

假设我们有一个分类器来检测人的性别(男或者女),戴不戴眼镜,高或者矮。使用非分布式表示的话,我们需要处理 2*2*2 = 8 种分类。为了训练出一个准确的分类器,你需要对每个类别都有足够多的数据。然而,借助分布式表示,这些属性可以通过一个不同的维度刻画。这意味着即使分类器没有遇到戴着眼睛的高个男人,它也能够检测出来,因为它已经从其他的样本中独立地学得了检测性别,戴眼镜和身高。

2. 在高维空间中局部极小值并不是问题

Yoshua Bengio 的研究组实验中发现在优化高维神经网络参数时,通常没有局部极小值。相反,存在一些在某些维度(并非全部)中是局部最小值的鞍点。这意味着,训练会在这些点初变得很慢,直到网络弄明白如何逃出这些点,但只要我们愿意等待足够长的时间,最终还是能够找到逃出的机会的。 下图展示了训练中的网络,在抵达鞍点和逃脱鞍点这两个状态间震荡的现象。



2015-10-13-1

指定一个维度,在该维度某个点是局部极小值但非全局极小值的概率是一个很小的值 p。那么,在一个 1000 维的空间中的点在所有的维度上都是错误的局部极小值的概率就是 p^{1000}。然而,该点在部分维度上是局部极小值的概率实际上非常高。如果在训练中一旦在很多空间上碰到这些极小值,那么训练将会阻滞在这里直到最终找到正确逃出方向。

另外,这里的概率 p 将会随着代价函数接近全局最小值的时候增加。这表示,如果我们停止在一个较好地局部极小值上,那么也就是说能够尽可能地接近全局极小值。

3. 导数!导数!还是导数!

Leon Bottou 在报告中总结了一些有关激活函数、代价函数及其各自导数的表格,非常有用。下面会介绍。

2015-10-13-2

激活函数及其导数

 

2015-10-13-3

4. 权值的初始化策略

目前神经网络中推荐使用的初始化策略是从 [-b, b] 间均匀地采样 W_{i,j}^{k},其中

2015-10-13-4

而 H_k 和 H_{k+1} 则是隐藏层在作用权值矩阵前后对应规模。 这是 Hugo Larochelle 推荐的,出自 Glorot & Bengio 2010。

5. 神经网络训练的技巧

一些来自 Hugo Larochelle 的实用建议:

  • 正规化的实值数据。减去均值,除以标准差。

  • 在训练时减少学习率

  • 使用 minibatch 来进行更新——梯度更加的稳定

  • 使用 momentum,来到达 plateau

6. 梯度验证

如果手工实现了 BP,它并不可用,那么99%是出 bug 了。使用梯度验证技巧可以发现这个问题。其想法就是使用梯度本身的定义:对权重微小的调整将会对模型的错误产生多大的影响。

2015-10-13-5

这里Gradient checking and advanced optimization 可以找到更加深入的解释。

7. 行动追踪

人类的行动可以很准确地追踪了。下面是这篇论文Dynamical Binary Latent Variable Models for 3D Human Pose Tracking 的例子。其中方法使用了条件限制的玻尔兹曼机(conditional restricted Boltzmann machines.)

2015-10-13-6

8. 语法还是非语法(真的要把语法当回事么!!?)

Chris Manning 和 Richard Socher 在发展合成模型方向下了不少功夫,期望组合神经网络嵌入和更加传统的解析技术。这里提到的文章是Recursive Neural Tensor Network 这项工作使用了加法和乘法的作用来把词的含义整合在一颗分析树上。 后来,这个模型被 Le 和 Mikolov 的 Paragraph Vector 比下去了,这项工作并没有考虑句子的结构或者语法信息。Chris Manning 称这项工作是「 创建好的复合向量的失败」 。 然而,更近的使用分析树的工作又超过了上面的结果。Irsoy & Cardie (NIPS, 2014)通过在多个维度更深地理解而能够击败 paragraph vector。最后,Tai et al. (ACL, 2015)通过组合 LSTM 和 分析树又提高了结果。 而当前在 Stanford 5-类 情感分析数据集上的准确度结果如下:


MethodAccuracy
RNTN (Socher et al. 2013)45.7
Paragraph Vector (Le & Mikolov 2014)48.7
DRNN (Irsoy & Cardie 2014)49.8
Tree LSTM (Tai et al. 2015)50.9


这样看起来,使用分析树的模型稍稍占优。我很好奇下一个非语法的方法何时能够出现,并重新获胜。总之,很多神经网络模型的目标不是丢弃那些语法知识,而是隐式地在同一个网络中刻画出这些知识。

9. 分布式 和 分布的

Chris Manning 给出了关于这两点的澄清认识。Distributed:表示成在一些元素中的连续的激活层次。如一个稠密的词嵌入,对比与 one-hot 向量。Distributional:含义通常与上下文相关。Word2vec 是 distributional,但是 count-based 向量也是,因为我们使用了词的上下文环境来建模含义。

10. 依赖解析的研究现状
ParserUnlabelled AccuracyLabelled AccuracySpeed(sent/s)
MSTParser91.488.110
TurboParser92.389.68
Stanford Neural Dependency Parser92.089.7654
Google94.392.4?

最后一个是 Google 使尽浑身解数得到的结果,使用大量了资源来训练 Stanford 的神经网络分析器。

11. Theano

2015-10-13-7

恩,我之前对 Theano 并不熟悉,但是经过暑期课程我的确学到了不少。非常赞! 因为 Theano 诞生在 Montreal,所以直接去问开发者特别有收获。 课上提到的大部分信息在网上都能找到,都是interactive python tutorials这样的形式。

12. Nividia digits

Nvidia 有一款叫做 Digits 的工具可供训练和可视化复杂的神经网络模型,不需要写代码。同时他们还在销售一款称为 DevBox 的机器,用来运行 Digits 和其他深度学习软件(Theano,Caffe等等)。其中带有 4 块 Titan X GPU,售价在15,000美元。

13. Fuel

Fuel 是一款管理数据集的工具——可以划分数据成 minibatch,管理 shuffling,作用不同的预处理过程,等等。同样还包含了预装的数据集如 MNIST、CIFAR-10和Google 10亿语料库的函数。主要是为了支撑 Blocks,这是一款基于 Theano 的简化神经网络构建的工具库。

14. 多模态 linguistic regularities

还记得例子:“king – man + woman = queen”?看起来这也可以和图像一起使用(见 Kiros et al., 2015)

2015-10-13-8
15. 泰勒级数近似

若是处于点 x_0,移动一步到 x,则在知道导数的情况下使用泰勒级数近似可以估计在 x 处的函数值:

2015-10-13-9

类似地,我们可以使用同样的方法来估计在更新参数 \theta_0 为 \theta 时的代价函数:

2015-10-13-10

其中 g 表示代价函数关于 \theta 的导数,而 H 则是代价函数关于 \theta 的二阶导数的 Hessian 矩阵。 这就是二阶泰勒级数近似,但是我们也可以通过获得更高阶的导数来达到更准确的估计。

16. 计算强度(intensity)

Adam Coates 给出了一种分析在 GPU 中矩阵操作速度的策略。这是一个简化的模型,假设时间花在读/写或是计算上。假设这两种操作都是并行的,我们就来看看哪种操作的时间花费更多。 假设我们计算矩阵和向量的乘积:

2015-10-13-11

如果 M = 1024 和 N = 512,那么需要读出和存储字节数就是:

2015-10-13-12

需要进行的计算数就是:

2015-10-13-13

如果我们有一块 GPU 其性能是 6 TFLOP/s,且内存的带宽是 300 GB/s,那么总共需要的运行时间就是:

 

2015-10-13-14

这意味着存储操作的时间的上界是 7μs,拥有更快的 GPU 也于事无补。你可能会猜测,这种情况会随着更大的矩阵或者向量,又或者进行矩阵乘法的时候,而有所改善。

Adam 同样描述了操作的计算强度这个想法:

2015-10-13-15

在前面的场景中,这个值就是:

2015-10-13-16

更低的强度表示系统在内存上存在着瓶颈,高强度则表示 GPU 速度的瓶颈。这个现象可以可视化出来,从而找到这两者哪个需要改进从而使得整体的性能有所改善,同时也能发现那些性能最佳的点。

2015-10-13-17

17. Minibatches

继续上面强度的讨论,一种提高网络强度的方法(不被内存限制而被计算限制)就是以 minibatch 的方式进行数据的处理。这个方法避免了一些内存操作,GPU 就能够发挥其在处理大型矩阵上的优势。 然而,增加 batch 太多,也可能会对训练算法产生伤害,收敛会变得很慢。所以找到最优结果的平衡点也是很重要的。

2015-10-13-18

18. 对手样例上的训练

研究发现,神经网络会很容易被对手样本欺骗。在下面的例子中,左边的例子被正确分类成金鱼。然而,在我们作用了中间图中的噪声之后,最终右边的图中的金鱼被分成了雏菊。这个图来自 Andrej Karpathy 的博客 “Breaking Linear Classifiers on ImageNet”,你可以去读读。

2015-10-13-19

噪声不是随机的——而是精心计算过的,来欺骗网络。关键是:最终右边的图看起来还是金鱼而非雏菊。 很明显诸如集成模型(多个模型的投票)这样的方法,和无监督预训练都在面对这样的问题时失败了。使用重度的正规化手段会有作用,但是也是以降低在干净的数据上的性能为代价的。 Ian Goodfellow 提出了一种在这些对手样本上进行训练的想法。他们可以自动生成,加入到训练数据集中。下面的结果就是在有对手样本的情形下起作用,并且提升了干净样本上的准确性。

2015-10-13-20

最后,我们可以通过惩罚原始预测分布和在对手样本上的预测分布的 KL-divergence 提升性能。这种方法优化出的网络更加的健壮,可以对类似的(对手)样本预测类似的类分布。

19. 每件事都是语言建模

Phil Blunsom 提出了一种想法——几乎所有的 NLP 任务都可以组织成一个语言模型。我们可以通过连接输出到输入上实现这点,试着预测整个序列的概率。

  • 翻译:

2015-10-13-21

  • 回答:

2015-10-13-22

  • 对话:

2015-10-13-23

后面两个需要额外的知识。第二部分只是甚至不需要是词的信息,可以是标签或者诸如依赖关系这样的结构性输出。

20. SMT 刚刚起步

当 Frederick Jelinek 和他在 IBM 的团队在 COLING 1988 提交了第一篇关于 SMT 的论文时,他们得到了下面的匿名评审:

2015-10-13-24

机器翻译的统计(信息论)观点的合理性已经由 Weave 早在 1949 年给出了。同样在 1950 年被广泛确认是错误的。(cf. Hutchins, MT – Past, Present, Future, Ellis Horwood, 1986, p. 30ff and references therein).这种计算的粗暴本性并不能称得上科学。这篇论文并不处于 COLING 的范围。
21. 神经网络机器翻译 的现状

简单的神经网络模型可以产生很好的结果。在 Phil Blunsom 的 slide 中介绍了中英翻译的例子:

2015-10-13-25

在这个模型里,中文词的向量简单地相加在一起形成了句子的向量。解码器包含一种条件语言模型,使用句子向量以及最近产生的英文单词作为输入,最终产生出在翻译中的后面的词。

然后神经网络模型仍然没有超过目前最佳的传统机器翻译系统。当然已经非常接近了。参见 “Sequence to Sequence Learning

ModelBLEU score
Baseline33.30
Best WMT'14 result37.0
Scoring with 5 LSTMs36.5
Oracle (upper bound)∼45

更新@stanfordnlp 指出现在已有最新的结果表明神经网络模型已经超过传统的最优机器翻译系统。参见:Effective Approaches to Attention-based Neural Machine Translation

22. MetaMind 分类器 demo

Richard Socher 展示了 MetaMind 的image classification demo,你可以通过上传图像来训练分类器。我训练了一个分类器来检测 Edison 和 Einstein。每个类别分别有 5 个样本图像,最后使用 one-hold-out 方式来测试。看起效果不错:

2015-10-13-26

23. 优化梯度更新

Mark Schmidt 给了两个关于不同场景下的数值优化报告。 在一个确定式梯度方法中,我们计算整个数据集上的梯度,然后进行更新。迭代的代价与数据集大小成线性关系。 在随机梯度方法中,我们计算一个数据点的梯度,然后进行更行。这个迭代的代价是跟数据集大小独立的。 随机梯度下降的每次迭代非常快,但是通常需要更多的迭代来训练网络,正如下图所示:

2015-10-13-27

为了获得两种方法之间的平衡,也达到最优的效果,我们可以使用 batch。具体点就是我们可以使用随机梯度下降在数据集上进行一次,为了更快地获得正确的下降路径,接着开始增加batch 的大小。梯度的错误在 batch 大小增加时会下降,尽管最终迭代的代价又会重新依赖数据集的大小。

随机平均梯度是一种解决上面问题的方法,给出了一种在每次迭代时只有一个梯度的线性收敛率。然而,对于大规模的神经网络也并不适合,因为它需要记住每个数据点的梯度更新值,这就需要庞大的存储资源。随机方差降低梯度(SVRG)则是另外一种减少内存消耗的方法,每次迭代只需要两次梯度计算(可能有偶然的全部趟的计算)。

Mark 提到他的一个学生实现了一种变体的优化方法(AdaGrad,momentum,SAG 等)。Mark 询问时他会用在神经网络中使用,学生说了两种: Streaming SVRG和一个还没有发布的方法。

24. Theano 性能分析

如果你在 THEANO_FLAGS 中设置 profile=True,就是启动分析程序的功能,记录出每个操作的时间使用情况。在找性能瓶颈的时候特别有效。

25. 对手网络框架

在 Ian Goodfellow 关于对手样本的报告后,Yoshua Bengio 探讨了如何让两种系统竞争的想法。 系统 D 是判别式系统,用来将真实数据和人工产生数据分类。 系统 G 是生成式系统,用来产生系统 D 会错误分类的人工数据。 在我们训练其中之一系统时,另外一个也需要变得更好。在实践中,这个方式确实起到了作用,尽管确保 D 可以与 G 保持一致的步骤需要非常小。下面是来自Deep Generative Image Models using a Laplacian Pyramid of Adversarial Networks 的一些例子——更加高级的尝试产生教堂的图像的模型。


2015-10-13-28


26. arXiv.org 命名

arXiv 文章的命名包含了文章年份和月份,然后跟着一串数字。所以论文 1508.03854就是在 2015 年 8 月份的第 3854 份提交。很有用!

入门深度学习神经网络
暂无评论
暂无评论~