​时间序列预测(五)——优化器(Optimizer)、学习率

部署运行你感兴趣的模型镜像

目录

学习率的类型:

1、批量梯度下降(Batch Gradient Descent, BGD)

2、小批量梯度下降(Mini-Batch Gradient Descent, MBGD)

3、随机梯度下降(SGD)(最常见的优化器之一)

4. 带动量的 SGD(SGD with Momentum)

5、Nesterov 动量加速(Nesterov Accelerated Gradient, NAG)

6、AdaGrad(Adaptive Gradient Algorithm)

7、 RMSProp(Root Mean Square Propagation均方根传播)

8、Adam(Adaptive Moment Estimation自适应矩估计)(适合大部分任务,是通用优化器。)

9、 AdamW(Adam with Weight Decay)

10、RAdam(Rectified Adam)

11、LAMB(Layer-wise Adaptive Moments optimizer for Batch training)

12、Lookahead


参考文章:

常用的优化器合集_优化器有哪些-优快云博客

在讲解之前,有一个概念:学习率!

学习率(Learning Rate, lr)是深度学习模型训练中至关重要的超参数,在使用优化器(如 SGD、Adam 等)时,学习率决定了模型在每次迭代中参数的调整幅度。较大的学习率可以加速收敛,但可能会导致模型错过全局最优点甚至发散;较小的学习率则收敛较慢,但能更精细地逼近全局最优点。合适的学习率能够让模型在合理的时间内达到最优性能。

学习率的类型:

  • 常数学习率:在整个训练过程中保持学习率不变。例如 lr=0.01

  • 自适应学习率:随着训练进展自动调整学习率(如在 Adam、RMSprop 中)。

  • 学习率调度器:根据设定规则逐步衰减学习率,例如每隔若干轮训练减少一半学习率,或在达到特定条件后调整学习率。如 StepLRExponentialLR,可以结合使用。例如

    # 常数学习率
    optimizer = optim.SGD(model.parameters(), lr=0.01)
    
    # 使用学习率调度器
    scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)
    # 其中 step_size 表示每 10 轮训练后学习率缩小为原来的 10%
    

优化器用于更新神经网络的权重,以减少或最小化损失函数(loss function)的值以提高模型准确性,同时,优化器还能根据损失函数的梯度调整学习速率,帮助模型更好地学习,避免在训练过程中陷入局部最小值。下面是常见的优化器。

1、批量梯度下降(Batch Gradient Descent, BGD)

原理:在每次迭代中,利用整个训练集计算一次梯度,然后更新参数。其更新公式如下:

优缺点:梯度估计精确,收敛稳定。但每次迭代都使用整个训练集,计算代价高,不适合大规模数据。

PyTorch 实现: 在实际中,PyTorch 的 DataLoader 可以灵活设置 batch_size,批量梯度下降一般会使用一个较大的 batch_size,如 batch_size = len(dataset)

2、小批量梯度下降(Mini-Batch Gradient Descent, MBGD)

原理:在每次迭代中,随机抽取一个小批量(mini-batch)数据来计算梯度,再更新参数。更新公式为:

优缺点:计算效率高,适合大规模数据;平衡了 SGD 的噪声和 BGD 的计算量。但对小批量大小较为敏感,不同批次之间的更新方向可能不一致,可能造成震荡。

PyTorch 使用: 在 PyTorch 中,可以通过 DataLoader 设置 batch_size 来实现小批量梯度下降。常用的小批量大小为 16、32 或 64:

from torch.utils.data import DataLoader  # 导入 PyTorch 的 DataLoader 类,用于数据加载

# 创建数据加载器 train_loader
train_loader = DataLoader(
    dataset,        # 数据集对象,包含所有样本和标签
    batch_size=32,  # 每批次加载 32 个样本,设置适合的批次大小可平衡内存使用和计算效率
    shuffle=True    # 是否在每个 epoch 前随机打乱数据集,shuffle=True 能提升模型的泛化能力
)

在训练过程中,通常会在循环中按小批量处理数据。例如:

for inputs, labels in train_loader:  # 遍历数据加载器,每次迭代获取一批次数据(inputs)及其标签(labels)
    optimizer.zero_grad()           # 清零上一轮的梯度信息,避免梯度累积影响当前梯度计算
    
    outputs = model(inputs)         # 前向传播:将输入数据传入模型,获取预测输出(outputs)
    
    loss = criterion(outputs, labels)  # 计算损失:使用损失函数(criterion)计算预测值和真实值之间的误差
    
    loss.backward()                 # 反向传播:计算损失对模型参数的梯度
    
    optimizer.step()                # 更新参数:利用优化器根据梯度信息更新模型参数

3、随机梯度下降(SGD)(最常见的优化器之一

原理:每次更新参数时,使用当前数据的梯度。更新公式如下:

优缺点:简单易用,但当梯度方向变化较大时,容易在局部最小值陷入震荡。

PyTorch 使用

import torch.optim as optim  # 导入 PyTorch 的优化器模块

# 使用随机梯度下降(SGD)优化器创建模型参数的优化器
optimizer = optim.SGD(
    model.parameters(),  # 指定需要优化的参数,即模型的所有参数
    lr=0.01              # 设置学习率(learning rate),控制每次参数更新的步长,较小的学习率有助于稳定收敛
)

4. 带动量的 SGD(SGD with Momentum)

原理:在 SGD 基础上增加了动量(Momentum),通过累计梯度变化,提升梯度在相同方向上的速度,减缓垂直方向的震荡。更新公式如下:

优点:加速收敛,减缓震荡,适合处理有噪声的梯度。

PyTorch 使用

optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

5、Nesterov 动量加速(Nesterov Accelerated Gradient, NAG)

原理:相比普通动量 SGD,NAG 会先根据当前速度估计一个位置,再计算该位置的梯度,用这个梯度更新参数,使优化更精确。更新公式如下:

优点:在梯度方向快速变化的情况下,NAG 比普通动量能更早感知梯度变化,从而更准确地更新。

 PyTorch 使用

import torch.optim as optim  # 导入 PyTorch 的优化器模块

# 使用 Nesterov 动量加速的随机梯度下降优化器
optimizer = optim.SGD(
    model.parameters(),  # 需要优化的参数,即模型的所有参数
    lr=0.01,             # 设置学习率,决定每次更新的步长
    momentum=0.9,        # 动量系数,用于加速收敛并减少震荡
    nesterov=True        # 启用 Nesterov 动量加速
)

6、AdaGrad(Adaptive Gradient Algorithm)

原理:自适应地调整每个参数的学习率,对于稀疏的参数更新较快。更新公式如下:

优缺点:适合稀疏数据,但会导致学习率不断缩小,可能导致收敛过早。

PyTorch 使用

optimizer = optim.Adagrad(model.parameters(), lr=0.01)

7、 RMSProp(Root Mean Square Propagation均方根传播)

原理:RMSProp 通过指数加权移动平均来控制学习率,使得学习率可以在训练中动态适应。更新公式如下:

优点:适合处理不平衡数据的梯度更新,尤其在 RNN 中效果显著。

PyTorch 使用

optimizer = optim.RMSprop(model.parameters(), lr=0.01, alpha=0.9)
#alpha 是动量项的衰减因子,用于计算梯度的均值平方。
#如果设置过高,可能会导致步长变小,更新速度慢;如果过低,则可能使优化过程不稳定。

8、Adam(Adaptive Moment Estimation自适应矩估计)(适合大部分任务,是通用优化器。)

原理:Adam 结合了动量和 RMSProp 的优势,通过自适应调整学习率。更新公式如下:

优点:适合大型数据集和高维空间,通常是深度学习中的首选优化器。

PyTorch 使用

optimizer = optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999))
#betas 控制两个动量项的指数加权平均,(0.9, 0.999) 是通常的默认值。
#第一个值影响一阶动量(均值),第二个值影响二阶动量(方差)。不同任务中可以根据梯度波动程度适当调整这两个值。

 注意:虽然MSprop 和 Adam 确实是自适应学习率算法,因为它们会根据每个参数的梯度大小来自动调整步长。然而,设置 lr(学习率)仍然很重要,因为它决定了这些自适应调整的整体步长的基准。因为自适应学习率只是相对调整每个参数的步长,lr 决定的是这些调整在整体上的放大或缩小。例如,lr=0.01 表示所有的自适应步长都会以 0.01 为基础放大或缩小。

