向李宏毅学深度学习(进阶)#task01#Datawhale X 李宏毅苹果书 AI夏令营

在深度学习中,优化算法如梯度下降是训练模型的核心工具,它们通过不断调整权重,使得损失函数逐步减小。然而,尽管这些算法在理论上能帮助模型找到全局最优解,实际应用中却常常受到各种因素的限制。在复杂的高维空间中,损失函数的形态往往非常复杂,充满了局部最小值和鞍点,这些极值点可能会导致优化过程停滞,阻碍模型的进一步改进。局部最小值让模型误以为已经达到了最优解,而鞍点则会使优化陷入停滞。本文将深入探讨这些问题的性质,以及两个DL中的关键概念:批量和动量。

目录

深度学习中的优化挑战:理解全局最小值、局部极值与鞍点

全局最小值(Global Minimum)、局部最小值(Local Minimum)、局部最大值(local maximum)

深度学习曾面临的危机

鞍点(saddle point)、临界点(critical point)

区别梯度消失与梯度下降遇到局部最小值或鞍点

二者的区别

梯度消失产生的原因

梯度消失的解决方法

如何判断临界点类型

Hessian矩阵的特征值分析

简化后的具体判断步骤

理论上可以通过Hessian矩阵的特征值分析临界点的性质,那么如何在实践中应用呢?

在实际训练深度学习模型时,是否需要精确判断当前点是局部最小值还是鞍点?

我们能否改进Hessian矩阵,以保证计算复杂性与优化效果的平衡?

举例详解整个流程

通过Hession矩阵特征值逃离鞍点适用于什么场景?

能否将通过Hession矩阵调优的方法与其他优化算法协同使用?

关于计算 Hession矩阵的数值稳定性问题

Hessian-Free Optimization法

优化过程中鞍点更为常见的原因及常见逃离鞍点的方法

为什么模型优化中鞍点相较局部最小值更为常见?

最小值比率的概念

常见逃离鞍点的方法

 关于DL中的批量(banch)

为什么随机打乱能够减小模型在训练过程中陷入局部最优解或鞍点的概率?

不同批量梯度下降法的概念区分

不同批量梯度下降花费的时间对比

不同banch_size下一次更新所需时间对比

不同banch_size下一个epoch所需时间对比

批量大小对模型准确率的影响

梯度噪声与训练效果

批量大小与模型泛化能力的关系

MBGD更有利于模型训练的可能原因

总结

动量法

梯度下降法的局限性

动量法的引入

动量的计算与更新 

动量法的优势与调参建议

动量法的局限性与挑战

总结


深度学习中的优化挑战:理解全局最小值、局部极值与鞍点

全局最小值(Global Minimum)、局部最小值(Local Minimum)、局部最大值(local maximum)

  • 全局最小值是指在整个函数的定义域内,目标函数取得的最小值。换句话说,若在所有可能的输入值中,某个输入使得目标函数的输出达到最低,则这个值就是全局最小值。全局最小值是所有局部最小值中最低的一个,它代表了问题的最优解。
  • 局部最小值,它是指在某个局部范围内,目标函数取得的最小值。局部最小值不一定是全局最小值,但在其邻域内,没有比它更小的值。局部最小值通常是优化过程中算法可能会收敛到的位置,尤其是在高维和复杂的函数中,局部最小值可能存在多个。
  • 局部最大值则是目标函数在某一局部范围内达到的最大值,类似于局部最小值,但它代表的是该区域内的最高点。
全局最小值、局部最小值在三维曲面中的形态

深度学习曾面临的危机

在深度学习的早期发展中,研究者们面临一个严重的困境:人们普遍认为,基于梯度下降的优化算法会使模型陷入局部最小值,导致性能不佳。这个问题源于传统的优化理论,即在高度非凸的损失函数中,局部最小值可能会大量存在,并且它们与全局最小值相差甚远。研究者担心,深度神经网络的训练过程会频繁地陷入这些局部最小值,从而无法实现模型的最佳性能。

研究者认为梯度下降因陷入局部最小值而无法继续i下降

然而,随着对深度学习的进一步研究,人们逐渐发现,这一担忧实际上被高估了。首先,实验表明,深度神经网络在实际应用中很少陷入局部最小值,模型通常可以取得令人满意的性能。进一步的理论分析揭示,深度网络中的大多数“陷阱”并非是局部最小值,而是鞍点。

