机器学习详解(10):优化器optimizer总结

激活函数决定了模型的表达能力,通过非线性变换使神经网络能够拟合复杂的函数关系;而**优化器(optimizer)**则是训练神经网络的关键驱动力,它直接影响模型的收敛速度和最终性能。优化器通过调整模型参数以最小化损失函数,决定了神经网络在给定数据上的学习效率和效果。

1 优化器的引入

在深度学习中,优化器是训练神经网络的核心驱动力之一,它通过调整模型的权重和偏置参数,使损失函数逐步减小,从而使模型更好地拟合数据。优化器的选择直接影响模型的收敛速度、稳定性以及最终性能。从本质上讲,优化器定义了如何调整参数以接近损失函数的最小值,是寻找模型最优参数的关键工具。它在输入数据后计算误差,并据此更新参数,显著减少误差函数,推动模型朝最优解迈进。

优化器的重要性体现在以下几个方面:

  1. 影响收敛速度:优化器决定了模型在训练过程中更新参数的方式,直接影响训练的效率和收敛时间。例如,使用自适应学习率的优化器(如 Adam)通常比标准梯度下降更快。
  2. 提升模型性能:合适的优化器能够帮助模型更好地找到全局最优解或较优的局部最优解,从而提高预测性能。
  3. 应对数据复杂性:在高维数据和复杂模型中,优化器需要有效地应对梯度消失、梯度爆炸等问题,确保训练过程稳定。
  4. 适应多样任务:不同的任务和数据特性需要不同的优化器来满足特定需求,例如 Adagrad 擅长处理稀疏数据,而 RMSprop 对非平稳目标函数表现更好。

通过选择和调整合适的优化器,可以显著提升深度学习模型的效率和性能,使其在实际应用中更加高效可靠。

2 常见优化器

许多类型的优化器可用于训练机器学习模型,每种优化器都有其独特的优点和缺点。一些优化器更适合特定类型的模型或数据,而另一些则是通用型的优化器。

2.1 梯度下降法(Gradient Descent)

梯度下降是一种简单的优化算法,通过更新模型的参数以最小化损失函数。其基本形式如下:

θ = θ − α ⋅ ∇ θ L ( θ ) \theta = \theta - \alpha \cdot \nabla_\theta L(\theta) θ=θαθL(θ)

其中, θ \theta θ 表示模型参数, L ( θ ) L(\theta) L(θ) 是损失函数, α \alpha α 是学习率。

在这里插入图片描述

优点:实现简单,在学习率调整良好的情况下表现良好。

缺点

  • 对于复杂模型或大数据集,收敛速度较慢。
  • 对学习率的选择较为敏感。

2.2 随机梯度下降(Stochastic Gradient Descent, SGD)

随机梯度下降是梯度下降的一种变体,它基于**单个样本(随机抽取的数据点)**随机更新参数,而不是整个数据集。

θ = θ − α ⋅ ∇ θ L ( θ ; x ( i ) , y ( i ) ) \theta = \theta - \alpha \cdot \nabla_\theta L(\theta; x^{(i)}, y^{(i)}) θ=θαθL(θ;x(i),y(i))

其中, ( x ( i ) , y ( i ) ) (x^{(i)}, y^{(i)}) (x(i),y(i)) 是单个样本的数据。

在这里插入图片描述

优点:

  • 对于大数据集,计算效率更高。
  • 更容易摆脱局部最小值。

缺点:

  • 可能产生噪声,导致稳定性较差。
  • 需要更多的超参数调整以获得良好的性能。

2.3 带动量的随机梯度下降 (SGD with Momentum)

带动量的 SGD 是 SGD 的一种变体,通过在更新规则中添加“动量”项,当前的更新不仅依赖于当前梯度,还包括之前更新的趋势。这样,优化器能够即使在局部梯度较小或者震荡时也能继续沿相同方向移动。更新规则如下:

v = β ⋅ v + ( 1 − β ) ⋅ ∇ θ L ( θ ; x ( i ) , y ( i ) ) v = \beta \cdot v + (1 - \beta) \cdot \nabla_\theta L(\theta; x^{(i)}, y^{(i)}) v=βv+(1β)θL(θ;x(i),y(i))

θ = θ − α ⋅ v \theta = \theta - \alpha \cdot v θ=θαv

其中:

  • v v v 是动量向量,表示累积的更新方向。
  • ∇ θ L ( θ ) \nabla_\theta L(\theta) θL(θ) 是当前梯度。
  • β \beta β 是动量系数,通常取值范围为 0 ≤ β < 1 0 \leq \beta < 1 0β<1,常见值为 0.9。

在这里插入图片描述

优点:

  • 有助于优化器更高效地通过损失函数的“平坦”区域。
  • 能减少振荡并改善收敛性。