9、 AdamW(Adam with Weight Decay)

原理:在 Adam 基础上加入了权重衰减(weight decay),用于正则化(但不是 L2 正则化),减轻过拟合。更新过程与 Adam 类似,但对每次更新的参数施加权重衰减。AdamW 在许多深度学习任务中表现优于 Adam。

PyTorch 使用

optimizer = optim.AdamW(model.parameters(), lr=0.001, weight_decay=0.01)

   

10、RAdam(Rectified Adam)

原理:RAdam 是 Adam 的一种变体,通过调整学习率来适应当前的训练步数,避免了 Adam 中因初始学习率过大带来的不稳定性。更新公式如下:优点:适用于需要更稳定收敛的模型训练场景。

PyTorch 实现:需要安装 torch-optimizer 库。

from torch_optimizer import RAdam
optimizer = RAdam(model.parameters(), lr=0.001)

11、LAMB(Layer-wise Adaptive Moments optimizer for Batch training)

原理:LAMB 针对大批量数据设计,适合处理大规模分布式训练,尤其在 BERT 等大规模预训练模型中效果显著。更新公式如下:优点:在不牺牲精度的情况下可以使用更大批次的训练,提高计算效率。

PyTorch 实现:需要安装 torch-optimizer 库。

from torch_optimizer import Lamb
optimizer = Lamb(model.parameters(), lr=0.001)

12、Lookahead

原理:Lookahead 在已有优化器的基础上增加了“慢更新”和“快更新”机制,使得模型在解空间中进行更稳定的探索,有助于减少过拟合。

更新公式如下:优点:可以提高模型训练的稳定性和泛化能力。

PyTorch 实现:可以结合其他优化器(例如 Adam)使用。

from torch_optimizer import Lookahead
base_optimizer = optim.Adam(model.parameters(), lr=0.001)
optimizer = Lookahead(base_optimizer=base_optimizer, k=5, alpha=0.5)

 别忘了给这篇文章点个赞哦,非常感谢。我也正处于学习的过程,可能会有错,如果有问题,欢迎在评论区留言讨论,一起学习!

a89ae1f052204243ad7682a9c9d8732f.png

您可能感兴趣的与本文相关的镜像

PyTorch 2.6

PyTorch 2.6

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

