最新训练神经网络的五大算法

作者: Alberto Quesada

译者: KK4SBB

神经网络模型的每一类学习过程通常被归纳为一种训练算法。训练的算法有很多,它们的特点和性能各不相同。

问题的抽象

  人们把神经网络的学习过程转化为求损失函数f的最小值问题。一般来说,损失函数包括误差项和正则项两部分。误差项衡量神经网络模型在训练数据集上的拟合程度,而正则项则是控制模型的复杂程度,防止出现过拟合现象。

  损失函数的函数值由模型的参数(权重值和偏置值)所决定。我们可以把两部分参数合并为一个n维的权重向量,记为w。下图是损失函数f(w)的图示。

  如上图所示,w*是损失函数的最小值。在空间内任意选择一个点A,我们都能计算得到损失函数的一阶、二阶导数。一阶导数可以表示为一个向量:

  ᐁif(w) = df/dwi (i = 1,…,n)

  同样的,损失函数的二阶导数可以表示为海森矩阵( Hessian Matrix ):

  Hi,jf(w) = d2f/dwi·dwj (i,j = 1,…,n)

  多变量的连续可微分函数的求解问题一直被人们广泛地研究。许多的传统方法都能被直接用于神经网络模型的求解。

  一维优化方法

  尽管损失函数的值需要由多个参数决定,但是一维优化方法在这里也非常重要。这些方法常常用于训练神经网络模型。

  许多训练算法首先计算得到一个训练的方向d,以及速率η来表示损失值在此方向上的变化,f(η)。下图片展示了这种一维函数。

f和η*在η1和η2所在的区间之内。

  由此可见,一维优化方法就是寻找到某个给定的一维函数的最小值。黄金分段法和Brent方法就是其中两种广泛应用的算法。这两种算法不断地缩减最小值的范围,直到η1和η2两点之间的距离小于设定的阈值。

  多维优化方法

  我们把神经网络的学习问题抽象为寻找参数向量w*的问题,使得损失函数f在此点取到最小值。假设我们找到了损失函数的最小值点,那么就认为神经网络函数在此处的梯度等于零。

  通常情况下,损失函数属于非线性函数,我们很难用训练算法准确地求得最优解。因此,我们尝试在参数空间内逐步搜索,来寻找最优解。每搜索一步,重新计算神经网络模型的参数,损失值则相应地减小。

  我们先随机初始化一组模型参数。接着,每次迭代更新这组参数,损失函数值也随之减小。当某个特定条件或是终止条件得到满足时,整个训练过程即结束。

  现在我们就来介绍几种神经网络的最重要训练算法。

1. 梯度下降法(Gradient descent)

  梯度下降方法是最简单的训练算法。它仅需要用到梯度向量的信息,因此属于一阶算法。

  我们定义f(wi) = fi and ᐁf(wi) = gi。算法起始于W0点,然后在第i步沿着di = -gi方向从wi移到wi+1,反复迭代直到满足终止条件。梯度下降算法的迭代公式为:

  wi+1 = wi - di·ηi, i=0,1,…

  参数η是学习率。这个参数既可以设置为固定值,也可以用一维优化方法沿着训练的方向逐步更新计算。人们一般倾向于逐步更新计算学习率,但很多软件和工具仍旧使用固定的学习率。

  下图是梯度下降训练方法的流程图。如图所示,参数的更新分为两步:第一步计算梯度下降的方向,第二步计算合适的学习率。

 梯度下降方法有一个严重的弊端,若函数的梯度变化如图所示呈现出细长的结构时,该方法需要进行很多次迭代运算。而且,尽管梯度下降的方向就是损失函数值减小最快的方向,但是这并不一定是收敛最快的路径。下图描述了此问题。

当神经网络模型非常庞大、包含上千个参数时,梯度下降方法是我们推荐的算法。因为此方法仅需要存储梯度向量(n空间),而不需要存储海森矩阵(n2空间)

