All lectures

Lecture 6: Optimization: How to make the learning go faster

6.1 小批量学习的梯度下降

回忆 3.2 Linear Neurons 的误差曲面,其水平切面是椭圆形的。如果这个椭圆形很长且我们使用的是全批量学习方法,则:

  • 当梯度很大时,下降方向并不指向目标,偏偏此时权重的调整量很大,引起误差振荡
  • 当梯度很小时,下降方向虽然指向目标,但是此时权重的调整量很小,误差难以收敛

所以像“全批量学习”这样试图一步到位的方法会遇到不少问题。那么,我们能不能保守一些,每走一步都重新评估一下现状与目标方向,分几步到达目标?其实前文提到的“实时学习”就是这种思路的极端例子:总步数与训练样本数一样多,频繁更新权重。但是这样计算量太大、计算时间很长。一个折衷的解决方案是“小批量学习”:将训练样本分为几组,每组仅计算一次权重调整量,且这几组的计算可以并行。需要注意的是,分组要保持样本分布均匀,不应出现某组富集某类样本的情况。总之,对于样本量很大、网络很大的训练,小批量学习几乎总是你的最佳选择。

6.2 一堆关于小批量学习的技巧

由前文可知,权重的调整量过大或过小都不好。而在神经网络的训练过程中,人为干预权重调整量的唯一途径是改变学习速率。所以,选择一个合适的学习速率是成败关键。

选择学习速率的最直观原则是:若误差出现振荡,则减小学习速率;若误差下降得太慢,则增大学习速率。这个过程可以用程序自动化。但是要注意,应使用独立的数据集来测量误差,即,训练集与测试集要分开。另外,通常在训练进行至尾声时都应减小学习速率,因为这样能够去除随机浮动。但是,如果过早地减小学习速率,那么虽然误差会在短期内快速下降,但是随后的学习会非常缓慢,因为快速减小的仅仅是随机误差,其余误差是网络不优带来的(Fig6.2-1)。

Fig6.2-1 Do not turning down the learning rate too soon.

考虑到如果两个隐藏神经元的输入和输出完全一致,则无论如何训练,它俩都无法互相区分开。所以,我们可以用随机的小数值来初始化权重。多小才好呢?想象一下,如果一个隐藏神经元有许多输出,那么输入即使发生微小变化,也会极大地影响结果。所以,我们可以令初始权重大致正比于“输出数的平方根”。同样的,学习速率也可以这么缩放。

另外,我们还可以通过对输入进行平移和缩放,来避免误差曲面的水平切面呈长椭圆形Fig6.2-2)。能达到相同效果的更强力的方法是,对输入向量进行去相关化、降维,比如主成分分析。

Fig6.2-2 Shift and scale the input to avoid elongated, elliptical error surfaces.

在训练深层网络的过程中,常见的、容易被误以为是局部最优的“平台期假象”有:

  • 学习速率太大,令误差居高不下
  • 当输出值的意义不是值本身,而是“输出为 1 的概率”时,神经网络通常要花很长时间根据输入来自我改进(?这里没看懂)

四种令小批量学习更快的方法,其中前三种将于下文详细介绍:

  • “动量法”调整权重。即,调整的不是权重本身,而是权重改变的快慢
  • 让每个权重拥有独立的、可变的学习速率
  • rmsprop:令学习速率根据历史梯度进行缩放
  • 一种利用了曲度信息的很酷炫的方法(此讲不介绍)

6.3 动量法

动量法就像是放一个球在误差曲面上,让其自由滚动。在刚开始,球会沿着最陡路经下降。不久后,球就会偏离最陡路经。这样,在梯度方向一致时,球会滚得越来越快;在梯度多变的时候,球的振荡会比梯度的振荡小(Fig6.3-1)。权重调整量 = 球的速度。

Fig6.3-1 Momentum method.

动量法的实现也很简单。根据上一次的实际权重调整量和本次的理论权重调整量,计算出本次的实际权重调整量,如图 Fig6.3-2

Fig6.3-2 The equations of the momentum method.

标准的动量法是,先计算该点的梯度方向,然后向该方向跨一步。而一种更好的 Nesterov 方法是,先顺着上次跨步的方向跨一步,然后根据新地点的梯度进行修正

6.4 让每个权重拥有独立的、可变的学习速率

为什么让所有的权重使用统一的学习速率不好呢?一、不同层通常有不同数量级的梯度;二、对于有很多输出的神经元,同时改变很多权重会导致“矫枉过正”。

如何让每个权重拥有独立的、可变的学习速率呢?如图 Fig6.4-1,设权重调整量为梯度、学习速率、增益的乘积。首先将增益初始化为 1。如果上次调整与本次调整方向(即符号)相同,则稍微增大增益,否则稍微减小增益。这样,一旦发生振荡,增益就会迅速减小,阻止振荡。

