在神经网络中,系统的学习过程一般由训练算法主导。今天有许多不同的学习算法,每一种都有不同的特性和性能。因此,本文试图描述五种主要学习算法的基本概念和优缺点,并为读者阐明优化在神经网络中的应用。问题形式化神经网络中的学习过程可以形式化为最小化损失函数的问题,该损失函数通常由训练误差和正则化项组成。误差项衡量神经网络对数据集的拟合程度,即拟合数据所造成的误差。正则化项主要是通过在特征权重上加入惩罚项来控制神经网络的有效复杂度,可以有效控制模型的过拟合问题。训练损失函数取决于神经网络中的自适应参数(偏差项和突触权重)。我们很容易将神经网络的权重组合成一个n维权重向量w,训练损失是这些权重作为变量的函数。下图描述了损失函数f(w)。如上图所示,w*点是训练损失函数的最小点。在任意一点A,损失函数可以分别计算权重的一阶偏导数和二阶偏导数。损失函数的一阶偏导数可以用梯度算子表示,其中每个权重的损失函数的梯度表示如下:同理,损失函数的二阶偏导数可以表示为Hessian矩阵,下面是loss函数对权重向量各元素的二阶偏导数:学习过程中广泛使用最小化多元连续可导函数的方法,很多常规方法都应用了这种优化方法直接用于神经网络的训练。单变量函数优化(One-dimensionaloptimization)虽然损失函数是由多个变量决定的(权重的数量通常很大),但是先了解单变量函数的优化方法是非常重要的。而实际上,单变量优化方法经常被应用到神经网络的训练过程中,超参数调整可以使用单变量优化方法。在实际模型中,许多训练算法首先计算训练方向d,然后确定在该训练方向上使训练损失f(η)最小的学习率η。下图是单变量函数f(η)的优化过程,可以得到最大的学习率η*。点η1和η2定义包含单变量函数f(η)***pointη*的子区间在这种情况下,单变量优化搜索给定单变量函数的函数的最小值。其中,应用广泛的搜索算法有黄金分割法(goldensection)和布伦特法。两者都减小最小值所在的子区间,直到子区间内两个端点之间的距离小于定义的容差误差。多维优化神经网络的学习过程可以形式化为使训练损失函数f最小化的参数向量w*。从数学上或实践上证明,如果神经网络的损失函数达到最小值,那么梯度也一定是0向量。通常,损失函数是参数的非线性函数,因此不可能找到封闭训练算法(closedtrainingalgorithms)来找到最优解。相反,我们考虑通过一系列迭代步骤在参数空间中搜索最优解。在每次迭代中,我们可以通过调整神经网络的参数来降低损失函数的值。通过这种方式,我们通常从一个初始参数向量(通常是随机初始化)开始训练一个神经网络。然后,算法会更新生成一组新的参数,训练损失函数也会在每次算法迭代中使用更新后的参数来减少函数值。两次迭代之间的训练损失减少量也称为训练损失衰减率(lossdecrement)。***,当训练过程满足特定条件或停止条件时,训练算法会停止迭代,此时的参数也是***参数(可能是神经网络中的局部最优解),性能神经网络的特征也由它们决定。接下来,本文将描述神经网络中最重要的学习算法。梯度下降梯度下降又称最速下降,是一种非常简单直观的训练算法。该算法从梯度向量中获取优化信息,因此是一阶算法(通过一阶偏导得到最优权值)。如果我们指定f(wi)=fi,?f(wi)=gi,那么优化方法从点w0开始迭代,并在满足终止条件之前在训练方向di=-gi上将wi移动到wi+1。因此,梯度下降法通过以下等式进行迭代。其中参数η是学习率。学习率的值可以设置为常数,也可以通过沿训练方向的单变量优化获得。通常学习率的最大值可以通过连续迭代步骤(连续步骤)上的线最小化来获得。然而,仍然有许多机器学习模型只使用固定的学习率。下面是使用梯度下降算法学习的流程图。我们可以看到参数向量的优化分两步进行:首先,计算梯度下降的训练方向。第二,找到合适的学习率。梯度下降算法也有一些缺点。首先,它的迭代方向会出现锯齿现象,不能直接向极小点优化,所以迭代次数太大,收敛速度也慢。当它的函数梯度图又窄又长时(变量未归一化,值在不同量级),迭代所需的步数会更多。最速下降确实沿着最陡的梯度下降,损失函数下降最快,但这并不意味着梯度下降或最速下降会收敛最快(因为锯齿现象)。下图中这种锯齿现象大家可以直观的理解,因为非线性函数的局部梯度方向并不一定是朝向极大点的。并且图中还可以看出,如果横轴和纵轴的大小存在差异,那么损失函数的梯度图就会呈现一个椭圆,如果从端点开始下降椭圆的半轴长,迭代次数就会很多。在训练大规模神经网络时,因为有数万个参数,梯度下降法更有效。因为梯度下降算法存储的梯度算子向量大小为n,Hessian矩阵的大小为n^2,梯度和Hessian矩阵的计算量也有很大的不同。牛顿法牛顿法是一种二阶算法,因为该算法使用海森矩阵(Hessianmatrix)求权重的二阶偏导数。牛顿法的目标是利用损失函数的二阶偏导数找到更好的训练方向。现在我们将使用以下表示:f(wi)=fi,?f(wi)=gi和Hf(wi)=Hi。使用泰勒级数展开在w0处二次逼近函数f。H0是函数f在w0点的Hessian矩阵。通过将g设置为0,我们可以找到f(w)的最小值,从而得出以下等式。因此,从参数向量w0开始,牛顿法的迭代过程如下:VectorHi-1·gi(参考上式)即所谓的牛顿步(Newton'sstep)。注意这些参数的变化会逼近最大值而不是最小值,这是因为Hessian矩阵不是正定的。因此,在不能保证矩阵为正的情况下,损失函数不能保证在每次迭代中都减小。为了防止出现上述问题,通常可以将牛顿法的方程修改为:学习率η也可以设置为固定常数或通过单变量优化取值。向量d=Hi-1·gi(参考上式)现在称为牛顿训练方向。使用牛顿法训练过程的状态图如下图所示。从该图可以看出,系统首先获取牛顿训练方向,然后获取合适的学习率来更新和优化参数。下面的梯度图展示了牛顿法的性能。因为牛顿法是利用其损失函数的二阶偏导来寻找更好的训练下降方向,与梯度下降相比,它可以用更少的迭代次数降到损失函数的最小值,因此函数收敛速度也会提高。大大加速。然而,牛顿法的难点在于它的计算复杂性,因为对Hessian矩阵及其逆矩阵的精确求值在计算上是巨大的。共轭梯度法(Conjugategradient)共轭梯度法可以认为是梯度下降法和牛顿法之间的一种中间方法。该算法希望加快梯度下降的收敛速度,同时避免使用Hessian矩阵进行评估、存储和求逆以获得必要的优化信息。在共轭梯度训练算法中,由于搜索是沿着共轭方向(conjugatedirections)进行的,所以算法通常比沿着梯度下降方向优化收敛得更快。共轭梯度法的训练方向与Hessian矩阵共轭。我们用d表示训练方向向量,然后从初始参数向量w0开始,初始训练方向向量d0=-g0,用共轭梯度法构造的训练方向序列为:上式中,称γ共轭参数,并且有一些方法可以计算这个参数。最常用的两种方法来自弗莱彻、里维斯和波拉克、里比埃。对于所有共轭梯度算法,训练方向周期性地重置为负梯度方向。通过以下表达式更新和优化参数。通常可以使用单变量函数优化方法获得学习率η。共轭梯度法训练过程的流程图如下所示。从图中我们可以看出,模型首先通过计算共轭梯度训练方向来优化参数,然后找到一个合适的学习率。共轭梯度已被证明比神经网络中的梯度下降更有效。并且由于共轭梯度法不需要使用Hessian矩阵,所以在大规模神经网络中依然可以取得不错的性能。拟牛顿法(Quasi-Newtonmethod)需要大量的运算来求解Hessian矩阵的值和计算矩阵的逆。应用牛顿法产生的计算量是非常巨大的。因此,出现了一种拟牛顿法(quasi-Newton)或变矩阵法来解决此类缺点。这些方法不是直接计算Hessian矩阵然后求矩阵的逆。拟牛顿法在每次迭代时计算一个矩阵,该矩阵近似于Hessian矩阵的逆矩阵。最重要的是,此近似值仅使用损失函数的一阶偏导数计算。Hessian矩阵由损失函数的二阶偏导数组成。拟牛顿法背后的思想是仅使用损失函数的一阶偏导数来逼近另一个矩阵G对Hessian矩阵的逆。拟牛顿法的公式可以表示为:学习率η可以设为固定常数,也可以通过优化单变量函数得到。其中矩阵G近似于Hessian矩阵的逆矩阵,并且有不同的方法来进行近似。一般来说,最常用的两个公式是Davidon-Fletcher-Powell公式(DFP)和Broyden-Fletcher-Goldfarb-Shanno公式(BFGS)。拟牛顿法训练过程的流程图如下所示。从图中我们可以看出,模型通过第一次计算拟牛顿训练方向来优化参数,然后找到一个合适的学习率。拟牛顿法适用于大多数情况:它比梯度下降法和共轭梯度法收敛得更快,并且不需要精确计算Hessian矩阵及其逆矩阵。Levenberg-Marquardt算法Levenberg-Marquardt算法又称为阻尼最小二乘法(dampedleast-squaresmethod),该算法的损失函数采用误差平方和的形式。该算法的实现不需要计算具体的Hessian矩阵,它只是使用了梯度向量和Jacobian矩阵(Jacobianmatrix)。该算法的损失函数采用误差平方和的形式,如下式所示:上式中,m为数据集中的样本数。我们可以定义以误差对参数的偏导数为元素的损失函数的雅可比矩阵,如下式所示:其中m为数据集中的样本数,n为参数的个数神经网络。那么雅可比矩阵就是一个m×n阶的矩阵。损失函数的梯度向量可以计算如下:e是这里所有误差项的向量。最后,我们可以用下面的表达式来逼近Hessian矩阵:其中λ是衰减因子,保证了Hessian矩阵的正性,I是单位矩阵。下面的表达式定义了Levenberg-Marquardt算法中参数的更新和优化过程:当衰减参数λ为0时,Levenberg-Marquardt算法是使用Hessian矩阵近似的牛顿法。当λ较大时,该算法类似于梯度下降法,但学习率较小。如果执行迭代导致损失函数增加,则衰减因子λ增加。如果损失函数减小,则λ减小,使得Levenberg-Marquardt算法更接近牛顿法。此过程通常用于加速收敛到最小点。使用Levenberg-Marquardt方法的神经网络训练过程的状态图如下图所示。第一步是计算损失函数、梯度和海森矩阵近似,然后在每次迭代中调整衰减参数以减少损失。正如我们所见,Levenberg-Marquardt算法是为误差平方和函数量身定制的。这允许使用此错误度量的神经网络非常快速地进行训练。然而,Levenberg-Marquardt算法有一些缺点。***是不能用于平方根误差或交叉熵误差(crossentropyerror)等函数,算法也不兼容正则项。***,对于大型数据集或神经网络,雅可比矩阵可能变得非常大,因此需要大量内存。因此,我们不建议将Levenberg-Marquardt算法用于大型数据集或神经网络。内存和收敛速度的比较下图显示了上面讨论的所有算法,以及它们的收敛速度和内存要求。收敛最慢的是梯度下降算法,但它也需要最少的内存。相比之下,Levenberg-Marquardt算法可能是收敛速度最快的,但它也需要最多的内存。一种更妥协的方法是拟牛顿法。总而言之,如果我们的神经网络有几万个参数,为了节省内存,我们可以使用梯度下降或者共轭梯度法。如果我们需要训练多个神经网络,而每个神经网络只有几百个参数和几千个样本,那么可以考虑Levenberg-Marquardt算法。其余情况,拟牛顿法可以很好地处理。原文:https://www.neuraldesigner.com/blog/5_algorithms_to_train_a_neural_network【本文为机器心专栏原创翻译,微信公众号“机器心(id:almosthuman2014)”】点此阅读更多关于作者好文
