深度学习实战(基于pytroch)系列(四十四) 优化与深度学习

优化与深度学习

本节将讨论优化与深度学习的关系,以及优化在深度学习中的挑战。在一个深度学习问题中,我们通常会预先定义一个损失函数。有了损失函数以后,我们就可以使用优化算法试图将其最小化。在优化中,这样的损失函数通常被称作优化问题的目标函数(objective function)。依据惯例,优化算法通常只考虑最小化目标函数。其实,任何最大化问题都可以很容易地转化为最小化问题,只需令目标函数的相反数为新的目标函数即可。

优化与深度学习的关系

虽然优化为深度学习提供了最小化损失函数的方法,但本质上,优化与深度学习的目标是有区别的。在模型训练过程中,我们区分了训练误差和泛化误差。由于优化算法的目标函数通常是一个基于训练数据集的损失函数,优化的目标在于降低训练误差。而深度学习的目标在于降低泛化误差。为了降低泛化误差,除了使用优化算法降低训练误差以外,还需要注意应对过拟合。这里我们只关注优化算法在最小化目标函数上的表现,而不关注模型的泛化误差。

优化在深度学习中的挑战

在之前的讨论中,我们对优化问题的解析解和数值解做了区分。深度学习中绝大多数目标函数都很复杂。因此,很多优化问题并不存在解析解,而需要使用基于数值方法的优化算法找到近似解,即数值解。本节中讨论的优化算法都是这类基于数值方法的算法。为了求得最小化目标函数的数值解,我们将通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。

优化在深度学习中有很多挑战。下面描述了其中的两个挑战,即局部最小值和鞍点。为了更好地描述问题,我们先导入本节中实验需要的包或模块。

python 复制代码
import matplotlib.pyplot as plt
import torch
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

# 设置绘图样式
plt.rcParams['figure.figsize'] = (4.5, 2.5)

局部最小值

对于目标函数 f ( x ) f(x) f(x),如果 f ( x ) f(x) f(x) 在 x x x 上的值比在 x x x 邻近的其他点的值更小,那么 f ( x ) f(x) f(x) 可能是一个局部最小值(local minimum)。如果 f ( x ) f(x) f(x) 在 x x x 上的值是目标函数在整个定义域上的最小值,那么 f ( x ) f(x) f(x) 是全局最小值(global minimum)。

举个例子,给定函数

f ( x ) = x ⋅ cos ⁡ ( π x ) , − 1.0 ≤ x ≤ 2.0 , f(x) = x \cdot \cos(\pi x), \quad -1.0 \leq x \leq 2.0, f(x)=x⋅cos(πx),−1.0≤x≤2.0,

我们可以大致找出该函数的局部最小值和全局最小值的位置。需要注意的是,图中箭头所指示的只是大致位置。

python 复制代码
def f(x):
    return x * torch.cos(torch.pi * x)

x = torch.arange(-1.0, 2.0, 0.1)
y = f(x)

plt.plot(x.numpy(), y.numpy())
plt.annotate('local minimum', xy=(-0.3, -0.25), xytext=(-0.77, -1.0),
             arrowprops=dict(arrowstyle='->'))
plt.annotate('global minimum', xy=(1.1, -0.95), xytext=(0.6, 0.8),
             arrowprops=dict(arrowstyle='->'))
plt.xlabel('x')
plt.ylabel('f(x)')
plt.show()

深度学习模型的目标函数可能有若干局部最优值。当一个优化问题的数值解在局部最优解附近时,由于目标函数有关解的梯度接近或变成零,最终迭代求得的数值解可能只令目标函数局部最小化而非全局最小化。

鞍点

刚刚我们提到,梯度接近或变成零可能是由于当前解在局部最优解附近造成的。事实上,另一种可能性是当前解在鞍点(saddle point)附近。

举个例子,给定函数

f ( x ) = x 3 , f(x) = x^3, f(x)=x3,

我们可以找出该函数的鞍点位置。

python 复制代码
x = torch.arange(-2.0, 2.0, 0.1)
y = x**3

plt.plot(x.numpy(), y.numpy())
plt.annotate('saddle point', xy=(0, -0.2), xytext=(-0.52, -5.0),
             arrowprops=dict(arrowstyle='->'))
plt.xlabel('x')
plt.ylabel('f(x)')
plt.show()

再举个定义在二维空间的函数的例子,例如:

f ( x , y ) = x 2 − y 2 . f(x, y) = x^2 - y^2. f(x,y)=x2−y2.

我们可以找出该函数的鞍点位置。也许你已经发现了,该函数看起来像一个马鞍,而鞍点恰好是马鞍上可坐区域的中心。

python 复制代码
x = torch.linspace(-1, 1, 31)
y = torch.linspace(-1, 1, 31)
X, Y = torch.meshgrid(x, y)
Z = X**2 - Y**2

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_wireframe(X.numpy(), Y.numpy(), Z.numpy(), rstride=2, cstride=2)
ax.plot([0], [0], [0], 'rx', markersize=10)
ticks = [-1, 0, 1]
plt.xticks(ticks)
plt.yticks(ticks)
ax.set_zticks(ticks)
plt.xlabel('x')
plt.ylabel('y')
plt.show()

在图的鞍点位置,目标函数在 x x x 轴方向上是局部最小值,但在 y y y 轴方向上是局部最大值。

假设一个函数的输入为 k k k 维向量,输出为标量,那么它的海森矩阵(Hessian matrix)有 k k k 个特征值。该函数在梯度为0的位置上可能是局部最小值、局部最大值或者鞍点。

  • 当函数的海森矩阵在梯度为零的位置上的特征值全为正时,该函数得到局部最小值。
  • 当函数的海森矩阵在梯度为零的位置上的特征值全为负时,该函数得到局部最大值。
  • 当函数的海森矩阵在梯度为零的位置上的特征值有正有负时,该函数得到鞍点。