鞍点(saddle point)、临界点(critical point)

在高维空间中,那些超平面并不是像人们想象的一样形成一个个“盆地”,梯度下降梯度为0时意味着神经网络收敛在了这一个个“盆地”之中,后来的研究发现,多数情况下模型收敛的超平面实际上类似于一个个“鞍形曲面”,模型收敛在这些“鞍形曲面”的“鞍点”(saddle point)之上,鞍点的梯度为0,但鞍点并非局部最小点,这意味着模型还有梯度下降的空间。我们把梯度为0的点统称为临界点(critical point)

鞍形曲面与鞍点

如上图,鞍行曲面上的鞍点处梯度为0,但在红色箭头指示的方向上还可以进行梯度下降。

区别梯度消失与梯度下降遇到局部最小值或鞍点

在神经网络模型训练过程中,经常会遇到梯度下降非常缓慢甚至接近于0的情况,前文阐述了这种现象产生的可能原因之一:梯度下降收敛在了局部最小值或鞍点。实际上还有可能是模型训练中产生了梯度消失,梯度消失问题是现在模型训练中最重要的问题之一。

二者的区别

梯度消失问题发生在梯度非常小但不一定为零的情况下,这意味着网络参数的更新非常缓慢,导致网络难以学习。这与局部最小值或鞍点不同,因为在那些点上,梯度是零,而不是非常小。

梯度消失产生的原因

  • 激活函数的选择:传统的激活函数,如sigmoid或tanh,在它们的饱和区域(即输出值接近1或-1)的梯度非常小。当这些激活函数在深层网络的多个层中使用时,梯度在反向传播过程中会逐渐减小,导致梯度消失。
sigmoid函数在输出值接近1或-1的梯度非常小

  • 连乘效应:在深度神经网络中,反向传播算法通过链式法则计算梯度,这意味着梯度是多个层梯度相乘的结果。如果这些梯度中的任何一个很小,那么随着层数的增加,乘积会变得越来越小,最终可能导致梯度接近于零。
  • 权重初始化:果网络权重初始化得过大或过小,尤其是在使用 Sigmoid 或 Tanh 激活函数时,会导致网络的激活值在初始阶段就处于激活函数的饱和区间。这进一步加剧了梯度消失问题,因为在这些区域激活函数的导数已经接近于零。
  • 层数过多:在深度神经网络中,随着层数的增加,梯度需要经过更多的层传递。在每一层中,梯度可能会因激活函数的导数接近于零而被缩小,最终导致梯度在靠近输入层时消失。这种现象在深度网络(比如几十层甚至更深的网络)中特别明显。

除了以上原因,梯度消失的可能原因还包括高维空间的复杂性等,需要具体分析。

梯度消失的解决方法

为解决梯度消失问题,常用的方法包括使用ReLU或其变种激活函数替代传统的Sigmoid和Tanh,采用Xavier或He初始化策略来合理设置权重初始值,应用批量归一化来稳定输入分布,使用残差网络中的跳跃连接来保证梯度传递,进行梯度剪切以防止梯度过小或过大,以及使用自适应学习率优化器如Adam或RMSprop来调整训练过程中参数的更新步长。这些方法共同作用,帮助维持梯度的有效传递,提高深度神经网络的训练效率。

如何判断临界点类型

当模型收敛到临界点时,如果临界点是局部最小值,那么往四周走损失值都会更高。而鞍点就没有这个问题了,旁边还是有路降低损失,只要能逃离鞍点。我们首先要做的就是判断临界点的类型是局部最小值还是鞍点。

假设我们有一个多维的损失函数L(\theta),其关于参数 \theta在点 \theta^*处的泰勒展开可以表示为

L(\theta) \approx L(\theta^*) + (\theta - \theta^*)^T \nabla L(\theta^*) + \frac{1}{2} (\theta - \theta^*)^T H(\theta^*) (\theta - \theta^*)

其中:

  • \nabla L(\theta^*)是在\theta^*处的梯度向量。
  • H(\theta^*)是在 \theta^*处的Hessian矩阵,其元素是关于参数的二阶偏导数。

因为 \theta^* 是临界点,所以在该点处梯度为零,即\nabla L(\theta^*) = 0。因此,泰勒展开可以简化为

