——基于 d2l-zh 的实战指南)
人工智能深度学习机器学习教程【免费下载链接】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, xyxy, xytextxytext, arrowpropsdict(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, dtypefloat32)从图中可以清楚看到训练数据集的最低经验风险点与最低风险泛化误差点并不重合。这正是优化做得好与模型用得好是两回事的直观证据。深度学习中的优化挑战本章优化算法将聚焦优化算法在最小化目标函数方面的性能而不是模型的泛化误差。深度学习优化面临诸多挑战其中最令人烦恼的三个是局部最小值、鞍点和梯度消失。局部最小值对于任何目标函数 $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, projection3d) 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, projection3d) 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, dtypefloat32) 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 torchMXNet 版本需要额外调用npx.set_np()切换到 NumPy 兼容接口TensorFlow 版本导入tensorflow as tfPaddlePaddle 版本导入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.pyset_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.tanhMXNet 后端则映射arange np.arange、meshgrid np.meshgrid、linspace np.linspace。这套工具函数最初在微积分章节引入此后被全书的各章包括本文复用是快速绘制函数曲线、验证数学性质的标准基础设施。小结最小化训练误差并不能保证我们找到最佳的参数集来最小化泛化误差——这正是风险与经验风险两个概念要分开的原因优化问题可能存在许多局部最小值一个问题可能有很多鞍点因为深度学习中的问题通常不是凸的梯度消失可能导致优化停滞重参数化通常会有所帮助对参数进行良好的初始化也可能是有益的。练习考虑一个简单的 MLP它有一个隐藏层比如隐藏层维度为 $d$外加一个输出。证明对于任何局部最小值至少有 $d!$ 个等价方案。假设我们有一个对称随机矩阵 $\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$你能想到深度学习优化中还涉及哪些其他挑战假设你想在真实的马鞍上平衡一个真实的球。为什么这很难能利用这种效应来改进优化算法吗如果你希望继续深入可以按顺序阅读本章后续内容凸性、梯度下降、随机梯度下降、小批量随机梯度下降以及 Momentum、AdaGrad、RMSProp、AdaDelta、Adam 和学习率调度器——这些章节将逐一给出应对上述三大挑战的算法武器。赞分享人工智能深度学习机器学习教程【免费下载链接】d2l-zh《动手学深度学习》面向中文读者、能运行、可讨论。中英文版被70多个国家的500多所大学用于教学。项目地址https://gitcode.com/GitHub_Trending/d2/d2l-zh点击查看免费下载相关推荐d2l-en 优化入门指南深度学习中的优化目标、局部最小值、鞍点与梯度消失d2l en 优化入门指南深度学习中的优化目标、局部最小值、鞍点与梯度消失 导读 本文基于《Dive into Deep Learning》d2l en开文档教程人工智能深度学习NLP计算机视觉强化学习从零实现线性回归数据流水线、损失函数与小批量随机梯度下降实战解析《动手学深度学习》d2l-zh 篇从零实现线性回归数据流水线、损失函数与小批量随机梯度下降实战解析《动手学深度学习》d2l zh 篇 本文基于《动手学深度学习》d2l zh仓库中 li人工智能深度学习机器学习教程5分钟打造AI视频生成神器零基础也能创作专业级视频5分钟打造AI视频生成神器零基础也能创作专业级视频 Auto Video Generator是一个革命性的开源AI视频创作工具只需输入文字主题系统就能在几AI 应用媒体生成语音创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考