☰
优化与深度学习:深入剖析损失函数最小化的目标与三大挑战(局部最小值、鞍点、梯度消失)——基于 d2l-zh 的实战指南
2026/10/2 7:03:00 网站建设 项目流程
  • 人工智能
  • 深度学习
  • 机器学习
  • 教程

【免费下载链接】d2l-zh

《动手学深度学习》:面向中文读者、能运行、可讨论。中英文版被70多个国家的500多所大学用于教学。

项目地址:https://gitcode.com/GitHub_Trending/d2/d2l-zh
点击查看免费下载

<输出文章>

优化与深度学习:深入剖析损失函数最小化的目标与三大挑战(局部最小值、鞍点、梯度消失)

导读

本文基于《动手学深度学习》(d2l-zh)优化算法一章的开篇内容,系统讲解"优化"与"深度学习"这两个常被混为一谈的概念之间的本质区别,并逐一拆解深度学习中优化算法面临的最令人头疼的三大挑战:局部最小值、鞍点与梯度消失。读完本文,你将理解为什么"最小化训练误差"不等于"得到好模型",掌握用 Hessian 矩阵特征值判别极值点性质的数学工具,并能直接运行仓库配套的四框架(MXNet、PyTorch、TensorFlow、PaddlePaddle)可视化代码,亲手绘制风险函数、马鞍面与 tanh 曲线来印证这些挑战的存在。

优化与深度学习的本质关系

对于任何一个深度学习问题,我们通常都会先定义一个损失函数(loss function)。一旦有了损失函数,就可以使用优化算法来尝试最小化它。在优化的语境下,损失函数通常被称为优化问题的目标函数(objective function)。

按照传统惯例,绝大多数优化算法都关注的是最小化(minimization)。如果某天你需要最大化一个目标,有一个非常简单的解决方案:在目标函数前加一个负号即可——最大化 $f(x)$ 等价于最小化 $-f(x)$。

优化的目标 ≠ 深度学习的目标

尽管优化提供了一种最小化深度学习损失函数的手段,但从本质上说,优化和深度学习的目标是根本不同的:

  • 优化主要关注的是最小化目标函数本身;
  • 深度学习(更广义地说,统计推断)关注的是在给定有限数据量的情况下,寻找合适的模型。

二者之间的差异在模型选择相关章节(见欠拟合与过拟合)中有详细讨论。核心矛盾在于:

  • 优化算法的目标函数通常是基于训练数据集的损失函数,因此优化的目标是减少训练误差(training error);
  • 而深度学习的真正目标是减少泛化误差(generalization error)。为了达成后者,除了使用优化算法压低训练误差之外,还必须时刻提防过拟合(overfitting)。

换句话说,优化只管"把训练集上的损失压下去",而深度学习关心的是"模型在未见数据上是否依然表现良好"——这两件事不仅不等价,甚至可能互相冲突。

解析解与数值解

在线性回归中,我们区分过优化问题的解析解(analytical solution)和数值解(numerical solution)。在深度学习中,大多数目标函数都非常复杂,没有解析解,我们必须借助数值优化算法迭代逼近。本文所属的优化算法一章所讨论的所有算法(如梯度下降、随机梯度下降、小批量随机梯度下降、Momentum、AdaGrad、RMSProp、Adam 等)都属于数值优化这一类别。

风险与经验风险:为什么训练误差最小不代表泛化好

为了把"优化的目标"与"深度学习的目标"之间的差异讲清楚,需要引入两个关键概念:

  • 经验风险(empirical risk):训练数据集上的平均损失;
  • 风险(risk):整个数据总体(真实分布)上的期望损失。

统计学家把训练集上的平均损失称为经验风险,它是对真实风险的一种近似(详细讨论见分布偏移与环境中的"经验风险与实际风险"小节)。实践中我们进行的"经验风险最小化(empirical risk minimization)",本质上是用训练数据上的平均损失去近似那个不可直接观测的真实风险。

下面我们在d2l-zh仓库中定义两个函数来直观对比:

  • 风险函数f(x);
  • 经验风险函数g(x)。

由于我们只有有限的训练数据,因此g不如f平滑(g在f的基础上叠加了一个高频的扰动项):

