0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PyTorch教程-12.1. 优化和深度学习

jf_pJlTbmA9 来源:2098332 作者:2098332 2023-06-05 15:44 次阅读

在本节中,我们将讨论优化与深度学习之间的关系以及在深度学习中使用优化的挑战。对于一个深度学习问题,我们通常会先定义一个 损失函数。一旦我们有了损失函数,我们就可以使用优化算法来尝试最小化损失。在优化中,损失函数通常被称为优化问题的目标函数。按照传统和约定,大多数优化算法都与最小化有关。如果我们需要最大化目标,有一个简单的解决方案:只需翻转目标上的标志。

12.1.1。优化目标

尽管优化为深度学习提供了一种最小化损失函数的方法,但从本质上讲,优化和深度学习的目标是根本不同的。前者主要关注最小化目标,而后者关注在给定有限数据量的情况下找到合适的模型。在 第 3.6 节中,我们详细讨论了这两个目标之间的区别。例如,训练误差和泛化误差通常不同:由于优化算法的目标函数通常是基于训练数据集的损失函数,因此优化的目标是减少训练误差。然而,深度学习(或更广泛地说,统计推断)的目标是减少泛化误差。为了完成后者,除了使用优化算法来减少训练误差外,我们还需要注意过度拟合。

%matplotlib inline
import numpy as np
import torch
from mpl_toolkits import mplot3d
from d2l import torch as d2l

%matplotlib inline
from mpl_toolkits import mplot3d
from mxnet import np, npx
from d2l import mxnet as d2l

npx.set_np()

%matplotlib inline
import numpy as np
import tensorflow as tf
from mpl_toolkits import mplot3d
from d2l import tensorflow as d2l

为了说明上述不同的目标,让我们考虑经验风险和风险。如第 4.7.3.1 节所述 ,经验风险是训练数据集的平均损失,而风险是整个数据群的预期损失。下面我们定义两个函数:风险函数f和经验风险函数g。假设我们只有有限数量的训练数据。结果,这里g 不如 平滑f。

def f(x):
  return x * torch.cos(np.pi * x)

def g(x):
  return f(x) + 0.2 * torch.cos(5 * np.pi * x)

def f(x):
  return x * np.cos(np.pi * x)

def g(x):
  return f(x) + 0.2 * np.cos(5 * np.pi * x)

def f(x):
  return x * tf.cos(np.pi * x)

def g(x):
  return f(x) + 0.2 * tf.cos(5 * np.pi * x)

下图说明了训练数据集上经验风险的最小值可能与风险的最小值(泛化误差)位于不同的位置。

def annotate(text, xy, xytext): #@save
  d2l.plt.gca().annotate(text, xy=xy, xytext=xytext,
              arrowprops=dict(arrowstyle='->'))

x = torch.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 ofnempirical risk', (1.0, -1.2), (0.5, -1.1))
annotate('min of risk', (1.1, -1.05), (0.95, -0.5))

pYYBAGR9OLCARSaKAAEhrWBFT9M534.svg

def annotate(text, xy, xytext): #@save
  d2l.plt.gca().annotate(text, xy=xy, xytext=xytext,
              arrowprops=dict(arrowstyle='->'))

x = np.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 ofnempirical risk', (1.0, -1.2), (0.5, -1.1))
annotate('min of risk', (1.1, -1.05), (0.95, -0.5))

pYYBAGR9OLCARSaKAAEhrWBFT9M534.svg

def annotate(text, xy, xytext): #@save
  d2l.plt.gca().annotate(text, xy=xy, xytext=xytext,
              arrowprops=dict(arrowstyle='->'))

x = tf.range(0.5, 1.5, 0.01)
d2l.set_figsize((4.5, 2.5))
d2l.plot(x, [f(x), g(x)], 'x', 'risk')
annotate('min ofnempirical risk', (1.0, -1.2), (0.5, -1.1))
annotate('min of risk', (1.1, -1.05), (0.95, -0.5))

poYBAGR9OLWAAe0DAAEhtoAyqDg129.svg

12.1.2。深度学习中的优化挑战