Fig6.4-1 One way to determine the individual learning rates.

6.5 rmsprop:梯度除以近期平均梯度

rmsprop 是 rprop 的“小批量学习”版本。rprop 方法:因为无法为所有的权重取统一的学习速率,所以在全批量学习中仅使用梯度的符号,令所有权重以相同的数量级进行调整。与刚刚介绍的方法 Fig6.4-1 不同的是,增大权重调整量的操作是乘,而非加。rprop 无法应用在小批量学习上,因为多次相乘的权重调整量会变得十分巨大。于是就有了能够用于小批量学习的 rmsprop。

(后面没看懂)

Lecture 7: Recurrent neural networks

7.1 为序列建模:概览

在许多机器学习任务中,输入和输出是两种完全不同的数据,比如,输入语音,输出词语。然而还有另一种任务,需要通过已输入的数据来推测接下来的数据,即关于序列的任务。比如,根据图像的其他部分,推测缺失部分的像素内容。这种任务处于无监督学习和监督学习的模糊地带。

说到这里,你可能会想起前文提到的 4.3 “语音识别”任务:神经概率语言模型。虽然这个模型可以根据未知词语的上下文进行推测,但是上下文的词语个数是有限且固定的,所以它本质上仍是一个“没有记忆”的模型。其他功能类似的模型有“线性动力系统”和“隐马尔科夫模型”等(Fig7.1-1)。

Fig7.1-1 Linear Dynamical Systems (A) and Hidden Markov Models (B).

像隐马尔科夫这样的模型的局限是:变量一多,隐状态就多,隐状态之间的转换概率数量更多。相较之下,RNN 更具优势:它能储存许多信息,且神经元之间是非线性关系。只要有足够的神经元和时间,它能够计算出任何能够被计算的东西。但这种强大的能力也令其难以训练。

7.2 用 Backpropagation 训练 RNN

回忆,5.3 Convolutional Neural Networks 的学习其实就是在寻找权重的过程中增加了限制条件:常规地计算梯度后,实际权重调整量等于不同位置的连接的梯度之和,从而达到同时调整相应权重的效果。同理,如果我们将 RNN 看成一种特殊的 FNN(Fig7.2-1):

Fig7.2-1 Recurrent Neural Networks as a special group of Feed-forward Neural Networks.

则很容易理解 RNN 的训练过程:常规地计算梯度后,实际权重调整量等于各时刻梯度之和。但是有一个令人讨厌的问题:我们要给所有隐藏神经元和输出神经元设初始值。解决办法是:把初始值当作权重一样去训练。下图是一个简单例子:二进制加法计算器(Fig7.2-2)。

Fig7.2-2 A finite state automaton for binary addition (A, not RNN!) and its desired output (B).

如果用 RNN 来实现二进制加法,则需要 2 个输入神经元,3 个完全连接的隐藏神经元,以及 1 个输出神经元。

为什么说 RNN 难以训练?因为在 Backpropagation 的过程中,前后时刻的权重是线性关系的,如果序列很长,则权重要么消失要么爆炸。为了解决这个问题,人们开发了四种有效的 RNN 学习方法:

  • Long Short Term Memory(LSTM):改变 RNN 的结构,使其能够长期保留信息。详见下文
  • Hessian Free Optimization(HF):当曲度很小时,也能捕捉到梯度。详见下一讲 Lecture 8.1
  • Echo State Networks(ESN):仅学习隐藏神经元与输出神经元之间的权重,而用一种精心设计的方法来初始化其他东西,使得隐藏层能够发生振荡。详见下一讲 Lecture 8.3
  • Good initialization with momentum:用 Echo State Networks 初始化输入,然后用动量法学习所有权重

7.3 Long term short term memory

Hochreiter 和 Schmidhuber 于 1997 开发的 LSTM 解决了 RNN 难以记住长序列的问题。他们设计了一种“记忆细胞”,由三个门控制:写入门(将信息写入记忆细胞)、保留门(让记忆细胞持续保留信息)、读出门(将记忆细胞中的信息输出)。若门值为 1,则该功能被激活;若门值为 0,则该功能被抑制Fig7.3-1)。

Fig7.3-1 Long Short Term Memory cell with three gates.

LSTM 的一个自然任务是“手写字母识别”(Fig7.3-2)。

Fig7.3-2 A demonstration of online handwriting recognition by an RNN with Long Short Term Memory.

Lecture 8: More recurrent neural networks

8.1 Hessian Free Optimization 简介

前面提到,当误差曲面的水平切面为长椭圆形时(即各维度曲度不一致),学习得到的权重难以收敛。如果把对每个维度的曲度列成一个矩阵,将如图 Fig8.1-1

Fig8.1-1 Curvature matrices.