L(\theta) \approx L(\theta^*) + \frac{1}{2} (\theta - \theta^*)^T H(\theta^*) (\theta - \theta^*)

这个式子描述了在临界点附近,损失函数L(\theta) 的二阶近似。

接着,我们可以通过\frac{1}{2} (\theta - \theta^*)^T H(\theta^*) (\theta - \theta^*)来判断\theta^*附近的误差表面,将(\theta - \theta^*)^T H(\theta^*)(\theta - \theta^*)简记为v^T H v通过讨论v^T H v的范围判断临界点类型。

Hessian矩阵的特征值分析

  • 如果 v^T H(\theta^*) v > 0对所有 v成立:这意味着Hessian矩阵是正定的,此时 L(θ)L(\theta)L(θ) 在 θ∗\theta^*θ∗ 附近是凸的,即 θ∗\theta^*θ∗ 是局部最小值。

  • 如果v^T H(\theta^*) v < 0对所有 v 成立:这意味着Hessian矩阵是负定的,此时 L(θ)L(\theta)L(θ) 在 θ∗\theta^*θ∗ 附近是凹的,即 θ∗\theta^*θ∗ 是局部最大值。

  • 如果v^T H v对某些 v为正,对另一些 v为负:这意味着Hessian矩阵既有正特征值也有负特征值,此时 θ∗\theta^*θ∗ 是一个鞍点。鞍点的特性是,在某些方向上,损失函数表现为局部最小值,而在另一些方向上则表现为局部最大值。

由于我们我们不可能把所有的 v 都拿来试试看,所以有一个更简便的方法 来判断 v^THv的正负。算出一个海森矩阵后,不需要把它跟所有的 v 都乘乘看,只要看 H 的特征值。

简化后的具体判断步骤

  1. 计算Hessian矩阵H(\theta^*):首先,在临界点\theta^*处计算Hessian矩阵,它是损失函数的二阶偏导数矩阵。

  2. 分析Hessian矩阵的特征值:求解Hessian矩阵的特征值。如果所有特征值都是正的,则Hessian矩阵是正定的,\theta^*是局部最小值。如果所有特征值都是负的,则Hessian矩阵是负定的,\theta^*是局部最大值。如果既有正特征值又有负特征值,则 \theta^*是鞍点。

  3. 检查二次型 v^T H v:可以进一步通过检查向量 v 的二次型 v^T H v 来确认。如果对于所有 v,二次型为正,则为局部最小值;如果对于所有 v,二次型为负,则为局部最大值;如果在某些方向上为正,而在其他方向上为负,则为鞍点。

理论上可以通过Hessian矩阵的特征值分析临界点的性质,那么如何在实践中应用呢?

实际应用中,计算Hessian矩阵及其特征值往往是计算量巨大的,尤其是在高维度的深度神经网络中。在大型模型中,直接计算Hessian矩阵可能是不现实的,基于梯度信息的优化方法,如梯度下降和随机梯度下降,虽然不能明确识别鞍点或局部极小值,但通过适当的调整(如学习率衰减、动量法、Adam优化器等),可以帮助模型更好地跳出鞍点,并向更优的方向收敛。这里的关键在于,我们是否能够通过优化算法的设计,在不显式计算Hessian的情况下,间接规避鞍点的影响。

在实际训练深度学习模型时,是否需要精确判断当前点是局部最小值还是鞍点?

答案通常是否定的,因为我们更关心的是模型的最终性能,而不是具体的优化路径。在实践中,调整超参数、增加数据量以及优化网络结构,往往比精确分析某一特定点的性质更为有效。对于大多数应用场景,只需确保优化算法能够稳定收敛,并且最终的模型具备良好的泛化能力即可。这说明,虽然理解理论很重要,但在应用中,更应注重算法的鲁棒性和模型的实用性。

我们能否改进Hessian矩阵,以保证计算复杂性与优化效果的平衡?

虽然Hessian矩阵在理论上提供了重要的判别工具,但实际计算Hessian矩阵并不总是可行的。基于Hessian的高级优化方法(如牛顿法)在一些小规模问题上表现出色,但对于深度学习中的大规模问题,我们需要权衡计算复杂性和优化效果。这里我们可以引入近似的思想,例如利用随机化方法近似计算Hessian的主特征值,或者使用更轻量的二阶优化算法。在实际应用中,寻找平衡点非常关键:我们希望能在保持计算效率的前提下,尽量利用二阶信息来提升模型性能。因此,一些混合的优化策略可能是未来深度学习优化的一个发展方向。