2.牛顿算法(Newton’s method)

  因为牛顿算法用到了海森矩阵,所以它属于二阶算法。此算法的目标是使用损失函数的二阶偏导数寻找更好的学习方向。

  我们定义f(wi) = fi, ᐁf(wi) = gi and Hf(wi) = Hi。用泰勒展开式估计函数f在w0值

  f = f0 + g0 · (w - w0) + 0.5 · (w - w0)2 · H0

  H0是函数f在w0的海森矩阵值。在f(w)的最小值处g = 0,我们得到了第二个等式

  g = g0 + H0 · (w - w0) = 0

  因此,将参数初始化在w0,牛顿算法的迭代公式为

  wi+1 = wi - Hi-1·gi, i = 0,1,…

  Hi-1·gi 被称为牛顿项。值得注意的是,如果海森矩阵是一个非正定矩阵,那么参数有可能朝着最大值的方向移动,而不是最小值的方向。因此损失函数值并不能保证在每次迭代都减小。为了避免这种问题,我们通常会对牛顿算法的等式稍作修改:

  wi+1 = wi - (Hi-1·gi) ·ηi, i=0,1,…

  学习率η既可以设为固定值,也可以动态调整。向量d = Hi-1·gi被称为牛顿训练方向。

  下图展示的是牛顿法的流程图。参数的更新也分为两步,计算牛顿训练方向和合适的学习率。

3.共轭梯度法(Conjugate gradient)

共轭梯度法可以被认为是介于梯度下降和牛顿法之间的方法。它能加快梯度下降法典型的慢收敛,同时避免了牛顿法对Hessian矩阵的评估、存储和反转所需的信息。

在共轭梯度训练算法中,搜索沿着共轭方向执行,通常能比梯度下降方向产生更快的收敛。这些训练方向与Hessian矩阵相关。

用d表示训练方向向量。然后,从初始参数向量w0和初始训练方向向量d0 = -g0开始,共轭梯度法构造训练方向的序列可表示为:

di+1 = gi+1 + di·γi, i=0,1,...

这里γ称为共轭参数,有不同的计算方法。其中两种最常用的方法是Fletcher–Reeves和Polak–Ribière。对于所有共轭梯度算法,训练方向周期性地重置为梯度的负值。

然后,参数根据以下等式改进,训练速率η通常通过线性最小化得到:

wi+1 = wi + di·ηi, i=0,1,...

下图描述了使用共轭梯度法的训练过程。如图所示,参数的改进步骤是先计算共轭梯度训练方向,然后计算该方向上的合适训练速率。

这种方法已经证明比梯度下降法在训练神经网络方面更有效。因为它不需要Hessian矩阵,所以当神经网络非常大时,也建议使用共轭梯度法。

4.拟牛顿法(Quasi-Newton method)

牛顿法在计算上是相当昂贵的,因为它需要许多操作来评估Hessian矩阵并计算其逆矩阵。为了解决这个缺点,出现了被称为拟牛顿法或可变矩阵法的替代方法。这种方法在算法的每次迭代中建立并逼近Hessian逆矩阵,而不是直接计算Hessian矩阵,然后评估其逆矩阵。该近似值仅使用损失函数的一阶导数的信息来计算。

Hessian矩阵由损失函数的二阶偏导数组成。拟牛顿法背后的主要思想是仅使用损失函数的一阶偏导数,通过另一矩阵G得到近似Hessian矩阵的逆。拟牛顿法的公式可表示为:

wi+1 = wi - (Gi·gi)·ηi, i=0,1,...

训练速率η可以设置为固定值或通过线性最小化得到。最常用的两个公式是Davidon-Fletcher-Powell公式(DFP)和Broyden-Fletcher-Goldfarb-Shanno公式(BFGS)。

拟牛顿法的训练过程如下图所示。先得到拟牛顿训练方向,然后找到满意的训练速率来执行参数的改进。

这是在大多数情况下使用的默认方法:它比梯度下降法和共轭梯度法更快,并且不需要精确计算和反转Hessian矩阵。

5. Levenberg-Marquardt algorithm(莱文贝格-马夸特算法)

Levenberg-Marquardt算法,又称阻尼最小二乘法,被设计为采用误差平方和形式的损失函数特定的算法。它不需精确计算Hessian矩阵,适用于梯度向量和Jacobian矩阵。