缺点:

  • 动量过大会导致错过较好的解,停留在次优解。
  • 需要对动量超参数进行调优。

2.4 小批量梯度下降 (Mini-Batch Gradient Descent)

小批量梯度下降类似于 SGD,但它使用一个固定大小的小批量数据(mini-batch)计算梯度,而不是使用单个样本。更新规则与 SGD 相同,只是梯度在小批量中取平均值。

在这里插入图片描述

优点:

  • 对于大数据集,计算效率高。
  • 减少更新中的噪声,提升收敛稳定性。

缺点:

  • 对 mini-batch 大小的选择较为敏感。

2.5 Adagrad

Adagrad 是一种自适应学习率优化算法,每个参数的学习率会根据历史梯度信息进行调整。更新规则如下:

g = ∇ θ L ( θ ; x ( i ) , y ( i ) ) g = \nabla_\theta L(\theta; x^{(i)}, y^{(i)}) g=θL(θ;x(i),y(i))

G = G + g ⊙ g G = G + g \odot g G=G+gg

θ = θ − α G + ϵ ⊙ g \theta = \theta - \frac{\alpha}{\sqrt{G} + \epsilon} \odot g θ=θG +ϵαg

其中, G G G 是累积梯度平方的矩阵, ϵ \epsilon ϵ 是一个小常数,用于防止被零除。

优点:

  • 能很好地处理稀疏数据。
  • 根据参数更新自动调整学习率。

缺点:

  • 对某些问题收敛速度较慢。
  • 如果学习率变得太小,可能会停止学习。

2.6 RMSProp

RMSProp 是类似于 Adagrad 的优化算法,但它使用梯度平方的指数衰减平均而非累积和。更新规则如下:

g = ∇ θ L ( θ ; x ( i ) , y ( i ) ) g = \nabla_\theta L(\theta; x^{(i)}, y^{(i)}) g=θL(θ;x(i),y(i))

G = β ⋅ G + ( 1 − β ) ⋅ g ⊙ g G = \beta \cdot G + (1 - \beta) \cdot g \odot g G=βG+(1β)gg

θ = θ − α G + ϵ ⊙ g \theta = \theta - \frac{\alpha}{\sqrt{G} + \epsilon} \odot g θ=θG +ϵαg

其中, G G G 是累积梯度平方的矩阵, ϵ \epsilon ϵ 是一个小常数, β \beta β 是衰减率超参数。

优点:

  • 能很好地处理稀疏数据。
  • 根据参数更新自动调整学习率。
  • 收敛速度比 Adagrad 更快。

缺点:

  • 对某些问题收敛速度仍可能较慢。
  • 需要对衰减率超参数进行调优。

2.7 AdaDelta

AdaDelta 是一种类似于 RMSProp 的优化算法,但不需要学习率这一超参数。它通过对梯度和梯度平方的指数衰减平均来确定更新的尺度。更新规则如下:

g = ∇ θ L ( θ ; x ( i ) , y ( i ) ) g = \nabla_\theta L(\theta; x^{(i)}, y^{(i)}) g=θL(θ;x(i),y(i))

G = β ⋅ G + ( 1 − β ) ⋅ g ⊙ g G = \beta \cdot G + (1 - \beta) \cdot g \odot g G=βG+(1β)gg

Δ θ = − S + ϵ G + ϵ ⊙ g \Delta \theta = - \frac{\sqrt{S + \epsilon}}{\sqrt{G + \epsilon}} \odot g Δθ=G+ϵ S+ϵ g

S = β ⋅ S + ( 1 − β ) ⋅ Δ θ ⊙ Δ θ S = \beta \cdot S + (1 - \beta) \cdot \Delta \theta \odot \Delta \theta S=βS+(1β)ΔθΔθ

θ = θ + Δ θ \theta = \theta + \Delta \theta θ=θ+Δθ

其中, G G G S S S 是分别累积梯度平方和更新平方的矩阵, ϵ \epsilon ϵ 是一个小常数,用于防止除以零。

优点:

  • 能很好地处理稀疏数据。
  • 根据参数更新自动调整学习率。

缺点:

  • 对某些问题收敛速度较慢。
  • 如果学习率变得过小,可能会停止学习。

2.8 Adam(Adaptive Moment Estimation)

Adam是一种结合了 SGD with Momentum 和 RMSProp 思想的优化算法。它通过对梯度和梯度平方的指数衰减平均来确定更新的尺度,并引入动量以更高效地通过损失函数进行优化。更新规则如下:

g = ∇ θ L ( θ ; x ( i ) , y ( i ) ) g = \nabla_\theta L(\theta; x^{(i)}, y^{(i)}) g=θL(θ;x(i),y(i))