举例y = w_1 w_2 x详解整个流程

举一个只有两个神经元且没有激活函数的例子,y = w_1 w_2 x,对应的神经网络如下:

用平方误差(square error)来构建损失函数L = (1 - w_1 w_2)^2

二维参数空间中,损失函数局部最小值与鞍点的位置

上图是该神经网络的误差表面,表示 在复杂表面上,梯度下降可能会陷入局部最小值或鞍点,导致优化停滞。

计算L = (1 - w_1 w_2)^2的二次微分:

\begin{aligned} H_{1,1} &= \frac{\partial^2 L}{\partial w_1^2} = 2(-w_2)(-w_2); \\ H_{1,2} &= \frac{\partial^2 L}{\partial w_1 \partial w_2} = -2 + 4w_1w_2; \\ H_{2,1} &= \frac{\partial^2 L}{\partial w_2 \partial w_1} = -2 + 4w_1w_2; \\ H_{2,2} &= \frac{\partial^2 L}{\partial w_2^2} = 2(-w_1)(-w_1). \end{aligned}

以原点为例,将w_1=0,w_2=0代入,得到Hession矩阵:

H = \begin{bmatrix} 0 & -2 \\ -2 & 0 \end{bmatrix}.

接着计算H的特征值---2,-2,特征值有正有负,因此原点是鞍点。

通过Hession矩阵逃离鞍点的方法

我们可以根据特征向量的方向来更新参数,从而逃离鞍点。假设我们在鞍点\theta^*处,选择特征值为负的特征向量,通过特征向量u来更新参数,即:

\theta=\theta^*+u

进而使损失值想特征向量方向更新,从而有效逃离鞍点。

通过Hession矩阵特征值逃离鞍点适用于什么场景?

在小规模或中等规模模型中,计算 Hessian 矩阵的开销相对较小。在这种情况下,精确的Hessian信息可以带来明显的优化效果,尤其是在需要快速跳出鞍点并收敛到全局最优解的场景中。而在大型神经网络中,这种方法由于计算复杂度太高而显得不切实际。

能否将通过Hession矩阵调优的方法与其他优化算法协同使用?

可以讨论如何将一阶和二阶优化算法结合使用,例如在训练的初期使用一阶优化算法进行大步长更新,以快速找到好的解空间,然后在训练后期切换到二阶优化算法,利用Hessian矩阵的二阶信息进行精细调优。

关于计算 Hession矩阵的数值稳定性问题

理论上 Hessian 矩阵和它的特征值分解提供了强大的工具,但在实际操作中,由于数值稳定性问题,直接计算 Hessian 矩阵可能会引入不稳定性,尤其是在高维度空间中。因此,可以介绍如何通过正则化方法(例如添加小的正值到 Hessian 矩阵的对角线)来提高数值稳定性。

近似计算:为了避免直接计算 Hessian 矩阵带来的高计算成本,介绍几种近似计算 Hessian 矩阵的方法,如有限差分法、BFGS算法等。这些方法可以在不显式计算 Hessian 矩阵的情况下,提供有用的二阶信息来帮助逃离鞍点。

Hessian-Free Optimization法

无Hessian优化方法:可以介绍一种在深度学习中常用的技术——Hessian-Free Optimization。这种方法在不显式计算 Hessian 矩阵的情况下,使用共轭梯度法来近似解决涉及二阶信息的优化问题。这种方法特别适用于大规模深度学习模型,并能有效跳过鞍点。

优化过程中鞍点更为常见的原因及常见逃离鞍点的方法

为什么模型优化中鞍点相较局部最小值更为常见?

随着神经网络的维度(参数的数量)增加,参数空间中的极值点(包括鞍点、局部最小值、局部最大值)的数量也随之增加。然而,由于在高维空间中,随机的梯度下降往往不会刚好落在所有维度都为负的局部最小值上,因此模型更有可能接近或进入鞍点区域。换句话说,鞍点区域比局部最小值的区域大得多,网络的训练轨迹更容易被鞍点吸引。

下面引出最小值比率的概念,从而更好地理解这一现象。