在本章中,我们将特别关注优化算法在最小化目标函数方面的性能,而不是模型的泛化误差。在 3.1 节中,我们区分了优化问题中的解析解和数值解。在深度学习中,大多数目标函数都很复杂,没有解析解。相反,我们必须使用数值优化算法。本章的优化算法都属于这一类。

深度学习优化有很多挑战。一些最令人烦恼的是局部最小值、鞍点和梯度消失。让我们来看看它们。

12.1.2.1。局部最小值

对于任何目标函数f(x), 如果值f(x)在 x小于的值f(x)在附近的任何其他点x, 然后f(x)可能是局部最小值。如果值f(x)在x是整个域内目标函数的最小值,则f(x)是全局最小值。

例如,给定函数

(12.1.1)f(x)=x⋅cos(πx)for−1.0≤x≤2.0,

我们可以逼近这个函数的局部最小值和全局最小值。

x = torch.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))

pYYBAGR9OLeAVduAAACoUAH2ZEc074.svg

x = np.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))

poYBAGR9OLqAEVjhAACoUe_or70496.svg

x = tf.range(-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))

poYBAGR9OLyANIdoAACoRjNm0Lo702.svg

深度学习模型的目标函数通常有很多局部最优值。当优化问题的数值解接近局部最优时,随着目标函数解的梯度趋近或变为零,最终迭代得到的数值解可能只会局部最小化目标函数,而不是全局最小化。只有某种程度的噪声可能会使参数超出局部最小值。事实上,这是小批量随机梯度下降的有益特性之一,其中小批量梯度的自然变化能够将参数从局部最小值中移除。

12.1.2.2。鞍点

除了局部最小值,鞍点是梯度消失的另一个原因。鞍点是函数的所有梯度都消失但既不是全局最小值也不是局部最小值的任何位置。考虑函数f(x)=x3. 它的一阶和二阶导数消失为x=0. 优化可能会在此时停止,即使它不是最小值。

x = torch.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))

pYYBAGR9OL6AVkH4AAB9txeE7BM015.svg

x = np.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))

pYYBAGR9OL6AVkH4AAB9txeE7BM015.svg

x = tf.range(-2.0, 2.0, 0.01)
d2l.plot(x, [x**3], 'x', 'f(x)')
annotate('saddle point', (0, -0.2), (-0.52, -5.0))

pYYBAGR9OMKAQRt6AAB9u1lYUbg210.svg

更高维度的鞍点更加隐蔽,如下例所示。考虑函数f(x,y)=x2−y2. 它的鞍点位于(0,0). 这是相对于y和最低限度x. 此外,它看起来像一个马鞍,这就是这个数学性质得名的地方。