下图是使用Levenberg-Marquardt算法的神经网络训练过程。第一步是计算损失值、梯度和Hessian逼近,然后调整阻尼参数,以减少每次迭代的损失。

Levenberg-Marquardt算法是针对误差平方和型函数的特定方法。这使它在训练神经网络中测量这种误差时非常快。但是,该算法也有一些缺点。缺点之一是它不能应用于诸如均方根误差或交叉熵误差函数。此外,它与正则项不兼容。最后,对于非常大的数据集和神经网络,Jacobian矩阵会变得非常大,因此需要的内存也非常大。因此,当数据集和/或神经网络非常大时,不推荐使用Levenberg-Marquardt算法。

内存和速度比较

下图比较了本文中讨论的训练算法的计算速度和存储要求。可以看到,最慢的训练算法是梯度下降法,但它需要的内存最小。相反,最快的是Levenberg-Marquardt算法,但需要的内存也最大。比较好的折衷可能是拟牛顿法。

总而言之,如果我们的神经网络有成千上万的参数,我们可以使用梯度下降法或共轭梯度法,以节省内存。如果我们要训练的神经网络只有几千个样本和几百个参数,最好的选择可能是Levenberg-Marquardt算法。其余情况下,可以选择拟牛顿法。

原文发布于微信公众号 - 奇点(qddata)

原文发表时间:2017-12-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小石不识月

机器学习中分类与回归的差异

在分类(Classification)问题与回归(Regression)问题之间,有着一个重要的区别。

2139
来自专栏计算机视觉战队

每日一学——神经网络(下)

神经网络结构 灵活地组织层 将神经网络算法以神经元的形式图形化。神经网络被建模成神经元的集合,神经元之间以无环图的形式进行连接。也就是说,一些神经元的输出是另一...

3457
来自专栏数据科学与人工智能

【知识】新手必看的十种机器学习算法

机器学习领域有一条“没有免费的午餐”定理。简单解释下的话,它是说没有任何一种算法能够适用于所有问题,特别是在监督学习中。 例如,你不能说神经网络就一定比决策树好...

2146
来自专栏目标检测和深度学习

深度 | 像玩乐高一样拆解Faster R-CNN:详解目标检测的实现过程

作者:Matt Simon 机器之心编译 本文详细解释了 Faster R-CNN 的网络架构和工作流,一步步带领读者理解目标检测的工作原理,作者本人也提供了...

3868
来自专栏机器之心

从语义上理解卷积核行为,UCLA朱松纯等人使用决策树量化解释CNN

44610
来自专栏SIGAI学习与实践平台

用一句话总结常用的机器学习算法

浓缩就是精华。想要把书写厚很容易,想要写薄却非常难。现在已经有这么多经典的机器学习算法,如果能抓住它们的核心本质,无论是对于理解还是对于记忆都有很大的帮助,还能...

2089
来自专栏SIGAI学习与实践平台

机器学习与深度学习核心知识点总结--写在校园招聘即将开始时

一年一度的校园招聘就要开始了,为了帮助同学们更好的准备面试,SIGAI 在今天的公众号文章中对机器学习、深度学习的核心知识点进行了总结。希望我们的文章能够帮助你...

1041
来自专栏SIGAI学习与实践平台

深度卷积神经网络演化历史及结构改进脉络-40页长文全面解读

从1989年LeCun提出第一个真正意义上的卷积神经网络到今天为止,它已经走过了29个年头。自2012年AlexNet网络出现之后,最近6年以来,卷积神经网络得...

1481
来自专栏机器之心

AAAI 2018 | 南京大学提出SSWL:从半监督弱标注数据中学习多标签学习问题

3909
来自专栏新智元

【风格化+GAN】感知对抗网络 PAN,一个框架搞定多种图像转换

【新智元导读】pix2pix 又有更新:悉尼大学的 Chaoyue Wang 等人受生成对抗网络(GAN)启发,在已有的感知损失基础上,提出了感知对抗网络(Pe...

3857

扫码关注云+社区

领取腾讯云代金券