最小值比率的概念

为了更好地理解训练过程中的鞍点问题,研究者引入了“最小值比率”的概念。最小值比率定义为:

最小值比例 = 正特征值数量 /总特征值数量

这一指标用于衡量当前点是否可能是一个鞍点。通常情况下,我们期望在训练过程中,最小值比率能较高,从而表明当前点更接近一个全局最优解而非鞍点。然而,实际情况往往不如人意。如下图,我们可以看到训练不同神经网络的结果图,显示出局部最小值的分布情况。 

局部最小值分布情况

 实际上,我们几乎找不到所有特征值都为正的临界点。上图中最小值比例最大也不过处于 0.5 ~ 0.6 的范围,代表只有约一半的特征值为正,另一半的特征值为负,这些点都不是真正的局部最小值点。所以从经验上看起来,局部极小值并没有那么常见。多数的时候,我们训练到一个梯度很小的地方,参数不再更新,往往只是遇到了鞍点。

常见逃离鞍点的方法

面对鞍点问题,常见的策略包括:

  • 增加随机性:通过引入噪声或随机初始化权重的方式,避免网络训练过程中陷入鞍点。
  • 采用高级优化算法:例如使用动量法、Adam优化器等,这些算法通过调整学习率和梯度方向,有助于网络在鞍点附近跳出陷阱。
  • 利用正则化技术:正则化可以在一定程度上平滑损失表面,使得训练过程更容易避开鞍点。
  • 网络架构调整(如使用残差网络ResNet):通过设计更好的网络结构,减少鞍点的出现。
  • Batch Normalization:通过标准化层的输入,平滑损失表面,减少陷入鞍点的可能性。

鞍点在深度学习优化过程中更为常见,且往往会导致训练停滞。通过使用动量法、自适应学习率算法、添加噪声、网络架构调整等方法,我们可以有效地跳出鞍点,继续向全局最优解迈进。然而,鞍点问题的复杂性仍然要求我们在实践中不断调整和优化策略,以应对具体问题。

虽然已有多种方法可以帮助网络逃离鞍点,但仍有许多未解决的挑战。例如,如何更精准地识别鞍点并自动调整优化策略?未来的研究可能会集中于开发更智能的优化算法,以及设计更加鲁棒的网络架构,以进一步提升深度学习模型的性能。

 关于DL中的批量(banch)

在计算模型损失时可以采取不同的数据处理方法。具体来说,并不是直接对所有数据一起计算损失,而是将数据分成一个个的小批量(batch),每个批量包含一定数量的数据。每次更新模型参数时,只使用一个批量的数据来计算损失和梯度,这个过程被称为一个“迭代”(epoch)。此外,为了减小模型在训练过程中陷入局部最优解或鞍点的概率,通常会在每个迭代开始前随机打乱(shuffle)数据,使得每次使用的批量数据都是不同的,从而增强模型的泛化能力。

使用批量优化示意图

为什么随机打乱能够减小模型在训练过程中陷入局部最优解或鞍点的概率?

  1. 增加训练过程的随机性:通过打乱数据,每次模型看到的数据顺序都是不同的,这使得梯度下降的路径变得更加随机化。由于局部最优解和鞍点往往是训练过程中出现的“陷阱”,这些随机性可以帮助模型避免在这些点附近反复徘徊,从而增加跳出这些“陷阱”的机会。
  2. 防止模型对数据顺序的依赖:如果数据没有打乱,模型可能会学习到数据顺序中的某些模式,这会导致模型在梯度下降过程中过早地收敛到一个局部最优解或陷入鞍点。打乱数据可以打破这种顺序,使得模型只能依赖于数据本身的特征,而不是其排列顺序,从而更好地学习到数据的本质特征。
  3. 避免梯度更新的偏差:在梯度下降的过程中,模型参数的更新依赖于当前批次的数据。如果数据没有打乱,某些相似的数据可能会集中在一起,这会导致梯度更新的方向在某些特定方向上偏移。通过打乱数据,每个批次的数据将更加多样化,这样可以得到更平衡的梯度更新,有助于避免模型过早地陷入鞍点或局部最优解。
  4. 更好地探索损失表面:打乱数据相当于在不同的路径上探索损失表面,增加了梯度下降过程中的探索性,使得模型能够覆盖更大的搜索空间,从而增加找到全局最优解的可能性。这种多样化的探索有助于模型从鞍点或局部最优解中跳脱出来,继续优化。

