深度学习 —— 学习率衰减策略
目录学习率策略1. 先说结论2. 图例各种学习率下的图3. 学习率的方式4. 公式4. 神经网络的训练流程5. 完整代码示例学习率策略模型调优的时候可能才会用1. 先说结论① 学习率小 梯度下降慢② 学习率大 梯度下降快③ 学习率过大可能导致梯度震荡或暴涨2. 图例各种学习率下的图lr [0.01, 0.1, 0.125, 0.2, 0.4]3. 学习率的方式① 等间隔学习率衰减. optim.lr_scheduler.StepLR② 指定间隔学习率衰减 optim.lr_scheduler.MultiStepLR③ 指数学习率衰减. optim.lr_scheduler.ExponentialLR上图1 第一行代码上图2 第二行代码上图3 第三行代码# 学习率调度器 optimizer: 梯度下降优化器 step_size间隔周期 gama: 衰减系数 milestones 指定间隔 调整点。比如 【50125160】 那就是51开始 126开始 161开始 scheduler optim.lr_scheduler.StepLR(optimizer,step_size50,gamma0.5) # 指定间隔学习率衰减策略 scheduler optim.lr_scheduler.MultiStepLR(optimizer,milestones[50,125,160],gamma0.5) # 指数间隔学习率衰减策略 scheduler optim.lr_scheduler.ExponentialLR(optimizer,gamma0.95)④ 周期重启的余弦退火策略.optim.lr_scheduler.CosineAnnealingWarmRestarts4. 公式下面代码 显示上图结果。通常总训练轮数最少有5~10个周期。重启找到个最优状态找到个局部最小值。epoch 总周期长度。比如要5个周期。epoch 200T_0 40. 周期数 200/40# 批次数 iteration 10 scheduler optim.lr_scheduler.ExponentialLR(optimizer,gamma0.95) # 模型训练 # 遍历批次 for i in range(iteration): # 1.前向传播 y_pred w * x # 2.计算损失 # 3.梯度清零 # 4.反向传播 # 5.更新参数:w新 w旧-学习率*梯度 # 6.更新学习率 scheduler.step()如果: T_mult 2 .第一个周期点是 50第二个周期点是150第三个350.周期值 50 100 200 optimizer: 梯度下降优化器 T_0: 第一个周期的轮数 eta_min: 最小学习率 最大学习率 在 optimizer optim.SGD([w],lrlr) 里面 上面给的是0.1 T_mult: # 周期倍增因子,默认为1表示每个周期的轮数相同 scheduler optim.lr_scheduler.CosineAnnealingWarmRestarts( optimizer, # 优化器对象 T_050, # 第一个周期的轮数 eta_min0, T_mult1, )4. 神经网络的训练流程1.准备数据集2.构建神经网络模型3.设置损失函数和优化器以及学习率调度器4.模型训练1.前向传播2.计算损失3.梯度清零4.反向传播5.更新参数:w新 w旧-学习率*梯度6.更新学习率5.模型测试5. 完整代码示例# 导包 import torch import torch.nn as nn import torch.optim as optim # 优化器模块提供各种优化器对象比如SGD,Adam import matplotlib.pyplot as plt # 绘图 # 设置中文字体 plt.rcParams[font.sans-serif] [SimHei] # 微软雅黑 plt.rcParams[axes.unicode_minus] False # 解决负号显示问题 # 定义函数演示 周期重启的余弦退火策略 def demo(): # 0.初始化参数 lr 0.1 epochs 200 iteration 10 # 1.准备数据集 x torch.tensor([1.0],dtypetorch.float32) y_true torch.tensor([0.0],dtypetorch.float32) # 2.构建神经网络模型 # 创建张量模拟网络参数 w torch.tensor([1.0],dtypetorch.float32,requires_gradTrue) # 3.设置损失函数和优化器以及学习率调度器 # 损失函数 loss_fn nn.MSELoss() # 优化器 optimizer optim.SGD([w],lrlr) # 学习率调度器 optimizer: 梯度下降优化器 step_size间隔周期 gama: 衰减系数 milestones 指定间隔 调整点。比如 【50125160】 那就是51开始 126开始 161开始 #scheduler optim.lr_scheduler.StepLR(optimizer,step_size50,gamma0.5) # 指定间隔学习率衰减策略 #scheduler optim.lr_scheduler.MultiStepLR(optimizer,milestones[50,125,160],gamma0.5) # 指数间隔学习率衰减策略 #scheduler optim.lr_scheduler.ExponentialLR(optimizer,gamma0.95) # 周期重启的余弦退火策略 optimizer: 梯度下降优化器 T_0: 第一个周期的轮数 eta_min: 最小学习率 最大学习率 在 optimizer optim.SGD([w],lrlr) 里面 上面给的是0.1 T_mult: # 周期倍增因子,默认为1表示每个周期的轮数相同 scheduler optim.lr_scheduler.CosineAnnealingWarmRestarts( optimizer, # 优化器对象 T_050, # 第一个周期的轮数 eta_min0, T_mult1, ) # 4.模型训练 # 定义列表记录训练轮数和学习率 lr_list [] epoch_list [] for epoch in range(epochs): # 0.获取当前轮数 和 学习率保存到记录列表中 epoch_list.append(epoch) lr_list.append(scheduler.get_last_lr()[0]) # 遍历批次 for i in range(iteration): # 1.前向传播 y_pred w * x # 2.计算损失 # 3.梯度清零 # 4.反向传播 # 5.更新参数:w新 w旧-学习率*梯度 # 6.更新学习率 scheduler.step() # 5.可视化学习率变化 plt.plot(epoch_list,lr_list) plt.title(周期重启的余弦退火策略) plt.xlabel(epoch) plt.ylabel(lr) plt.show() # 测试 if __name__ __main__: demo()
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2548265.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!