<think>好的,用户想了解如何使用LSTM模型进行时间序列预测,特别是需要示例代码。首先,我需要回忆LSTM的基本原理和它在时间序列中的应用。LSTM适合处理序列数据,因为它能捕捉长期依赖关系,这对于时间序列预测很重要。 接下来,用户可能需要一个简单的代码示例,所以应该用PyTorch来实现,因为之前提到的引用里提到了PyTorch。需要分步骤讲解,包括模型定义、数据处理和训练预测。 模型定义部分,要确保LSTM层的输入输出维度正确。比如,输入特征数量、隐藏层大小、层数,以及全连接层。要注意LSTM的输出是每个时间步的隐藏状态,可能只需要最后一个时间步的输出进行预测,所以代码中要取最后一个时间步的输出。 数据准备部分,需要生成示例数据,可能用正弦波加上噪声。然后要创建滑动窗口的数据集,把时间序列分成多个样本,每个样本包含seq_length个时间点作为输入,下一个时间点作为标签。需要转换成张量,并分训练集和测试集。 数据加载可能需要使用DataLoader来处理批量数据,设置合适的batch_size和是否打乱。 训练过程需要定义损失函数和优化器,循环多个epoch,前向传播、计算损失、反向传播和优化。还要注意将数据转换为LSTM需要的三维输入(batch_size, seq_length, input_size)。 预测部分,模型要切换到评估模式,用测试数据生成预测结果,并和真实值一起画图显示效果。 用户可能还会关心参数调整,比如序列长度、隐藏层大小、学习率的影响。需要提到这些超参数的作用,以及如何根据数据调整。 另外,可能需要提醒数据预处理的重要性,比如归一化,但示例里为了简单可能没有做,实际应用时应该考虑。还可以提到进一步优化的方向,比如增加层数、调整超参数、使用更复杂的数据集,或者添加正则化防止过拟合。 最后,要确保代码示例正确,没有语法错误,并且关键步骤有注释。同时,回答结构要清晰,分步骤讲解,让用户能一步步跟着实现。</think>以下是通过PyTorch实现LSTM时间序列预测的完整指南,包含代码实现和关键原理说明: ### 一、模型定义 LSTM模型需要包含三个核心组件: $$h_t = \tanh(W_{hh}h_{t-1} + W_{xh}x_t + b_h)$$ $$C_t = f_t \odot C_{t-1} + i_t \odot g_t$$ $$o_t = \sigma(W_{ho}h_{t-1} + W_{xo}x_t + b_o)$$ ```python import torch import torch.nn as nn class LSTMForecaster(nn.Module): def __init__(self, input_size=1, hidden_size=64, output_size=1, num_layers=2): super().__init__() self.lstm = nn.LSTM( input_size=input_size, hidden_size=hidden_size, num_layers=num_layers, batch_first=True ) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): # x shape: (batch_size, seq_length, input_size) out, (hn, cn) = self.lstm(x) # out包含所有时间步的输出 last_out = out[:, -1, :] # 取最后一个时间步的输出 prediction = self.fc(last_out) return prediction ``` ### 二、数据准备 时间序列预测的关键数据格式: $$X = [x_t, x_{t+1}, ..., x_{t+n-1}] \rightarrow Y = x_{t+n}$$ ```python import numpy as np # 生成示例数据(正弦波+噪声) time = np.arange(0, 100, 0.1) data = np.sin(time) + np.random.normal(0, 0.1, len(time)) # 创建滑动窗口数据集 def create_dataset(data, seq_length=10): X, y = [], [] for i in range(len(data)-seq_length): X.append(data[i:i+seq_length]) y.append(data[i+seq_length]) return np.array(X), np.array(y) seq_length = 20 X, y = create_dataset(data, seq_length) # 转换为PyTorch张量 X_tensor = torch.FloatTensor(X).unsqueeze(-1) # 增加特征维度 y_tensor = torch.FloatTensor(y).unsqueeze(-1) # 划分训练测试集 train_size = int(0.8 * len(X)) train_X, test_X = X_tensor[:train_size], X_tensor[train_size:] train_y, test_y = y_tensor[:train_size], y_tensor[train_size:] ``` ### 三、模型训练 ```python from torch.utils.data import DataLoader # 超参数设置 EPOCHS = 100 BATCH_SIZE = 32 LEARNING_RATE = 0.001 # 初始化模型 model = LSTMForecaster() criterion = nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(), lr=LEARNING_RATE) # 创建数据加载器 train_data = DataLoader(list(zip(train_X, train_y)), batch_size=BATCH_SIZE, shuffle=True) # 训练循环 for epoch in range(EPOCHS): for batch_X, batch_y in train_data: outputs = model(batch_X) loss = criterion(outputs, batch_y) optimizer.zero_grad() loss.backward() optimizer.step() if (epoch+1) % 10 == 0: print(f'Epoch [{epoch+1}/{EPOCHS}], Loss: {loss.item():.4f}') ``` ### 四、预测与评估 ```python model.eval() with torch.no_grad(): test_pred = model(test_X) # 反归一化(如果进行了归一化) # 可视化结果 import matplotlib.pyplot as plt plt.figure(figsize=(12,6)) plt.plot(test_y.numpy(), label='True Values') plt.plot(test_pred.numpy(), label='Predictions') plt.legend() plt.show() ``` ### 、关键参数说明 1. `seq_length`:时间窗口长度,决定模型观察历史数据的范围 2. `hidden_size`:LSTM隐藏层维度,影响模型复杂度 3. `num_layers`:堆叠LSTM层数,增强模型表达能力 4. `batch_size`:影响梯度更新频率和内存占用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值