Pytorch 梯度下降算法【5/9】超前预测梯度下降(Nesterov Accelerated Gradient)
定义
在 PyTorch 中,超前预测下降算法Nesterov Accelerated Gradient(NAG)是动量梯度下降法(Momentum Gradient Descent)的一种改进版本。NAG 在计算梯度时引入了一个“超前预测”的步骤,以更准确地估计下一步的梯度方向。这有助于改进动量梯度下降法在参数更新时的准确性和收敛速度。
动量梯度下降公式
小批量梯度下降于动量梯度下降的区别
由于mini-batch每次仅使用数据集中的一部分进行梯度下降,所以每次下降并不是严格按照朝最小方向下降,但是总体下降趋势是朝着最小方向,上图可以明显看出两者之间的区别。
对右边的图来说,动量梯度下降法并没有什么用处。梯度批量下降法主要是针对mini-batch梯度下降法进行优化,优化之后左右的摆动减小,从而提高效率。优化前后的对比如下图,可见动量梯度下降法的摆动明显减弱。
案例实战
下面我将通过一个简单的线性回归问题来演示如何在 PyTorch 中使用 Nesterov Accelerated Gradient。
首先,我们需要导入 PyTorch 库并准备数据:
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
# 随机生成一些简单的线性数据
np.random.seed(42)
X = np.random.rand(100, 1) # 100个输入样本
y = 2 * X + 1 + 0.1 * np.random.randn(100, 1) # 添加随机噪声的目标输出
接下来,我们定义一个简单的线性模型,并使用 Nesterov Accelerated Gradient 进行优化:
# 将数据转换为 PyTorch 张量
X_tensor = torch.tensor(X, dtype=torch.float32)
y_tensor = torch.tensor(y, dtype=torch.float32)
# 定义线性模型
class LinearModel(nn.Module):
def __init__(self):
super(LinearModel, self).__init__()
self.linear = nn.Linear(1, 1) # 输入特征数为1,输出特征数为1
def forward(self, x):
return self.linear(x)
# 创建模型实例和优化器
model = LinearModel()
criterion = nn.MSELoss() # 使用均方误差损失函数
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9, nesterov=True) # 使用 NAG
# 进行模型训练
num_epochs = 100
for epoch in range(num_epochs):
# 清零梯度
optimizer.zero_grad()
# 提前根据当前动量的方向进行预测(NAG独有的步骤)
with torch.no_grad():
y_pred_ahead = model(X_tensor - optimizer.param_groups[0]['momentum'] * optimizer.state[model.parameters()][0])
# 前向传播
y_pred = model(X_tensor + optimizer.param_groups[0]['momentum'] * (X_tensor - optimizer.param_groups[0]['momentum'] * y_pred_ahead))
# 计算损失
loss = criterion(y_pred, y_tensor)
# 反向传播
loss.backward()
# 更新参数
optimizer.step()
if (epoch + 1) % 10 == 0:
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
# 打印训练后的模型参数
print("训练后的模型参数:", model.state_dict())
在上述代码中,我们使用了 torch.optim.SGD
创建了一个 Nesterov Accelerated Gradient 的优化器,并将其应用于训练过程中。通过在创建优化器时指定 momentum
参数为0.9,并设置 nesterov=True
,我们启用了 Nesterov Accelerated Gradient。在每次参数更新时,NAG 首先根据当前动量的方向进行预测,然后利用预测的方向进行参数更新,这有助于更准确地估计下一步的梯度方向,从而改进了动量梯度下降法在参数更新时的准确性和收敛速度。NAG 通常能够加速收敛,并在某些情况下表现更优秀。
- 点赞
- 收藏
- 关注作者
评论(0)