问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

神经网络中动态调整学习率的方法

创作时间:
作者:
@小白创作中心

神经网络中动态调整学习率的方法

引用
CSDN
1.
https://blog.csdn.net/2301_81692599/article/details/146325724

在神经网络训练过程中,学习率是一个非常重要的超参数,它直接影响模型的收敛速度和最终性能。动态调整学习率的方法可以帮助模型更好地收敛,避免陷入局部最优解。本文将通过一个实验项目,详细讲解学习率调度器的基本概念、重要性以及几种常见的动态调整学习率的方法。

实验目的

掌握学习率调度器的基本概念:了解学习率在神经网络训练过程中的重要性,掌握几种常见的动态调整学习率的方法及其适用场景。

提高模型训练效果:通过调整学习率策略,降低过拟合现象,提升模型的收敛速度及性能。

强化实践能力:通过实验实践,熟悉 PyTorch 中的学习率调度器,能够结合具体问题选择合适的学习率调整方法。

实验环境

硬件:12th Gen Intel(R) Core(TM) i5-12500H 2.50 GHz

软件:PyCharm Community Edition 2023.2.1

内容与要求

  1. 学生应具备神经网络基础知识,了解学习率对模型训练的影响。

  2. 掌握 PyTorch 的基本操作,特别是优化器(如 SGD、Adam)和训练循环的使用。

  3. 具备对实验数据进行简单分析的能力,能够通过实验结果评估不同学习率策略的优缺点。

过程与分析

准备工作

1. 数据预处理

数据转换与归一化:使用transforms.Compose组合了两个数据转换操作。然后transforms.ToTensor()将图像数据从原始格式转换为PyTorch张量,方便后续的计算和处理。transforms.Normalize((0.1307,), (0.3081,))对数据进行归一化处理,这里的均值为0.1307,标准差为0.3081,有助于模型更快收敛和更好地学习特征。

数据集加载与划分:train_dataset函数加载MNIST训练数据集,指定数据存储路径,如果本地没有该数据集则自动下载,应用之前定义的转换操作transform。test_dataset函数加载MNIST测试数据集,同样指定路径、下载选项和转换操作。

数据加载器创建:train_loader函数创建训练数据加载器,设置批次大小为510,并且在每个批次中随机打乱数据顺序,这有助于模型在训练过程中更好地学习数据的多样性。test_loader函数创建测试数据加载器,批次大小为2000,不打乱数据顺序,以便在评估模型性能时能够按照固定顺序进行测试。

2. 定义全连接神经网络

层定义

在__init__方法中定义了神经网络的各个层。

第一个全连接层将输入数据从维度28 * 28(对应MNIST图像的像素数)映射到512个神经元。第二个全连接层将512个神经元的输出进一步映射到256个神经元。

第三个全连接层将256个神经元的输出映射到128个神经元。

第四个全连接层是输出层,将128个神经元的输出映射到10个类别,对应MNIST数据集中的10个数字类别。

前向传播逻辑定义

在forward方法中定义了数据在网络中的前向传播流程。x = x.view(-1, 28 * 28)将输入数据x展平,使其形状符合全连接层的输入要求,即将二维的图像数据转换为一维向量。然后依次通过各个全连接层和激活函数torch.relu进行处理。torch.relu激活函数用于引入非线性,增强网络的表达能力,帮助网络学习更复杂的模式。 最后通过输出层得到网络的输出,该输出可以用于计算分类损失和进行预测。

模型训练

1. 训练函数和测试函数

train函数:用于训练模型。遍历训练数据集,将数据和目标转移到指定的设备。重置梯度,执行前向传播,计算损失,执行反向传播,并更新模型参数。

计算并记录训练过程中的总损失和准确率。

test函数:用于评估模型在测试集上的性能。遍历测试数据集,将数据和目标转移到指定的设备。不计算梯度,执行前向传播,计算损失,并统计预测正确的样本数。

2. 实验函数,训练并使用不同的调整策略

初始化模型、优化器和调度器:根据传入的调度策略类型和参数,函数首先设置计算设备,初始化全连接神经网络模型(SimpleFCN),并配置随机梯度下降(SGD)优化器。

根据选择的调度策略初始化学习率调度器:根据传入的参数,选择并初始化不同的学习率调度策略,如阶梯式下降、多阶梯式下降或指数衰减。

训练模型:进行50个epoch的训练过程,每个epoch都会调用训练函数和测试函数来训练模型并在测试集上评估模型性能。

记录训练和测试结果:在训练过程中,记录每个epoch的训练损失、测试损失、训练准确率和测试准确率。

动态调整学习率:在每个epoch结束后,根据设定的学习率调度策略调整学习率。

3. 对比不同学习率调度策略