随机矩阵理论告诉我们,对于一个大的高斯随机矩阵来说,任一特征值是正或者是负的概率都是0.5。那么,以上第一种情况的概率为 0. 5 k 0.5^k 0.5k。由于深度学习模型参数通常都是高维的( k k k 很大),目标函数的鞍点通常比局部最小值更常见。

在深度学习中,虽然找到目标函数的全局最优解很难,但这并非必要。我们将在本章接下来的几节中逐一介绍深度学习中常用的优化算法,它们在很多实际问题中都能够训练出十分有效的深度学习模型。

小结

  • 由于优化算法的目标函数通常是一个基于训练数据集的损失函数,优化的目标在于降低训练误差。
  • 由于深度学习模型参数通常都是高维的,目标函数的鞍点通常比局部最小值更常见。

本系列目录链接

深度学习实战(基于pytroch)系列(一)环境准备
深度学习实战(基于pytroch)系列(二)数学基础
深度学习实战(基于pytroch)系列(三)数据操作
深度学习实战(基于pytroch)系列(四)线性回归原理及实现
深度学习实战(基于pytroch)系列(五)线性回归的pytorch实现
深度学习实战(基于pytroch)系列(六)softmax回归原理
深度学习实战(基于pytroch)系列(七)softmax回归从零开始使用python代码实现
深度学习实战(基于pytroch)系列(八)softmax回归基于pytorch的代码实现
深度学习实战(基于pytroch)系列(九)多层感知机原理
深度学习实战(基于pytroch)系列(十)多层感知机实现
深度学习实战(基于pytroch)系列(十一)模型选择、欠拟合和过拟合
深度学习实战(基于pytroch)系列(十二)dropout
深度学习实战(基于pytroch)系列(十三)权重衰减
深度学习实战(基于pytroch)系列(十四)正向传播、反向传播
深度学习实战(基于pytroch)系列(十五)模型构造
深度学习实战(基于pytroch)系列(十六)模型参数
深度学习实战(基于pytroch)系列(十七)自定义层
深度学习实战(基于pytroch)系列(十八) PyTorch中的模型读取和存储
深度学习实战(基于pytroch)系列(十九) PyTorch的GPU计算
深度学习实战(基于pytroch)系列(二十)二维卷积层
深度学习实战(基于pytroch)系列(二十一)卷积操作中的填充和步幅
深度学习实战(基于pytroch)系列(二十二)多通道输入输出
深度学习实战(基于pytroch)系列(二十三)池化层
深度学习实战(基于pytroch)系列(二十四)卷积神经网络(LeNet)
深度学习实战(基于pytroch)系列(二十五)深度卷积神经网络(AlexNet)
深度学习实战(基于pytroch)系列(二十六)VGG
深度学习实战(基于pytroch)系列(二十七)网络中的网络(NiN)
深度学习实战(基于pytroch)系列(二十八)含并行连结的网络(GoogLeNet)
深度学习实战(基于pytroch)系列(二十九)批量归一化(batch normalization)
深度学习实战(基于pytroch)系列(三十) 残差网络(ResNet)
深度学习实战(基于pytroch)系列(三十一) 稠密连接网络(DenseNet)
深度学习实战(基于pytroch)系列(三十二) 语言模型
深度学习实战(基于pytroch)系列(三十三)循环神经网络RNN
深度学习实战(基于pytroch)系列(三十四)语言模型数据集(周杰伦专辑歌词)
深度学习实战(基于pytroch)系列(三十五)循环神经网络的从零开始实现
深度学习实战(基于pytroch)系列(三十六)循环神经网络的pytorch简洁实现
深度学习实战(基于pytroch)系列(三十七)通过时间反向传播
深度学习实战(基于pytroch)系列(三十八)门控循环单元(GRU)从零开始实现
深度学习实战(基于pytroch)系列(三十九)门控循环单元(GRU)pytorch简洁实现
深度学习实战(基于pytroch)系列(四十)长短期记忆(LSTM)从零开始实现
深度学习实战(基于pytroch)系列(四十一)长短期记忆(LSTM)pytorch简洁实现
深度学习实战(基于pytroch)系列(四十二)双向循环神经网络pytorch实现
深度学习实战(基于pytroch)系列(四十三)深度循环神经网络pytorch实现
深度学习实战(基于pytroch)系列(四十四) 优化与深度学习

相关推荐
sali-tec1 小时前
C# 基于halcon的视觉工作流-章65 点云匹配-基于形状
开发语言·人工智能·算法·计算机视觉·c#
科学最TOP1 小时前
时间序列的“语言”:从语言模型视角理解时序基础模型
人工智能·深度学习·机器学习·时间序列
白日做梦Q1 小时前
深度学习训练中 Loss 为 Nan 的 10 种原因及解决方案
人工智能·深度学习
组合缺一1 小时前
Solon AI 开发学习8 - chat - Vision(理解)图片、声音、视频
java·人工智能·学习·ai·音视频·solon
星空的资源小屋1 小时前
Explorer++:更强大的Windows文件管理器
javascript·人工智能·django·电脑
AI科技星1 小时前
自然本源——空间元、氢尺、探针与场方程
数据结构·人工智能·算法·机器学习·计算机视觉
DatGuy1 小时前
Week 27: 机器学习补遗:XGBoost
人工智能·机器学习
玖日大大2 小时前
Mobile-Agent-基于多模态大模型(MLLM)的视觉驱动型GUI智能体
人工智能