#@tab all def f(x): return x * d2l.cos(np.pi * x) def g(x): return f(x) + 0.2 * d2l.cos(5 * np.pi * x)

随后用仓库提供的绘图工具画出一条曲线,并标注出两个函数各自的最小值位置:

#@tab mxnet, pytorch, tensorflow def annotate(text, xy, xytext): #@save d2l.plt.gca().annotate(text, xy=xy, xytext=xytext, arrowprops=dict(arrowstyle='->')) x = d2l.arange(0.5, 1.5, 0.01) d2l.set_figsize((4.5, 2.5)) d2l.plot(x, [f(x), g(x)], 'x', 'risk') annotate('min of\nempirical risk', (1.0, -1.2), (0.5, -1.1)) annotate('min of risk', (1.1, -1.05), (0.95, -0.5))

PaddlePaddle 版本仅在生成坐标时显式指定了浮点类型:

#@tab paddle x = d2l.arange(0.5, 1.5, 0.01, dtype='float32')

从图中可以清楚看到:训练数据集的最低经验风险点,与最低风险(泛化误差)点并不重合。这正是"优化做得好"与"模型用得好"是两回事的直观证据。

深度学习中的优化挑战

本章(优化算法)将聚焦优化算法在最小化目标函数方面的性能,而不是模型的泛化误差。深度学习优化面临诸多挑战,其中最令人烦恼的三个是:局部最小值、鞍点和梯度消失。

局部最小值

对于任何目标函数 $f(x)$:

  • 如果在 $x$ 处对应的 $f(x)$ 值小于在 $x$ 附近任意其他点的 $f(x)$ 值,那么 $f(x)$ 在该处取得局部最小值(local minimum);
  • 如果 $f(x)$ 在 $x$ 处的值是整个定义域中目标函数的最小值,那么 $f(x)$ 在该处取得全局最小值(global minimum)。

考虑如下函数:

$$f(x) = x \cdot \cos(\pi x), \quad -1.0 \leq x \leq 2.0,$$

我们可以绘制出它的曲线并近似标注出局部最小值与全局最小值:

#@tab mxnet, pytorch, tensorflow x = d2l.arange(-1.0, 2.0, 0.01) d2l.plot(x, [f(x), ], 'x', 'f(x)') annotate('local minimum', (-0.3, -0.25), (-0.77, -1.0)) annotate('global minimum', (1.1, -0.95), (0.6, 0.8))

深度学习模型的目标函数通常含有大量局部最优解。当优化问题的数值解接近某个局部最优值时,目标函数解的梯度会接近甚至变为零,通过最终迭代获得的数值解可能只让目标函数达到局部最优,而非全局最优。

只有一定程度的噪声才有可能使参数跳出局部最小值。事实上,这正是**小批量随机梯度下降(minibatch SGD)的有利特性之一:小批量上梯度的自然变化(噪声)**能够将参数从局部极小值中"抖"出来。这正是后续小批量随机梯度下降章节要深入探讨的机制。

鞍点

除了局部最小值之外,鞍点(saddle point)是梯度消失的另一个原因。鞍点是指函数的所有梯度都消失、但既不是全局最小值也不是局部最小值的任何位置。

考虑函数 $f(x) = x^3$。它在 $x = 0$ 处一阶导数 $f'(0) = 0$、二阶导数 $f''(0) = 0$ 同时消失,此时优化可能在这里停滞——尽管 $x = 0$ 并不是最小值:

#@tab mxnet, pytorch, tensorflow x = d2l.arange(-2.0, 2.0, 0.01) d2l.plot(x, [x**3], 'x', 'f(x)') annotate('saddle point', (0, -0.2), (-0.52, -5.0))

更高维度上的鞍点更加隐蔽。考虑函数 $f(x, y) = x^2 - y^2$,它的鞍点位于 $(0, 0)$:关于 $y$ 它是最大值,关于 $x$ 它是最小值。它的曲面形状酷似马鞍——这正是"saddle point(马鞍点)"名称的由来。下面的代码用三维线框图将其可视化,并在原点处用红叉标出鞍点:

#@tab mxnet x, y = d2l.meshgrid( d2l.linspace(-1.0, 1.0, 101), d2l.linspace(-1.0, 1.0, 101)) z = x**2 - y**2 ax = d2l.plt.figure().add_subplot(111, projection='3d') ax.plot_wireframe(x.asnumpy(), y.asnumpy(), z.asnumpy(), **{'rstride': 10, 'cstride': 10}) ax.plot([0], [0], [0], 'rx') ticks = [-1, 0, 1] d2l.plt.xticks(ticks) d2l.plt.yticks(ticks) ax.set_zticks(ticks) d2l.plt.xlabel('x') d2l.plt.ylabel('y');

PyTorch、TensorFlow 与 PaddlePaddle 版本除数据类型转换方式不同外,绘图逻辑完全一致:

#@tab pytorch, tensorflow, paddle x, y = d2l.meshgrid( d2l.linspace(-1.0, 1.0, 101), d2l.linspace(-1.0, 1.0, 101)) z = x**2 - y**2 ax = d2l.plt.figure().add_subplot(111, projection='3d') ax.plot_wireframe(x, y, z, **{'rstride': 10, 'cstride': 10}) ax.plot([0], [0], [0], 'rx') ticks = [-1, 0, 1] d2l.plt.xticks(ticks) d2l.plt.yticks(ticks) ax.set_zticks(ticks) d2l.plt.xlabel('x') d2l.plt.ylabel('y');
用 Hessian 矩阵特征值判别极值点性质

假设函数的输入是 $k$ 维向量、输出是标量,那么它的 **Hessian 矩阵(黑塞矩阵)**将含有 $k$ 个特征值(其数学基础参见矩阵特征分解相关理论)。在函数梯度为零的位置,解可能是局部最小值、局部最大值或鞍点,判别规则如下:

  • 当函数在零梯度位置处的 Hessian 矩阵特征值全部为正值时,该位置是局部最小值;
  • 当函数在零梯度位置处的 Hessian 矩阵特征值全部为负值时,该位置是局部最大值;
  • 当函数在零梯度位置处的 Hessian 矩阵特征值既有负值又有正值时,该位置是鞍点。

对于高维度问题,至少部分特征值为负的可能性相当高——这使得鞍点比局部最小值更有可能出现。下一节讨论凸性(凸性)时会谈到一些例外情况。简而言之,凸函数是 Hessian 矩阵的特征值永远不为负值的函数。遗憾的是,大多数深度学习问题并不属于这一类;尽管如此,凸性仍是研究优化算法的极好工具。

梯度消失

可能遇到的最隐蔽的问题是梯度消失(vanishing gradient)。回想常用的激活函数及其导数。例如,假设我们要最小化函数 $f(x) = \tanh(x)$,并且恰好从 $x = 4$ 处开始。此时 $f$ 的梯度已经非常接近零——更具体地说:

$$f'(x) = 1 - \tanh^2(x), \quad f'(4) = 0.0013.$$

如此微小的梯度意味着:在取得任何进展之前,优化会停滞很长一段时间。事实证明,这正是在引入 ReLU 激活函数之前,训练深度学习模型相当棘手的原因之一。

#@tab mxnet, pytorch, tensorflow x = d2l.arange(-2.0, 5.0, 0.01) d2l.plot(x, [d2l.tanh(x)], 'x', 'f(x)') annotate('vanishing gradient', (4, 1), (2, 0.0))
#@tab paddle x = d2l.arange(-2.0, 5.0, 0.01, dtype='float32') d2l.plot(x, [d2l.tanh(x)], 'x', 'f(x)') annotate('vanishing gradient', (4, 1), (2, 0.0))

如上所见,深度学习的优化充满挑战。幸运的是,存在一系列表现良好的强大算法(参见本章后续的 Momentum、AdaGrad、RMSProp、Adam 等章节),即便对于初学者也很容易使用。此外,没有必要找到最优解——局部最优解或其近似解仍然非常有用。

运行环境与仓库源码级支撑

本文所有示例都直接运行于 d2l-zh 仓库提供的d2l工具包之上。四个深度学习框架的导入方式如下(以 PyTorch 为例):