定义调度策略:创建一个字典scheduler,其中包含三种不同的学习率调度策略:StepLR、MultiStepLR和ExponentialLR,每种策略都有其特定的参数。

初始化结果存储结构:创建两个空字典results和learning_rates_results,用于存储每种调度策略下的训练和测试结果,以及学习率的变化情况。

循环执行实验:遍历上文定义的调度策略,对每种策略执行以下步骤:

  1. 打印当前正在执行的策略名称。

  2. 调用run_experiment函数,传入调度策略的名称和参数,进行实验。

  3. 将返回的实验结果(包括训练损失、测试损失、训练准确率、测试准确率和学习率)存储到相应的字典中。

实验分析

1. 常见的学习率调度策略

(1)StepLR:

① 按照预先设定的epoch间隔,将学习率乘以一个因子(通常小于1),实现阶梯状下降。

② 优点是简单易用,适合初学者。

③ 缺点是固定的间隔可能不适用于所有情况,有时可能太早或太晚降低学习率。

(2)MultiStepLR:

① 与StepLR类似,但允许在多个指定的epoch点(milestones)降低学习率。

② 更灵活,可以在训练过程中根据需要在特定阶段降低学习率。

(3)ExponentialLR:

① 按照指数衰减的方式逐渐减小学习率。

② 优点是学习率减小得非常平滑,有助于模型在训练后期进行细致调整。

③ 缺点是如果衰减过快,可能会过早地限制了模型的学习能力。

(4)CosineAnnealingLR:

① 学习率按照余弦函数的形式进行调整,周期性地在给定的最小值和最大值之间变化。

② 优点是可以模拟学习率退火的过程,有助于模型跳出局部最小值。

③ 适用于需要细粒度调整学习率的场景。

(5)ReduceLROnPlateau:

① 当模型的性能指标(如验证集损失)停止改善时,降低学习率。

② 优点是可以根据模型的实际表现来调整学习率,避免过早陷入局部最小值。

③ 需要监控一个额外的性能指标,增加了一些实现的复杂性。

(6)LambdaLR:

① 允许用户定义一个函数,该函数将epoch数作为输入,输出一个乘因子,用于调整学习率。

② 非常灵活,可以自定义几乎任何学习率衰减策略。

③ 需要用户有一定的经验来设计合适的衰减函数。

2. 结果可视化与分析

(1)可视化:

图1 不同学习率策略下的LOSS-ACC图

(2)分析:

损失曲线(Loss per Epoch)

X轴表示训练周期(Epoch)。

Y轴表示损失值(Loss)。

图表中可能展示了使用不同学习率调度策略(如StepLR、MultiStepLR、ExponentialLR)的训练集和测试集损失值。

损失值通常会随着训练周期的增加而减小,表示模型正在学习。

不同曲线的下降速度和平滑程度可以反映不同学习率调度策略的效果。

准确率曲线(Accuracy per Epoch)

X轴同样表示训练周期(Epoch)。

Y轴表示准确率百分比。

图表中可能展示了使用不同学习率调度策略的训练集和测试集准确率。

准确率通常会随着训练周期的增加而提高,表示模型性能的提升。

不同曲线的上升速度和平稳程度可以反映不同学习率调度策略对模型性能的影响。

曲线分析

StepLR:显示出阶梯状的学习率变化,损失和准确率曲线会在每个step size后有明显的变化。

MultiStepLR:在特定的milestones后出现损失和准确率的突变。

ExponentialLR:学习率以指数方式衰减,损失和准确率曲线可能相对平滑。

总结

通过本次实验,掌握了 PyTorch 框架的使用。从数据预处理阶段的 transforms 操作和数据集加载,到构建全连接神经网络模型以及定义训练和测试函数,每个环节都对 PyTorch 的功能有了更深刻的认识。在定义神经网络层时,学会了如何根据任务需求合理设置各层的神经元数量和连接方式,以达到更好的模型性能。

对学习率调度器的使用也有了切实的体验。不同的调度策略如 StepLR、MultiStepLR 和 ExponentialLR 等,明白了学习率在训练过程中的动态调整对模型收敛速度和性能的重要影响。

对不同的学习率调度策略有了全面的了解和比较。StepLR 的简单易用在初步实验时能够快速上手,但也意识到其固定的 step size 可能在某些情况下不够灵活。MultiStepLR 允许在多个指定的 epoch 点降低学习率,在不同阶段调整学习率提供了更多的控制权,能够根据模型的训练情况更有针对性地进行优化。ExponentialLR 的指数衰减方式可以看到了学习率平滑减小的效果,在训练后期有助于模型进行更细致的调整,但需要注意衰减速度的设置,以免过早限制模型的学习能力。

本文原文来自CSDN

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号