m = β 1 ⋅ m + ( 1 − β 1 ) ⋅ g m = \beta_1 \cdot m + (1 - \beta_1) \cdot g m=β1m+(1β1)g

v = β 2 ⋅ v + ( 1 − β 2 ) ⋅ g ⊙ g v = \beta_2 \cdot v + (1 - \beta_2) \cdot g \odot g v=β2v+(1β2)gg

m ^ = m 1 − β 1 t , v ^ = v 1 − β 2 t \hat{m} = \frac{m}{1 - \beta_1^t}, \quad \hat{v} = \frac{v}{1 - \beta_2^t} m^=1β1tm,v^=1β2tv

θ = θ − α v ^ + ϵ ⊙ m ^ \theta = \theta - \frac{\alpha}{\sqrt{\hat{v}} + \epsilon} \odot \hat{m} θ=θv^ +ϵαm^

其中, m m m v v v 分别是动量和速度向量, β 1 \beta_1 β1 β 2 \beta_2 β2 是动量和速度的衰减率超参数。

优点:

  • 收敛速度比其他优化算法更快。
  • 能很好地处理噪声数据。

缺点:

  • 需要调节的超参数比其他算法更多。
  • 对某些问题表现不如其他算法。

2.9 优化器总结

优化器通过调整模型参数来最小化损失函数,从而提高模型的预测能力。它使用损失函数的梯度来确定参数更新的方向,并通过反向传播计算每个模型参数的梯度,进而更新模型的权重。

优化算法通过迭代调整参数,直到损失函数达到最小值或达到允许的最大迭代次数为止。学习率的选择是关键,过低的学习率会导致收敛速度缓慢,而过高的学习率可能导致训练不稳定或无法收敛。

在这里插入图片描述

以下是上面介绍的优化器的总结:

方法适用场景
梯度下降法小型数据集,目标函数平滑、凸优化问题。适用于批量更新参数的场景,计算梯度需要全数据集。
随机梯度下降数据集较大时,适合在线学习任务或实时更新参数的场景;但对学习率的选择较为敏感,可能在收敛性上存在问题。
**带动量的随机梯度下降 **深度网络优化或复杂损失函数的平坦区域,帮助减少振荡,加速收敛。适合需要跨越鞍点或局部极小值的任务。
**小批量梯度下降 **深度学习的主流方法,适合大规模数据集,平衡了计算效率和参数更新稳定性。支持 GPU 并行计算。
Adagrad稀疏数据场景,例如文本处理、自然语言处理任务;特征维度较多且需要对不同参数调整学习率时效果显著。
RMSProp非平稳目标函数(如在线学习)或需要对梯度振荡进行抑制的场景。适合对学习率需要动态调整的任务。
AdaDelta长时间训练任务,不需要手动设置学习率;适合需要稳定更新步长并避免学习率衰减过快的情况。
Adam通用优化器,适用于大多数深度学习任务,尤其是大规模数据集或高维参数优化场景。提供快速收敛效果,适合各种非凸问题。

在实际的深度学习应用中,不一定需要深入理解优化器的数学原理,因为现代优化器已经为大多数任务进行了高度优化。对于初学者和大多数实践者来说,选择一个经过广泛验证的优化器(如 Adam 或 RMSProp)往往足以取得良好的结果。

3 代码中优化器的定义

下面看一下在不同模型的代码中,是如何定义和使用优化器的。

3.1 TensorFlow

参数

优化器数学定义描述
tf.keras.optimizers.SGD θ = θ − α ∇ θ L ( θ ) \theta = \theta - \alpha \nabla_\theta L(\theta) θ=θαθL(θ)随机梯度下降(SGD),基本优化器,通过学习率控制参数更新。
tf.keras.optimizers.Adam θ = θ − α v + ϵ ⋅ m \theta = \theta - \frac{\alpha}{\sqrt{v} + \epsilon} \cdot m θ=θv +ϵαm自适应动量估计(Adam),结合动量和自适应学习率,适合大部分深度学习任务。
tf.keras.optimizers.RMSprop θ = θ − α G + ϵ ⋅ g \theta = \theta - \frac{\alpha}{\sqrt{G} + \epsilon} \cdot g θ=θG +ϵαgRMSProp,适合非平稳目标函数,动态调整学习率。
tf.keras.optimizers.Adagrad θ = θ − α ∑ g 2 + ϵ ⋅ g \theta = \theta - \frac{\alpha}{\sqrt{\sum g^2} + \epsilon} \cdot g θ=θg2 +ϵαgAdagrad,自适应学习率,适合稀疏数据场景。

代码

import tensorflow as tf

# 构建一个简单的神经网络
model = tf.keras.Sequential([
    tf.keras.layers.Dense(128, activation='relu', input_shape=(784,)),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])

# 编译模型,指定优化器
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),  # Adam 优化器
              loss='categorical_crossentropy',  # 多分类交叉熵
              metrics=['accuracy'])