x, y = torch.meshgrid(
  torch.linspace(-1.0, 1.0, 101), torch.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');

poYBAGR9OMSAJE-HAAEDzmdOJZE022.svg

x, y = np.meshgrid(
  np.linspace(-1.0, 1.0, 101), np.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');

poYBAGR9OMaAeNWkAAEDzhXHnnk558.svg

x, y = tf.meshgrid(
  tf.linspace(-1.0, 1.0, 101), tf.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');

poYBAGR9OMyAPBHMAAED0pssMW0836.svg

我们假设函数的输入是k维向量,它的输出是一个标量,所以它的 Hessian 矩阵有k 特征值。函数的解可以是局部最小值、局部最大值或函数梯度为零的位置处的鞍点:

当函数的 Hessian 矩阵在零梯度位置的特征值都为正时,函数有一个局部最小值。

当函数的 Hessian 矩阵在零梯度位置的特征值全部为负时,我们有函数的局部最大值。

当函数的 Hessian 矩阵在零梯度位置的特征值分别为负和正时,我们就有了函数的鞍点。

对于高维问题,至少某些特征值为负的可能性非常高。这使得鞍点比局部最小值更有可能。我们将在下一节介绍凸性时讨论这种情况的一些例外情况。简而言之,凸函数是那些 Hessian 矩阵的特征值从不为负的函数。但遗憾的是,大多数深度学习问题并不属于这一类。尽管如此,它还是研究优化算法的好工具。

12.1.2.3。消失的渐变

可能遇到的最隐蔽的问题是梯度消失。回忆一下我们在5.1.2 节中常用的激活函数及其派生函数。例如,假设我们要最小化函数f(x)=tanh⁡(x)我们碰巧开始于x=4. 正如我们所见,梯度f接近于零。进一步来说, f′(x)=1−tanh2⁡(x)因此f′(4)=0.0013. 因此,在我们取得进展之前,优化将停滞很长时间。事实证明,这是在引入 ReLU 激活函数之前训练深度学习模型非常棘手的原因之一。

x = torch.arange(-2.0, 5.0, 0.01)
d2l.plot(x, [torch.tanh(x)], 'x', 'f(x)')
annotate('vanishing gradient', (4, 1), (2, 0.0))

pYYBAGR9OM6AU799AACtyyM6dcY975.svg

x = np.arange(-2.0, 5.0, 0.01)
d2l.plot(x, [np.tanh(x)], 'x', 'f(x)')
annotate('vanishing gradient', (4, 1), (2, 0.0))

pYYBAGR9OM6AU799AACtyyM6dcY975.svg

x = tf.range(-2.0, 5.0, 0.01)
d2l.plot(x, [tf.tanh(x)], 'x', 'f(x)')
annotate('vanishing gradient', (4, 1), (2, 0.0))

poYBAGR9ONKAMIrMAACtur1e8Hc499.svg

正如我们所见,深度学习的优化充满挑战。幸运的是,存在一系列强大的算法,它们性能良好并且即使对于初学者也易于使用。此外,并不是真的有必要找到最佳解决方案。其局部最优甚至近似解仍然非常有用。

12.1.3。概括

最小化训练误差并不能保证我们找到最佳参数集来最小化泛化误差。

优化问题可能有很多局部极小值。

该问题可能有更多的鞍点,因为通常问题不是凸的。

消失的梯度会导致优化停止。问题的重新参数化通常会有所帮助。参数的良好初始化也可能是有益的。

12.1.4。练习

考虑一个简单的 MLP,它有一个隐藏层,比方说,d 隐藏层中的维度和单个输出。表明对于任何局部最小值,至少有d!行为相同的等效解决方案。

假设我们有一个对称随机矩阵M 条目在哪里Mij=Mji每个都是从一些概率分布中得出的pij. 此外假设 pij(x)=pij(−x),即分布是对称的(有关详细信息,请参见例如Wigner ( 1958 ))。

证明特征值的分布也是对称的。也就是说,对于任何特征向量v相关特征值的概率λ满足 P(λ>0)=P(λ<0).

为什么上面没有暗示P(λ>0)=0.5?

您还能想到深度学习优化中涉及的其他哪些挑战?

假设您想要在(真实的)鞍座上平衡一个(真实的)球。

为什么这很难?

您能否将这种效应也用于优化算法?

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 深度学习
    +关注

    关注

    73

    文章

    5239

    浏览量

    119927
  • pytorch
    +关注

    关注

    2

    文章

    763

    浏览量

    12836
收藏 人收藏

    评论

    相关推荐

    Pytorch模型训练实用PDF教程【中文】

    本教程以实际应用、工程开发为目的,着重介绍模型训练过程中遇到的实际问题和方法。在机器学习模型开发中,主要涉及三大部分,分别是数据、模型和损失函数及优化器。本文也按顺序的依次介绍数据、模型和损失函数
    发表于 12-21 09:18

    Pytorch入门教程与范例

    pytorch 是一个基于 python 的深度学习库。pytorch 源码库的抽象层次少,结构清晰,代码量适中。相比于非常工程化的 tensorflow,
    发表于 11-15 17:50 4989次阅读
    <b class='flag-5'>Pytorch</b>入门教程与范例

    PyTorch官网教程PyTorch深度学习:60分钟快速入门中文翻译版

    PyTorch 深度学习:60分钟快速入门”为 PyTorch 官网教程,网上已经有部分翻译作品,随着PyTorch1.0 版本的公布,这
    的头像 发表于 01-13 11:53 9809次阅读

    苹果向开发者用户推送了iOS 12.1. 3 开发者预览版beta4

    今天凌晨,苹果向开发者用户推送了iOS 12.1. 3 开发者预览版beta4,距离上个版本更新仅 3 天时间,更新后的版本号为16D5039a。和以往一样,苹果给出的更新说明依旧是修复bug、提升系统流畅度。
    的头像 发表于 01-14 10:01 3777次阅读
    苹果向开发者用户推送了iOS <b class='flag-5'>12.1.</b> 3 开发者预览版beta4

    为什么学习深度学习需要使用PyTorch和TensorFlow框架

    如果你需要深度学习模型,那么 PyTorch 和 TensorFlow 都是不错的选择。 并非每个回归或分类问题都需要通过深度学习来解决。
    的头像 发表于 09-14 10:57 3225次阅读

    基于PyTorch深度学习入门教程之PyTorch的安装和配置

    神经网络结构,并且运用各种深度学习算法训练网络参数,进而解决各种任务。 本文从PyTorch环境配置开始。PyTorch是一种Python接口的深度
    的头像 发表于 02-16 15:15 2235次阅读

    基于PyTorch深度学习入门教程之PyTorch简单知识

    是一个基于Python的科学计算框架,用于进行深度学习相关研究。对于Python语言的入门,可以参考之前的两篇介绍PythonNumpy的博客。分别是Python Numpy 教程(
    的头像 发表于 02-16 15:20 2010次阅读

    深度模型中的优化学习课件下载

    深度模型中的优化学习课件下载
    发表于 04-07 16:21 3次下载
    <b class='flag-5'>深度</b>模型中的<b class='flag-5'>优化</b>与<b class='flag-5'>学习</b>课件下载

    PyTorch开源深度学习框架简介

    PyTorch 是一种开源深度学习框架,以出色的灵活性和易用性著称。这在一定程度上是因为与机器学习开发者和数据科学家所青睐的热门 Python 高级编程语言兼容。
    的头像 发表于 07-29 10:26 3739次阅读

    深度学习框架PyTorch和TensorFlow如何选择

    在 AI 技术兴起后,深度学习框架 PyTorch 和 TensorFlow 两大阵营似乎也爆发了类似的「战争」。这两个阵营背后都有大量的支持者,并且他们都有充足的理由来说明为什么他们所喜欢的框架是最好的。
    发表于 02-02 10:28 867次阅读

    什么是深度学习优化算法

    先大致讲一下什么是深度学习优化算法吧,我们可以把模型比作函数,一种很复杂的函数:h(f(g(k(x)))),函数有参数,这些参数是未知的,深度学习
    的头像 发表于 02-13 15:31 1126次阅读
    什么是<b class='flag-5'>深度</b><b class='flag-5'>学习</b>中<b class='flag-5'>优化</b>算法

    PyTorch教程5.5之深度学习中的泛化

    电子发烧友网站提供《PyTorch教程5.5之深度学习中的泛化.pdf》资料免费下载
    发表于 06-05 15:31 1次下载
    <b class='flag-5'>PyTorch</b>教程5.5之<b class='flag-5'>深度</b><b class='flag-5'>学习</b>中的泛化

    PyTorch教程12.1优化深度学习

    电子发烧友网站提供《PyTorch教程12.1优化深度学习.pdf》资料免费下载
    发表于 06-05 15:08 0次下载
    <b class='flag-5'>PyTorch</b>教程<b class='flag-5'>12.1</b>之<b class='flag-5'>优化</b>和<b class='flag-5'>深度</b><b class='flag-5'>学习</b>

    深度学习框架pytorch入门与实践

    深度学习框架pytorch入门与实践 深度学习是机器学习中的一个分支,它使用多层神经网络对大量数
    的头像 发表于 08-17 16:03 1205次阅读

    深度学习框架pytorch介绍

    深度学习框架pytorch介绍 PyTorch是由Facebook创建的开源机器学习框架,其中TensorFlow是完全基于数据流图的。它是
    的头像 发表于 08-17 16:10 1152次阅读