分页标题#e# 当神经网络非常大、参数非常多时,梯度下降法是推荐的算法。因为该方法仅存储梯度向量(大小是n),而不存储Hessian矩阵(大小是n2)。 2. 牛顿法(Newton's method) 牛顿法是一种二阶算法,因为它使用了Hessian矩阵。这种方法的目的是通过使用损失函数的二阶导数找到更好的训练方向。 设f(wi) = fi,?f(wi) = gi,同时Hf(wi)= Hi。使用泰勒级数得到f在w0上的二次近似值: f = f0+ g0· (w - w0) + 0.5 · (w - w0)2· H0 H0是在点w0处估计的f的Hessian矩阵。通过对f(w)的最小值设置g=0,得到下一个等式: g = g0+ H0· (w - w0) = 0 这样,从参数向量w0开始,牛顿法按照下面的公式迭代: wi+1= wi- Hi-1·gi, i=0,1,... 矢量Hi-1·gi被称为牛顿步。需要注意的是,这些参数的变化可能朝向最大值而不是最小值移动。如果Hessian矩阵不是正定的,就会发生这种情况。因此,不能保证每次迭代都减小函数值。为了避免这种麻烦,牛顿法的方程式通常修改为: wi+1= wi- (Hi-1·gi)·ηi, i=0,1,... 训练速率η可以设置为固定值或通过线性最小化找到。向量d = Hi-1·gi现在称为牛顿训练方向。 牛顿法的训练过程如下图所示,先是得到牛顿训练方向,然后得到合适的训练速率来执行参数的改进。
下图描述了这种方法的性能。可以看到,牛顿法需要的梯度下降步骤比寻找损失函数的最小值所需的步骤更少。
但是,牛顿法的缺点在于,它对Hessian矩阵及其逆矩阵的精确估计在计算层面上是相当昂贵的。 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矩阵,然后评估其逆矩阵。该近似值仅使用损失函数的一阶导数的信息来计算。 (责任编辑:本港台直播) |