# 打印模型结构
model.summary()

3.2 Keras

参数

优化器数学定义描述
SGD θ = θ − α ∇ θ L ( θ ) \theta = \theta - \alpha \nabla_\theta L(\theta) θ=θαθL(θ)随机梯度下降(SGD),常规优化方法,适用于简单任务。
Adam θ = θ − α v + ϵ ⋅ m \theta = \theta - \frac{\alpha}{\sqrt{v} + \epsilon} \cdot m θ=θv +ϵαmAdam,集成动量和自适应学习率,表现优异。
RMSprop θ = θ − α G + ϵ ⋅ g \theta = \theta - \frac{\alpha}{\sqrt{G} + \epsilon} \cdot g θ=θG +ϵαgRMSProp,专为深度学习设计,动态调整学习率。
Adagrad θ = θ − α ∑ g 2 + ϵ ⋅ g \theta = \theta - \frac{\alpha}{\sqrt{\sum g^2} + \epsilon} \cdot g θ=θg2 +ϵαgAdagrad,针对稀疏数据的自适应学习率优化器。

代码

from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import Adam

# 构建一个简单的神经网络
model = Sequential([
    Dense(128, activation='relu', input_dim=784),
    Dense(64, activation='relu'),
    Dense(10, activation='softmax')
])

# 编译模型,指定优化器
model.compile(optimizer=Adam(learning_rate=0.001),  # Adam 优化器
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# 打印模型结构
model.summary()

3.3 PyTorch

参数

优化器数学定义描述
torch.optim.SGD θ = θ − α ∇ θ L ( θ ) \theta = \theta - \alpha \nabla_\theta L(\theta) θ=θαθL(θ)SGD,经典优化器,适用于简单任务。
torch.optim.Adam θ = θ − α v + ϵ ⋅ m \theta = \theta - \frac{\alpha}{\sqrt{v} + \epsilon} \cdot m θ=θv +ϵαmAdam,结合动量和自适应学习率,适合大规模神经网络。
torch.optim.RMSprop θ = θ − α G + ϵ ⋅ g \theta = \theta - \frac{\alpha}{\sqrt{G} + \epsilon} \cdot g θ=θG +ϵαgRMSProp,动态调整学习率,适合非平稳目标函数。
torch.optim.Adagrad θ = θ − α ∑ g 2 + ϵ ⋅ g \theta = \theta - \frac{\alpha}{\sqrt{\sum g^2} + \epsilon} \cdot g θ=θg2 +ϵαgAdagrad,自适应学习率,适合稀疏数据场景。

代码

import torch
import torch.nn as nn
import torch.optim as optim

# 定义一个简单的神经网络
class SimpleNet(nn.Module):
    def __init__(self):
        super(SimpleNet, self).__init__()
        self.model = nn.Sequential(
            nn.Linear(784, 128),
            nn.ReLU(),
            nn.Linear(128, 64),
            nn.ReLU(),
            nn.Linear(64, 10),
            nn.Softmax(dim=1)
        )
    
    def forward(self, x):
        return self.model(x)

# 初始化网络
net = SimpleNet()

# 定义优化器和损失函数
optimizer = optim.Adam(net.parameters(), lr=0.001)  # 使用 Adam 优化器
loss_fn = nn.CrossEntropyLoss()                    # 多分类交叉熵

# 模拟训练过程
inputs = torch.rand(32, 784)                       # 模拟输入数据
labels = torch.randint(0, 10, (32,))               # 模拟标签

# 前向传播
outputs = net(inputs)
loss = loss_fn(outputs, labels)

# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()

# 打印损失值
print(f"Loss: {loss.item()}")

3.4 注意事项

  • 自动更新学习率是指优化器内部会根据模型的训练过程动态调整学习率,以提高训练效率并避免过大的梯度更新。
  • 代码中的SGD(随机梯度下降)实际上通常是指Mini-Batch Gradient Descent。虽然SGD的理论基础是基于单个数据点(即样本)的梯度更新,但在实践中,为了提高计算效率和稳定性,通常会将数据集划分为小批量(mini-batch),并使用这些小批量数据来计算梯度并更新参数。这样可以在减少计算开销的同时,保留足够的随机性以避免陷入局部最优解。因此,现代深度学习框架中的SGD通常实现的是Mini-Batch Gradient Descent。

4 总结

优化器在深度学习中至关重要,它们通过调整模型的参数来最小化损失函数,从而加速训练过程并提高模型性能。选择合适的优化器取决于具体的任务、数据集特征和模型架构,例如,Adam适用于大部分任务,而SGD则在处理大数据集时更为高效。了解不同优化器的优势和局限,能够帮助开发者在实践中做出最佳选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tilblackout

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值