长椭圆形误差曲面问题的本质是:当你沿着一个维度的最陡梯度下降时,却在其他维度上搞砸了。由于矩阵的维度(待训练的权重数量)十分巨大,难以直接求得,所以我们可以用 HF 方法来求得一个近似矩阵,然后用 Conjugate Gradient 方法令误差最小化。Conjugate Gradient 方法的直观意义是:当向最陡梯度方向走一步后,沿着该维度梯度不变、另一个维度梯度最陡的方向走下一步,以避免搞砸之前已经训练好的权重。对于一个具有 N 个维度的误差曲面来说,通常仅需要走远少于 N 步就能得到相当小的误差。所以当待训练的权重很多时,实际学习时间并不长(Fig8.1-2)。

Fig8.1-2 Conjugate Gradient.

接下来,我们看看 HF 方法的应用:预测下一个字母。

8.2 用相乘的连接和 HF 方法为字母序列建模

现在我们想用神经网络生成一段合理的文字,利用互联网上的海量文字资料作为训练集。一个问题是:应该以什么作为输入和输出的单位呢?若以单词为单位,则输入或输出向量的维度多达几十万。若以字母为单位,则维度仅有几十。所以我们选择为字母序列建模。

可以假设,输入神经元有 86 个(一个字母一个输入神经元),隐藏神经元有 1500 个。回忆 RNN 的结构:输入神经元指向隐藏神经元,隐藏神经元之间是完全连接。因此,需要训练的权重数量为 86 x 1500 x 1500 个。参数太多了!容易导致过拟合。那么,如何用更少的参数来达到同样的效果呢?我们想让 86 个字母拥有不同的转移矩阵,然后让多个矩阵共享一些参数。利用一个如图(Fig8.2-1)的 factor 可以建立起这种相乘的连接。

Fig8.2-1 Multiplicative connections. A) Using 3-way factors to allow a character to create a whole transition matrix. B) Factor.

Ilya Sutskever 于 2012 年用相乘的连接和 HF 方法完成了这个任务。他的训练集是英文维基百科里由 100 个字母组成的 5 x 10^6 个字串。对于每一个字串,他从第 11 个字母开始预测。利用 GPU,他花了一个月才将模型训练好。这个模型可能是现有的最好模型。下面是从这个模型生成的序列中挑选出来的比较有趣的一段:

He was elected President during the Revolutionary War and forgave Opus Paul at Rome. The regime of his crew of England, is now Arab women’s icons in and the demons that use something between the characters‘ sisters in lower coil trains were always operated on the line of the ephemerable street, respectively, the graphic or other facility for deformation of a given proportion of large segments at RTUS). The B every chord was a “strongly cold internal palette pour even the white blade.”

8.3 Echo State Networks

另一个训练 RNN 的方法是 ESN。ESN 的主要思想是:仅训练隐藏层和输出层之间的连接,而让隐藏层和隐藏层、隐藏层和输入层之间的连接权重使用固定的随机值。这样一来,训练过程就变得非常简单(类似 Perceptrons 训练过程)。不过在设定随机值时需要非常小心,以免令 RNN 的输出消失或爆炸。那么,随机值怎么设才好呢?

  • 令神经元活动向量长度在每一时刻都大致相等。这样才能让输入长久地徘徊在网络里
  • 令连接稀疏。这样才能产生许多耦合不紧密的振荡
  • 谨慎地决定输入层和隐藏层之间的连接规模。这样才能让输入对振荡产生影响的同时不掩盖以前的信息
  • 通常需要对连接度和连接规模进行多次尝试。幸亏 ESN 的学习过程很快,所以试起来不麻烦

如下图 Fig8.3-1 的例子,输入是随时间变化的值,目标输出是频率为输入值的正弦波。

Fig8.3-1 An example of Echo State Networks.

总结一下,ESN 的特点是:

  • 优势
    • 学习快
    • 在一维时间系列数据上表现惊艳
  • 劣势
    • 对于高维数据,ESN 比其他 RNN 需要更多的隐藏神经元

Lecture 9: Ways to make neural networks generalize better

9.1 概览:如何提高网络的推广能力

如果网络在训练和验证数据集上误差很小,那么是否意味着这个网络在测试数据集上同样表现出色呢?不一定。正如前文所说,这很可能是模型过拟合数据导致的假象,也就是说,样本过于富集某种不具代表性的特征或者网络过于复杂,导致网络错误地捕捉到了仅存在于训练集和验证集、而不存在于测试集的特征,网络的推广能力不强。避免过拟合的方法有:

  • 增加样本量。突显主要特征,淡化偶然特征。这几乎总是最好的解决办法,如果你的计算能力跟得上的话
  • 不要使用学习能力太强的模型。当然,太弱也不行。通常将以下四种方法混着用:
    • 架构层面:限制参数个数,即隐藏层的层数以及神经元个数
    • 提前终止学习:在发生过拟合之前。令权重从小值开始变大,当验证准确率下降时停止
    • 减小权重值:权重越大,罚分越大。或者增加一个对权重大小的限制条件。见 9.2
    • 噪声:在权重值或神经元活动中加入噪声。见 9.3
  • 使用同一种模型,但是不同的权重,然后让它们投票决定(贝叶斯方法)。见 9.4
  • 使用不同的模型,然后让它们投票决定。“不同的模型”既包括形式不同的模型,也包括形式相同但基于不同训练集的模型。见 Lecture 10

