动手学深度学习11.1. 优化和深度学习-笔记练习(PyTorch)
本节课程地址:72 优化算法【动手学深度学习v2】_哔哩哔哩_bilibili
本节教材地址:11.1. 优化和深度学习 — 动手学深度学习 2.0.0 documentation
本节开源代码:...>d2l-zh>pytorch>chapter_multilayer-perceptrons>optimization-intro.ipynb
优化和深度学习
本节将讨论优化与深度学习之间的关系以及在深度学习中使用优化的挑战。对于深度学习问题,我们通常会先定义损失函数。一旦我们有了损失函数,我们就可以使用优化算法来尝试最小化损失。在优化中,损失函数通常被称为优化问题的目标函数。按照传统惯例,大多数优化算法都关注的是最小化。如果我们需要最大化目标,那么有一个简单的解决方案:在目标函数前加负号即可。
优化的目标
尽管优化提供了一种最大限度地减少深度学习损失函数的方法,但本质上,优化和深度学习的目标是根本不同的。前者主要关注的是最小化目标,后者则关注在给定有限数据量的情况下寻找合适的模型。在 4.4节 中,我们详细讨论了这两个目标之间的区别。例如,训练误差和泛化误差通常不同:由于优化算法的目标函数通常是基于训练数据集的损失函数,因此优化的目标是减少训练误差。但是,深度学习(或更广义地说,统计推断)的目标是减少泛化误差。为了实现后者,除了使用优化算法来减少训练误差之外,我们还需要注意过拟合。
%matplotlib inline
import numpy as np
import torch
from mpl_toolkits import mplot3d
from d2l import torch as d2l
为了说明上述不同的目标,引入两个概念风险和经验风险。如 4.9.3.1节 所述,经验风险是训练数据集的平均损失,而风险则是整个数据群的预期损失。下面我们定义了两个函数:风险函数f
和经验风险函数g
。假设我们只有有限的训练数据。因此,这里的g
不如f
平滑。
def f(x):
return x * torch.cos(np.pi * x)
def g(x):
# 增加了一个额外的噪声项0.2 * torch.cos(5 * np.pi * x)
# 模拟由于训练数据的有限性而引入的噪声或波动
return f(x) + 0.2 * torch.cos(5 * np.pi * x)
下图说明,训练数据集的最低经验风险可能与最低风险(泛化误差)不同。
深度学习中的优化挑战
本章将关注优化算法在最小化目标函数方面的性能,而不是模型的泛化误差。在 3.1节 中,我们区分了优化问题中的解析解和数值解。在深度学习中,大多数目标函数都很复杂,没有解析解。相反,我们必须使用数值优化算法。本章中的优化算法都属于此类别。
深度学习优化存在许多挑战。其中最令人烦恼的是局部最小值、鞍点和梯度消失。
局部最小值
对于任何目标函数 ,如果在 处对应的 值小于在 附近任意其他点的 值,那么 可能是局部最小值。如果 在 处的值是整个域中目标函数的最小值,那么 是全局最小值。
例如,给定函数
我们可以近似该函数的局部最小值和全局最小值。
深度学习模型的目标函数通常有许多局部最优解。当优化问题的数值解接近局部最优值时,随着目标函数解的梯度接近或变为零,通过最终迭代获得的数值解可能仅使目标函数局部最优,而不是全局最优。只有一定程度的噪声可能会使参数跳出局部最小值。事实上,这是小批量随机梯度下降的有利特性之一。在这种情况下,小批量上梯度的自然变化能够将参数从局部极小值中跳出。
鞍点
除了局部最小值之外,鞍点是梯度消失的另一个原因。鞍点(saddle point)是指函数的所有梯度都消失但既不是全局最小值也不是局部最小值的任何位置。考虑这个函数 。它的一阶和二阶导数在 时消失。这时优化可能会停止,尽管它不是最小值。
如下例所示,较高维度的鞍点甚至更加隐蔽。考虑这个函数 。它的鞍点为。这是关于 的最大值,也是关于 的最小值。此外,它看起来像个马鞍,这就是鞍点的名字由来。
我们假设函数的输入是 维向量,其输出是标量,因此其Hessian矩阵(也称黑塞矩阵)将有 个特征值(参考特征分解的在线附录)。函数的解可能是局部最小值、局部最大值或函数梯度为零位置处的鞍点:
- 当函数在零梯度位置处的Hessian矩阵的特征值全部为正值时,我们有该函数的局部最小值;
- 当函数在零梯度位置处的Hessian矩阵的特征值全部为负值时,我们有该函数的局部最大值;
- 当函数在零梯度位置处的Hessian矩阵的特征值为负值和正值时,我们有该函数的一个鞍点。
对于高维度问题,至少部分特征值为负的可能性相当高。这使得鞍点比局部最小值更有可能出现。我们将在下一节介绍凸性时讨论这种情况的一些例外。简而言之,凸函数是Hessian函数的特征值永远不为负值的函数。不幸的是,大多数深度学习问题并不属于这一类。尽管如此,它还是研究优化算法的一个很好的工具。
梯度消失
可能遇到的最隐蔽问题是梯度消失。回想一下我们在 4.1.2节 中常用的激活函数及其衍生函数。例如,假设我们想最小化函数 ,然后我们恰好从 开始。正如我们所看到的那样, 的梯度接近零。更具体地说, ,因此是 。因此,在我们取得进展之前,优化将会停滞很长一段时间。事实证明,这是在引入ReLU激活函数之前训练深度学习模型相当棘手的原因之一。
正如我们所看到的那样,深度学习的优化充满挑战。幸运的是,有一系列强大的算法表现良好,即使对于初学者也很容易使用。此外,没有必要找到最优解。局部最优解或其近似解仍然非常有用。
小结
- 最小化训练误差并不能保证我们找到最佳的参数集来最小化泛化误差。
- 优化问题可能有许多局部最小值。
- 一个问题可能有很多的鞍点,因为问题通常不是凸的。
- 梯度消失可能会导致优化停滞,重参数化通常会有所帮助。对参数进行良好的初始化也可能是有益的。
练习
- 考虑一个简单的MLP,它有一个隐藏层,比如,隐藏层中维度为 d 和一个输出。证明对于任何局部最小值,至少有 d! 个等效方案。
解:
因为MLP中的神经元没有固有的顺序,所以对于任何局部最小值,可以通过排列隐藏层的神经元来得到等效的解。例如,如果我们交换两个神经元的位置,只要我们相应地调整权重矩阵,模型的输出将保持不变。
因此,对于d个神经元,可以以!d!种不同的方式排列它们。每一种排列都对应于权重矩阵的一种不同的配置,但是它们都会导致相同的隐藏层输出和最终的预测输出。
由于神经元的排列不会影响模型的预测能力,所以,对于一个具有d个神经元的隐藏层的MLP,任何局部最小值都有!d! 个等效方案,即证。 - 假设我们有一个对称随机矩阵 ,其中条目 各自从某种概率分布 中抽取。此外,假设 ,即分布是对称的(详情请参见 Wigner, 1958)。
1)证明特征值的分布也是对称的。也就是说,对于任何特征向量 ,关联的特征值 满足 的概率为 。
2)为什么以上没有暗示 ?
解:
1)由于 是对称的,那么,对于任何特征向量,考虑向量 ,则:
的特征值分布与 的特征值分布相同,但是符号相反,这意味着 也是 的一个特征值,具有相同的概率。因此,特征值的分布关于零对称,即 。
2)虽然特征值的分布是对称的,但这并不意味着 ,因为对称性只说明正特征值和负特征值的概率是相等的,但并没有指定这些概率的确切值。特征值的分布可能不是均匀的,或者它可能有其他属性,导致正负特征值的概率不是均等的。
3. 你能想到深度学习优化还涉及哪些其他挑战?
解:
1)超参数调优,寻找最佳的超参数组合是一个耗时且复杂的过程。
2)计算资源限制,特别是在训练大型模型或者数据量庞大的情况下。
3)模型的可解释性。
4. 假设你想在(真实的)鞍上平衡一个(真实的)球。
1)为什么这很难?
2)能利用这种效应来优化算法吗?
解:
1)理论上而言,鞍点是一个具有负曲率的几何形状,这意味着它在某些方向上是凹的,在其他方向上是凸的。而球体是一个完美的圆形,它在所有方向上都具有相同的曲率。因此,要使球体在鞍点上保持平衡,需要非常精确的位置和姿态控制,因为鞍点上任何微小的扰动都可能导致球体滚动,所以很难实现在鞍上稳定平衡一个球。
2)在某些情况下,随机性可以帮助算法逃离鞍点。例如,模拟退火和遗传算法等随机优化方法通过引入随机扰动来探索解空间,从而有可能逃离局部最优解和鞍点。