摘要: 在深度学习的训练过程中,学习率是影响模型性能的关键超参数之一。学习率调节器(Learning Rate Schedulers)是一系列用于动态调整学习率的策略,它们可以帮助模型更快地收敛,提高训练效率,并最终达到更好的性能。本文将探讨学习率调节器的重要性、常见类型以及它们在实际应用中的效果。
引言: 深度学习模型的训练是一个优化问题,目标是最小化损失函数。学习率决定了在每次迭代中参数更新的步长。一个合适的学习率可以加速训练过程,而一个过大或过小的学习率都可能导致训练效率低下或模型性能不佳。因此,如何有效地调节学习率成为了深度学习中的一个研究热点。
学习率调节器的重要性:
- 加速收敛: 动态调整学习率可以帮助模型在训练初期快速收敛,而在训练后期则减小步长,以更细致地逼近最优解。
- 避免局部最小值: 适当的学习率调整策略有助于模型跳出局部最小值,从而找到全局最小值。
- 提高模型性能: 通过优化学习率,可以提高模型在验证集上的性能,减少过拟合的风险。
常见的学习率调节器类型:
- 时间衰减(Time-based Decay): 随着训练时间的增加,学习率按照一定的衰减率逐渐减小。
- 步长衰减(Step Decay): 在训练过程中的特定步骤,学习率会按照预设的比率下降。
- 指数衰减(Exponential Decay): 学习率按照指数函数随时间衰减。
- 余弦退火(Cosine Annealing): 学习率按照余弦函数的变化周期性地降低。
- 学习率预热(Learning Rate Warmup): 在训练初期,学习率从一个较小的值逐渐增加到预定的学习率,有助于模型稳定。
学习率调节器的实际应用: 在实际应用中,学习率调节器的选择和配置需要根据具体的任务和模型结构来决定。例如,在图像识别任务中,可能需要一个较大的初始学习率来快速收敛,而在自然语言处理任务中,则可能需要一个较小的学习率来避免梯度爆炸。
指数衰减法样例
# 学习率调节器
import torch
import numpy as np
import matplotlib.pyplot as plt
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset
from torch.utils.data import random_split
# 数据生成
def f(x,y):
return x**2+2*y**2
# 定义初始值
num_samples = 1000 # 样本数量
X = torch.rand(num_samples) # 均匀分布
Y = torch.rand(num_samples) # 均匀分布
Z = f(X,Y)+3*torch.randn(num_samples) # 加上噪声
dataset = torch.stack([X,Y,Z],dim=1)
# 数据划分 按照7:3
train_size = int(0.7*len(dataset))
test_size = len(dataset) - train_size
train_dataset, test_dataset = random_split(dataset=dataset, lengths=[train_size, test_size])
# 将数据放入 DataLoader
train_loader = DataLoader(TensorDataset(train_dataset.dataset.narrow(1,0,2),train_dataset.dataset.narrow(1,2,1)),batch_size=32,shuffle=True)
test_loader = DataLoader(TensorDataset(test_dataset.dataset.narrow(1,0,2),test_dataset.dataset.narrow(1,2,1)),batch_size=32,shuffle=True)
# 定义模型
class Model(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(2,8) # 输入2维,输出8维
self.fc2 = nn.Linear(8,1) # 输入8维,输出1维
def forward(self,x):
x = torch.relu(self.fc1(x))
return self.fc2(x)
# 设置超参数
num_epochs = 100 # 训练轮数
learning_rate = 0.01 # 学习率
# 定义损失函数
loss_fn = nn.MSELoss()
# 通过一个训练对比有无学习率调节器的效果
for with_scheduler in [False, True]:
# 定义训练和测试误差数组
train_losses = []
test_losses = []
# 定义模型
model = Model()
# 定义优化器
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
# 定义学习率调节器
scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.99)
# 训练模型
for epoch in range(num_epochs):
# 训练
model.train()
train_loss = 0
# 遍历训练集
for inputs,targets in train_loader:
optimizer.zero_grad()
outputs = model(inputs)
loss = loss_fn(outputs,targets)
loss.backward()
optimizer.step()
train_loss += loss.item()
# 计算loss并记录到训练误差数组
train_loss /= len(train_loader)
train_losses.append(train_loss)
# 验证
model.eval()
test_loss = 0
# 遍历测试集
with torch.no_grad():
for inputs,targets in test_loader:
outputs = model(inputs)
loss = loss_fn(outputs,targets)
test_loss += loss.item()
# 计算loss并记录到测试误差数组
test_loss /= len(test_loader)
test_losses.append(test_loss)
# 学习率调节器
if with_scheduler:
scheduler.step()
# 绘制训练和测试误差
plt.figure(figsize=(8,4))
plt.plot(range(num_epochs),train_losses,label='train')
plt.plot(range(num_epochs),test_losses,label='test')
plt.title('Learning rate scheduler' if with_scheduler else 'No learning rate scheduler')
plt.legend()
plt.show()
# 常见的学习率调节器:
# 学习率衰减:scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.1) # 每5轮学习率衰减0.1
# 余弦退火:scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=10, eta_min=0.001) # 学习率以余弦函数形式衰减,T_max为总训练轮数
# 指数退火:scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.99) # 学习率以指数形式衰减,gamma为衰减率
# 多项式衰减:scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=[30,80], gamma=0.1) # 在30轮和80轮时学习率衰减0.1
运行结果可视化:
结论: 学习率调节器是深度学习训练中不可或缺的工具,它们通过动态调整学习率来优化训练过程。选择合适的学习率调节策略可以显著提高模型的性能和训练效率。随着深度学习技术的不断发展,新的学习率调节器策略也在不断涌现,为深度学习模型的训练提供了更多的选择。
标签:loss,关键技术,调节器,torch,学习,train,scheduler,test From: https://blog.csdn.net/weixin_47012180/article/details/144311648