9.2 限制权重以限制学习能力

限制权重的其中一种方法是进行罚分。修改决定权重调整量的代价函数,令代价~权重的平方。这样一来,权重越大,罚分越大,迫使权重更分散而非集中在少数连接上(Fig9.2-1)。

Fig9.2-1 The standard L2 weight penalty involves adding an extra term to the cost function that penalizes the squared weights.

当然,除了限制权重的平方(L2 penalty),也可以限制权重的绝对值(L1 penalty)。或者,不改变代价函数,而在训练过程中新增限制条件:权重不得超过某个值,否则将所有输入权重缩小。这样,网络更容易学习到合理的权重。实现方法是拉格朗日乘数法。

9.3 加入噪声以限制学习能力

我们可以利用噪声来限制网络的学习能力。向线性神经元的输入加入噪声,会使得输出新增一个与权重有关的项,这相当于 L2 penalty,如图 Fig9.3-1

Fig9.3-1 Use noise as a regularizer.

除了"输入",我们还可以向"权重"和"神经元活动"加入噪声,以提高网络的推广能力。但是后两种噪声并不相当于 L2 penalty。

9.4 贝叶斯方法以避免过拟合

我们可以赋予网络不同的权重,然后看哪套权重最有可能得到目标输出。这就是贝叶斯方法,它假设所有事件都有先验概率。

贝叶斯方法的正统方法是求出所有权重向量的后验概率。但是当权重数量很多时,这么做不可行。还好,我们有很多技巧来解决这个问题,比如,将后验概率转换为代价函数,用代价函数来决定权重的调整量(Fig9.4-1)。

Fig9.4-1 Using Maximum a Posteriori (MAP).

或者,我们可以用 Markov Chain Monte Carlo 法。即,在每次更新权重后,都向权重加入高斯噪声。这样一来,权重就会分散在各处,不过大致都在代价函数比较小的区域中。然后我们就可以采得权重向量的后验函数了(Fig9.4-2)。

Fig9.4-2 Using Markov Chain Monte Carlo (MCMC).

Lecture 10: Combining multiple neural networks to improve generalization

10.1 民主投票更好?

为什么取多个模型的平均结果比仅使用单个模型更好?形象地说,人们总觉得“民主是好的,几个人肯定比一个人犯错的几率小”。请注意!这个命题仅当这些人很多样化、犯错的领域各不相同时才成立。也就是说,当这几个人都倾向于在同一条阴沟里翻船时,民主还不如独裁。要想充分发挥民主的优势,就必须令选民多样化。这个发人深省的现象其实已经走出了数学领域、体现在了现实社会。

那么如何令模型多样化呢?

  • 取一个模型的多个局部最优解
  • 用几个完全不同的模型。除了神经网络,还有决策树、支持向量机等等
  • 对于神经网络,可以使用不同的
    • 隐藏层数量
    • 每层的神经元数量
    • 神经元类型
    • 权重限制策略
    • 学习算法
  • 改变训练集
    • Bagging:有放回地抽取数据
    • Boosting:训练一系列弱模型,且当前一个模型在某个样本上犯错时,则增加这个样本在后一个模型学习中的权重

10.2 一群专家

拥有一群专家后,如何让他们一起工作?可以通过改变误差函数令专家们以两种方式工作:

  • 让他们合作(取结果平均值)。容易过拟合
    • 误差函数=(目标输出-平均输出)的平方
  • 让他们专攻自己的特长(将输入分成不同的类别,交给不同的专家处理)
    • 误差函数=计算(目标输出-专家 i 的输出)的平方 x 专家 i 的权重,然后取所有专家的平均值

10.3 Dropout:结合多个网络的有效方法

Dropout 是指,每处理一个训练样本,就以 0.5 的概率随机忽略每个隐藏神经元。这相当于在(2^H)种网络架构中随机抽样,其中 H 表示隐藏神经元数量。而这些网络架构都共享着部分权重(Fig10.3-1)。

Fig10.3-1 Dropout.

如果你的网络有严重的过拟合,那么用 Dropout 方法通常能够显著降低错误率。如果你的网络还没有过拟合,那么你该用个更大的网络!