#@tab pytorch %matplotlib inline from d2l import torch as d2l import numpy as np from mpl_toolkits import mplot3d import torch

MXNet 版本需要额外调用npx.set_np()切换到 NumPy 兼容接口;TensorFlow 版本导入tensorflow as tf;PaddlePaddle 版本导入paddle并过滤警告:

#@tab mxnet %matplotlib inline from d2l import mxnet as d2l from mpl_toolkits import mplot3d from mxnet import np, npx npx.set_np()
#@tab tensorflow %matplotlib inline from d2l import tensorflow as d2l import numpy as np from mpl_toolkits import mplot3d import tensorflow as tf
#@tab paddle %matplotlib inline from d2l import paddle as d2l import warnings warnings.filterwarnings("ignore") import numpy as np from mpl_toolkits import mplot3d import paddle

文中所用的d2l.set_figsize、d2l.plot、d2l.meshgrid、d2l.linspace、d2l.arange、d2l.cos、d2l.tanh以及annotate等工具,均可以在仓库源码中找到对应实现。以 PyTorch 后端为例(见 d2l/torch.py):

  • set_figsize调用use_svg_display()将 matplotlib 后端切换为 SVG 格式,并设置figure.figsize(默认(3.5, 2.5));
  • plot负责统一处理一维/多维输入、绘制多条曲线(默认线型('-', 'm--', 'g-.', 'r:'))、设置坐标轴标签、范围、刻度和网格;
  • annotate封装了matplotlib的axes.annotate,为图中关键点添加带箭头的文字标注;
  • 张量创建与数学函数则直接映射到各框架底层 API,例如arange = torch.arange、meshgrid = torch.meshgrid、linspace = torch.linspace、cos = torch.cos、tanh = torch.tanh(MXNet 后端则映射arange = np.arange、meshgrid = np.meshgrid、linspace = np.linspace)。

这套工具函数最初在微积分章节引入,此后被全书的各章(包括本文)复用,是快速绘制函数曲线、验证数学性质的标准基础设施。

小结

  • 最小化训练误差并不能保证我们找到最佳的参数集来最小化泛化误差——这正是"风险"与"经验风险"两个概念要分开的原因;
  • 优化问题可能存在许多局部最小值;
  • 一个问题可能有很多鞍点,因为深度学习中的问题通常不是凸的;
  • 梯度消失可能导致优化停滞,重参数化通常会有所帮助,对参数进行良好的初始化也可能是有益的。

练习

  1. 考虑一个简单的 MLP:它有一个隐藏层,比如隐藏层维度为 $d$,外加一个输出。证明对于任何局部最小值,至少有 $d!$ 个等价方案。
  2. 假设我们有一个对称随机矩阵 $\mathbf{M}$,其中条目 $M_{ij} = M_{ji}$ 各自从某种概率分布 $p_{ij}$ 中抽取。此外,假设 $p_{ij}(x) = p_{ij}(-x)$,即分布是对称的。
    • 证明特征值的分布也是对称的:对于任何特征向量 $\mathbf{v}$,关联的特征值 $\lambda$ 满足 $P(\lambda > 0) = P(\lambda < 0)$;
    • 为什么以上并不暗示 $P(\lambda > 0) = 0.5$?
  3. 你能想到深度学习优化中还涉及哪些其他挑战?
  4. 假设你想在(真实的)马鞍上平衡一个(真实的)球。
    • 为什么这很难?
    • 能利用这种效应来改进优化算法吗?

如果你希望继续深入,可以按顺序阅读本章后续内容:凸性、梯度下降、随机梯度下降、小批量随机梯度下降,以及 Momentum、AdaGrad、RMSProp、AdaDelta、Adam 和学习率调度器——这些章节将逐一给出应对上述三大挑战的算法武器。

  • 人工智能
  • 深度学习
  • 机器学习
  • 教程

【免费下载链接】d2l-zh

《动手学深度学习》:面向中文读者、能运行、可讨论。中英文版被70多个国家的500多所大学用于教学。

项目地址:https://gitcode.com/GitHub_Trending/d2/d2l-zh
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询