不同批量梯度下降法的概念区分

  • 批量梯度下降(Batch Gradient Descent):批量大小等于整个训练集。每次更新模型参数时,使用整个训练集计算梯度。
  • 小批量梯度下降(Mini-batch Gradient Descent):批量大小在1和整个训练集之间(通常是一个合理的中间值,如32、64、128等)。每次更新模型参数时,使用一个小批量的数据计算梯度。
  • 随机梯度下降(Stochastic Gradient Descent:批量大小为1。每次更新模型参数时,只使用一个样本计算梯度。

epoch的数量并不代表参数更新的次数。BGD更新一次参数,需要把所有的训练数据看过一遍,每次迭代计算量很大,相比SGD和MBGD,BGD下降每次更新更准确、稳定。而SGD和MBGD在一个epoch里参数会更新多次,用一个banch算出来的损失相对带有更多噪声,因此参数更新方向更加曲折。同样的,因为增加了随机噪声,在非凸优化问题中,相比BGD更容易逃离局部最小值。

不同批量梯度下降花费的时间对比

BGD中的并行运算:并行运算指的是将计算任务分解为多个部分,并同时在多个处理单元上执行。对于深度学习中的批量梯度下降,GPU能够将一个批量中的多笔数据并行处理,从而极大地提升计算效率。

不同banch_size下一次更新所需时间对比

如下图,在MNIST数据集上,比较不同banch_size下一个banch计算梯度与参数更新的时间:

banch_size与一次更新花费时间的关系

当批量大小从1增加到1000时,计算时间几乎是恒定的。这是因为GPU能够高效地并行处理这1000笔数据。因此,处理1000笔数据并不需要单笔数据处理时间的1000倍。

但是,GPU的并行计算能力是有限的。当批量大小继续增加到10000甚至60000时,GPU的计算时间会随着批量大小的增加而逐渐增长。这是因为批量的规模已经超出了GPU的并行处理能力,导致每增加一部分数据,计算时间就会相应增加。

不同banch_size下一个epoch所需时间对比

如下图,比较不同banch_size下一个epoch中多次计算梯度与更新参数的总时间:

banch_size与一轮epoch花费时间的对比

 

批量大小决定了在一个回合中需要进行多少次参数更新:

  • 批量大小为1时:每次仅使用一笔数据,因此一个回合中需要更新60000次。
  • 批量大小为1000时:每次使用1000笔数据,因此一个回合中只需更新60次。

上图显示的是完成一个回合所需的总时间。较大的批量大小(如1000或60000)反而缩短了总时间,这是因为尽管每次更新的计算时间略有增加,但所需的更新次数大大减少。由此可以得出,在并行计算的影响下,更大的banch_size效率更高,一个epoch花费的时间更少。

因此,在实际训练中,如果硬件支持并行计算,选择较大的批量大小通常能更快完成一个回合的训练,提升整体效率。但仍需注意,当批量大小过大时,可能会遇到硬件的瓶颈,导致时间增加,因此选择适当的批量大小至关重要。

批量大小对模型准确率的影响

除了训练时间,批量大小还对模型的最终性能产生重要影响,不同的批量大小会影响训练和验证集上的准确率。

梯度噪声与训练效果

小批量的梯度更新往往带有较大的噪声(noisy),这意味着每次更新的方向可能不那么稳定。然而,这种噪声在某些情况下反而有利于训练,帮助模型跳出局部最优解,使得训练更加有效。相反,大的批量由于计算的梯度较为平滑,更新方向更加稳定,但可能导致模型陷入局部最优解,影响最终的训练效果。

下图展示了在MNIST和CIFAR-10两个数据集上,不同批量大小对模型准确率的影响:

  • 图a 展示了在MNIST数据集上的结果。随着批量大小的增大,验证集的准确率逐渐下降。值得注意的是,这种下降不仅发生在验证集上,训练集的准确率也随批量大小的增大而下降,这表明并非过拟合问题,而是由于大的批量在优化过程中的局限性。
  • 图b 展示了在CIFAR-10数据集上的结果,表现出类似的趋势。小批量的训练效果更好,而大的批量会导致训练和验证的准确率下降。

这些结果表明,尽管大的批量大小在训练时间上具有优势,但在优化效果上却存在问题。小批量大小的噪声梯度在一定程度上帮助了优化过程,使得模型能够更好地探索损失表面,找到更优的解。因此,在实际应用中,选择适当的小批量大小,可能会在模型性能上带来更好的结果。

在选择批量大小时,需要权衡计算时间和模型性能之间的关系。对于某些任务,较小的批量大小尽管在时间上可能稍有劣势,但在准确率和模型最终效果上可能表现得更好。因此,根据任务的具体需求和资源条件,选择合适的批量大小是至关重要的。

批量大小与模型泛化能力的关系

实际上,banch_size的选择与模型的泛化能力也有很大关联,主要体现在以下两点:

  • 小批量更新的噪声效应:小批量更新时,梯度计算中带有更多的随机噪声。这种噪声增加了每次参数更新的随机性,使得模型在训练过程中不断跳出局部最优解,探索更大的参数空间。这种探索能够帮助模型更好地适应未见的数据,从而提升泛化能力。

  • 大批量更新的稳定性与局限性:与小批量相比,大批量更新时,梯度计算更加平滑且稳定。这虽然加快了训练过程中的收敛速度,但也可能导致模型过度“依赖”训练数据的模式,进而陷入局部最优解。结果是,虽然模型在训练集上表现良好,但在验证集或测试集上可能表现不佳,泛化能力减弱。

因此,在实际训练中,批量大小的选择至关重要。通常可以通过实验,结合具体任务需求,选择一个能够兼顾训练效率和泛化能力的批量大小。

MBGD更有利于模型训练的可能原因

传统的批量梯度下降在更新参数时,沿着一个固定的损失函数进行优化。当模型走到局部最小值或鞍点时,梯度趋于零,梯度下降停滞。MBGD的方法则有所不同,由于每次更新参数时使用的只是数据的一部分(一个banch),因此每次计算的损失函数实际上有所不同,因此梯度下降的过程中相比BGD会尝试更多的方向。参考下图:

  • L1损失函数:在使用第一个批量数据时,计算出的梯度可能为零,这时如果是批量梯度下降法,模型将会卡在局部最小值或鞍点。
  • L2损失函数:然而,当使用另一个批量(即L2损失函数)时,计算出的梯度可能不为零,这使得模型能够继续更新参数,跳出原先的局部最小值或鞍点。

正是因为小批量梯度下降中每次使用的损失函数都略有不同,这种“有噪声”的更新方式反而帮助模型避免停滞在局部最小值或鞍点,继续沿着损失函数下降。这种随机性在训练过程中起到了类似于“扰动”的作用,使得模型更有机会找到更优的全局最优解。

还有一个可能的原因,出自论文“On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima”,如图:

大的批量在训练过程中容易让模型陷入“峡谷”中的局部最小值,这些最小值在训练集上表现很好,但在测试集上由于训练和测试损失函数的差异,表现可能会很差,导致模型过拟合。相反,小批量训练由于更新方向具有更多的随机性,能够帮助模型跳出这些“峡谷”,最终更可能停留在较宽的“盆地”中的局部最小值,这种最小值在训练和测试集上的表现差异较小,从而提高模型的泛化能力。

总结

小批量梯度下降(MBGD)通过引入更新噪声,能够更快地训练模型,并有效避免陷入局部最优,从而提高泛化能力。相比之下,批量梯度下降(BGD)尽管更新稳定、计算精确,但容易导致过拟合,特别是在大批量情况下。MBGD在实际应用中更灵活,适合大多数场景,尤其在并行计算环境下,能更好地平衡训练效率与模型性能,因此成为深度学习中的主流优化方法。

在大规模训练中,分布式计算的引入为支持更大的批量大小提供了可能。通过将数据和计算任务分布到多个节点上,分布式计算可以显著提高训练效率,缩短模型的收敛时间。然而,随着批量大小的增大,梯度更新的平滑性也会增加,这可能削弱模型的泛化能力。因此,在使用分布式计算时,需仔细调节批量大小和同步策略,以在提高训练速度的同时保持模型的性能。分布式计算结合小批量策略,可能是未来大规模深度学习中的重要优化方向。

 

动量法

动量法(Momentum Method)是深度学习优化算法中的一项重要技术,它通过引入动量的概念,使得模型在参数更新时不仅考虑当前的梯度,还参考之前的更新方向,从而提高了训练的效率与效果。

梯度下降法的局限性

在传统的梯度下降法中,模型参数的更新完全依赖于当前梯度的反方向。每一步更新后,模型会重新计算梯度并沿着新的梯度方向移动。这种方式虽然简单,但在复杂的误差表面上,尤其是在存在鞍点或局部最小值时,可能会导致模型陷入停滞,无法进一步优化。

动量法的引入

动量法通过借鉴物理中的动量概念,改善了这一局限性。设想一个从斜坡上滚下的球,即使球滚到鞍点或局部最小值,由于惯性的存在,它仍然会继续滚动。这就是动量法的基本思路:在每次更新参数时,不仅沿当前的梯度方向更新,还结合前一次的更新方向,从而形成更为平滑且持续的运动。

加入动量的好处

 一般梯度下降在进入局部最小值或鞍点后,就被困住了,但动量法由于受到之前的影响,还有可能继续往前“翻滚”,直到走出低谷。引入动量后,每次在移动参数的时候,不是只往梯度的反方向来移动参数,而是根据梯度的反方向加上前一步移动的方向决定移动方向。如下图:

使用动量法每一次更新参数都会受到前一步的影响

动量的计算与更新 

动量的核心在于累积历史梯度的影响。在具体实现中,动量的更新公式为:

m_t = \lambda m_{t-1} - \eta g_t

其中,m_t 是当前动量,\lambda是动量因子,决定了前一步对当前更新的影响程度;\eta是学习率,g_t 是当前梯度。

这个公式表明,每次更新的方向不仅考虑当前梯度,还参考了之前所有梯度的加权和。因此,动量法相当于在多步的梯度方向上积累了力量,使得模型更有可能摆脱困境,继续优化。

动量法的优势与调参建议

动量法的主要优势在于提高了模型训练的稳定性和效率,减少了训练过程中的震荡,并且能够帮助模型跳出局部最优。尤其在深度学习中的大规模训练任务中,动量法已经成为标配的优化策略。

在使用动量法时,通常需要调节动量因子 λ\lambdaλ 和学习率 η\etaη。一个常见的选择是将 λ\lambdaλ 设定为0.9或0.99,这样可以充分利用前几步的动量积累,而学习率则视具体任务而定,需要通过实验确定最佳值。

动量法的局限性与挑战

动量过大引发的震荡:如果动量因子(通常是 β\betaβ 或 λ\lambdaλ)设置得过大,动量的累积效应会导致参数更新幅度过大,尤其是在损失表面非常平坦或梯度方向变化剧烈的区域,这可能引发剧烈的震荡,导致模型训练过程不稳定,甚至无法收敛。

对学习率敏感:动量法的效果对学习率较为敏感。如果学习率设置不当,可能会导致优化过程过慢(学习率太小)或振荡(学习率太大),因此在使用动量法时,通常需要对学习率进行仔细调参。

可能导致过冲:在一些情况下,动量法可能会导致参数更新过度,即“过冲”到损失表面的另一侧,尤其是在损失表面有陡峭变化的区域。这种过冲可能会使优化过程反复穿梭于最优解两侧,增加收敛时间。

在复杂损失表面上的表现:对于非常复杂的损失表面(例如,多峰损失表面),动量法虽然可以帮助跳出局部最优,但有时也可能会错过更优的解,或者在某些极端情况下,加速了走向次优解的过程。

总结

在实际应用中,动量法通过结合当前梯度与历史梯度的影响,优化了传统梯度下降法的不足,能够显著加速模型的收敛。尤其是在误差表面复杂、存在多个局部最小值或鞍点的情况下,动量法通过累积动量,可以帮助模型跳出不利的局部最优,找到更优的解。因此,理解并正确应用动量法,是提升深度学习模型训练效果的关键之一。

此外,动量法的成功应用还依赖于对参数的合理调节,例如动量因子和学习率的选择。在实际训练中,适当调整这些参数可以进一步优化动量的效果,避免可能出现的震荡或过冲现象。因此,在深度学习中,动量法不仅仅是一个加速收敛的工具,更是一种策略性的方法,通过细致的调参和对问题结构的理解,能够更好地引导模型找到全局最优解,提高模型的性能和鲁棒性。

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值