pytorch 优化器调参
torch.optim
- 如何使用optimizer
- 构建
- 为每个参数单独设置选项
- 进行单次优化
- optimizer.step()
- optimizer.step(closure)
- 算法
- 如何调整学习率
torch.optim
是实现各种优化算法的包。最常用的方法都已经支持,接口很常规,所以以后也可以很容易地集成更复杂的方法。
如何使用optimizer
要使用torch.optim
,您必须构造一个optimizer
对象。这个对象能保存当前的参数状态并且基于计算梯度更新参数
构建
要构造一个Optimizer
,你必须给它一个包含参数(必须都是Variable
对象)进行优化。然后,您可以指定optimizer
的参 数选项,比如学习率,权重衰减等。
例子:
optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr = 0.0001)
为每个参数单独设置选项
Optimizer
也支持为每个参数单独设置选项。若想这么做,不要直接传入Variable
的iterable
,而是传入dict的iterable
。每一个dict
都分别定 义了一组参数,并且包含一个param
键,这个键对应参数的列表。其他的键应该optimizer
所接受的其他参数的关键字相匹配,并且会被用于对这组参数的 优化。
注意:
您仍然可以将选项作为关键字参数传递。它们将被用作默认值,在不覆盖它们的组中。当您只想改变一个选项,同时保持参数组之间的所有其他选项一致时,这很有用。
例如,当我们想指定每一层的学习率时,这是非常有用的:
optim.SGD([{'params': model.base.parameters()},{'params': model.classifier.parameters(), 'lr': 1e-3}], lr=1e-2, momentum=0.9)
这意味着model.base
参数将使用默认的学习速率1e-2
,model.classifier
参数将使用学习速率1e-3
,并且0.9
的momentum
将会被用于所有的参数。
进行单次优化
所有的optimizer
都会实现step()
更新参数的方法。它能按两种方式来使用:
optimizer.step()
这是大多数optimizer
所支持的简化版本。一旦梯度被如backward()
之类的函数计算好后,我们就可以调用该函数。
例子
for input, target in dataset:optimizer.zero_grad()output = model(input)loss = loss_fn(output, target)loss.backward()optimizer.step()
optimizer.step(closure)
一些优化算法例如Conjugate Gradient
和LBFGS
需要重复多次计算函数,因此你需要传入一个闭包去允许它们重新计算你的模型。这个闭包会清空梯度, 计算损失,然后返回。
例子:
for input, target in dataset:def closure(): optimizer.zero_grad() output = model(input) loss = loss_fn(output, target) loss.backward() return loss optimizer.step(closure)
算法
class torch.optim.Optimizer(params, defaults)
所有优化的基类.
参数:
- params (iterable) —— 可迭代的
Variable
或者dict
。指定应优化哪些变量。 - defaults-(dict):包含优化选项的默认值的dict(一个参数组没有指定的参数选项将会使用默认值)。
load_state_dict(state_dict)
加载optimizer
状态
参数:
- state_dict (dict) ——
optimizer
的状态。应该是state_dict()
调用返回的对象。
state_dict()
将优化器的状态返回为一个dict
。
它包含两个内容:
- state - 持有当前
optimization
状态的dict
。它包含了 优化器类之间的不同。 - param_groups - 一个包含了所有参数组的
dict
。
step(closure)
执行单个优化步骤(参数更新)。
参数:
- closure (callable,可选) – 重新评估模型并返回损失的闭包。hon zero_grad()
清除所有优化过的Variable
的梯度。
class torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)
实现Adadelta
算法。
ADADELTA中提出了一种自适应学习速率法。
参数:
- params (iterable) – 用于优化的可以迭代参数或定义参数组
- rho (float, 可选) – 用于计算平方梯度的运行平均值的系数(默认值:0.9)
- eps (float, 可选) – 增加到分母中以提高数值稳定性的术语(默认值:1e-6)
- lr (float, 可选) – 将delta应用于参数之前缩放的系数(默认值:1.0)
- weight_decay (float, 可选) – 权重衰减 (L2范数)(默认值: 0)
step(closure)
执行单个优化步骤。
参数:
- closure (callable,可选) – 重新评估模型并返回损失的闭包。
class torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0)
实现Adagrad算法。
在在线学习和随机优化的自适应子梯度方法中被提出。
参数:
- params (iterable) – 用于优化的可以迭代参数或定义参数组
- lr (float, 可选) – 学习率(默认: 1e-2)
- lr_decay (float, 可选) – 学习率衰减(默认: 0)
- weight_decay (float, 可选) – 权重衰减(L2范数)(默认: 0)
step(closure)
执行单个优化步骤。
参数:
- closure (callable,可选) – 重新评估模型并返回损失的闭包。
class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)[source]
实现Adam算法。
它在Adam: A Method for Stochastic Optimization中被提出。
参数:
- params (iterable) – 用于优化的可以迭代参数或定义参数组
- lr (float, 可选) – 学习率(默认:1e-3)
- betas (Tuple[float, float], 可选) – 用于计算梯度运行平均值及其平方的系数(默认:0.9,0.999)
- eps (float, 可选) – 增加分母的数值以提高数值稳定性(默认:1e-8)
- weight_decay (float, 可选) – 权重衰减(L2范数)(默认: 0)
step(closure)
执行单个优化步骤。
参数:
- closure (callable,可选) – 重新评估模型并返回损失的闭包。
class torch.optim.Adamax(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)
实现Adamax
算法(Adam的一种基于无穷范数的变种)。
它在Adam: A Method for Stochastic Optimization中被提出。
参数:
- params (iterable) – 用于优化的可以迭代参数或定义参数组
- lr (float, 可选) – 学习率(默认:2e-3)
- betas (Tuple[float, float], 可选) – 用于计算梯度以及梯度平方的运行平均值的系数
- eps (float, 可选) – 增加分母的数值以提高数值稳定性(默认:1e-8)
- weight_decay (float, 可选) – 权重衰减(L2范数)(默认: 0)
step(closure=None)
执行单个优化步骤。
参数:
- closure (callable,可选) – 重新评估模型并返回损失的闭包。
class torch.optim.ASGD(params, lr=0.01, lambd=0.0001, alpha=0.75, t0=1000000.0, weight_decay=0)
实现平均随机梯度下降。
它在Acceleration of stochastic approximation by averaging中被提出。
参数:
- params (iterable) – 用于优化的可以迭代参数或定义参数组
- lr (float, 可选) – 学习率(默认:1e-2)
- lambd (float, 可选) – 衰减期(默认:1e-4)
- alpha (float, 可选) – eta更新的指数(默认:0.75)
- t0 (float, 可选) – 指明在哪一次开始平均化(默认:1e6)
- weight_decay (float, 可选) – 权重衰减(L2范数)(默认: 0)
step(closure)
执行单个优化步骤。
参数:
- closure (callable,可选) – 重新评估模型并返回损失的闭包。
class torch.optim.LBFGS(params, lr=1, max_iter=20, max_eval=None, tolerance_grad=1e-05, tolerance_change=1e-09, history_size=100, line_search_fn=None)
实现L-BFGS算法。
警告: 这个optimizer不支持为每个参数单独设置选项以及不支持参数组(只能有一个) 现在所有参数必须在单个设备上。将来会有所改善。
注意: 这是一个内存高度密集的optimizer(它要求额外的
param_bytes * (history_size + 1)
个字节)。如果它不适应内存,尝试减小history size,或者使用不同的算法。
参数:
- lr (float) – 学习率(默认:1)
- max_iter (int) – 每个优化步骤的最大迭代次数(默认:20))
- max_eval (int) – 每个优化步骤的最大函数评估次数(默认:max * 1.25)
- tolerance_grad (float) – 一阶最优的终止容忍度(默认:1e-5)
- tolerance_change (float) – 功能值/参数更改的终止公差(默认:1e-9)
- history_size (int) – 更新历史记录大小(默认:100)
step(closure)
执行单个优化步骤。
参数:
- closure (callable,可选) – 重新评估模型并返回损失的闭包。
class torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)[source]
实现RMSprop
算法。
由G. Hinton
在他的课程中提出.
中心版本首次出现在Generating Sequences With Recurrent Neural Networks.
参数:
- params (iterable) – 用于优化的可以迭代参数或定义参数组
- lr (float, 可选) – 学习率(默认:1e-2)
- momentum (float, 可选) – 动量因子(默认:0)
- alpha (float, 可选) – 平滑常数(默认:0.99)
- eps (float, 可选) – 增加分母的数值以提高数值稳定性(默认:1e-8)
- centered (bool, 可选) – 如果为True,计算中心化的RMSProp,通过其方差的估计来对梯度进行归一化
- weight_decay (float, 可选) – 权重衰减(L2范数)(默认: 0)
step(closure)
执行单个优化步骤。
参数:
- closure (callable,可选) – 重新评估模型并返回损失的闭包。
class torch.optim.Rprop(params, lr=0.01, etas=(0.5, 1.2), step_sizes=(1e-06, 50))
实现弹性反向传播算法。
参数:
- params (iterable) – 用于优化的可以迭代参数或定义参数组
- lr (float, 可选) – 学习率(默认:1e-2)
- etas (Tuple[float, float], 可选) – 一对(etaminus,etaplis), 它们是乘数增加和减少因子(默认:0.5,1.2)
- step_sizes (Tuple[float, float], 可选) – 允许的一对最小和最大的步长(默认:1e-6,50)
step(closure)
执行单个优化步骤。
参数:
- closure (callable,可选) – 重新评估模型并返回损失的闭包。
class torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)
实现随机梯度下降算法(momentum可选)。
Nesterov动量基于On the importance of initialization and momentum in deep learning中的公式.
参数:
- params (iterable) – 用于优化的可以迭代参数或定义参数组
- lr (float) – 学习率
- momentum (float, 可选) – 动量因子(默认:0)
- weight_decay (float, 可选) – 权重衰减(L2范数)(默认:0)
- dampening (float, 可选) – 动量的抑制因子(默认:0)
- nesterov (bool, 可选) – 使用Nesterov动量(默认:False)
例子:
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> optimizer.zero_grad()
>>> loss_fn(model(input), target).backward() >>> optimizer.step()
提示:
带有动量/Nesterov的SGD的实现稍微不同于Sutskever等人以及其他框架中的实现。 考虑到Momentum的具体情况,更新可以写成 v=ρ∗v+g p=p−lr∗v 其中,p、g、v和ρ分别是参数、梯度、速度和动量。 这是在对比Sutskever et. al。和其他框架采用该形式的更新 v=ρ∗v+lr∗g p=p−v Nesterov版本被类似地修改。
step(closure)
执行单个优化步骤。
参数:
- closure (callable,可选) – 重新评估模型并返回损失的闭包。
如何调整学习率
torch.optim.lr_scheduler
提供了几种方法来根据epoches的数量调整学习率。torch.optim.lr_scheduler.ReduceLROnPlateau
允许基于一些验证测量来降低动态学习速率。
class torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)
将每个参数组的学习速率设置为初始的lr乘以一个给定的函数。当last_epoch=-1时,将初始lr设置为lr。
参数:
- optimizer (Optimizer) – 包装的优化器。
- lr_lambda (function or list) – 一个函数来计算一个乘法因子给定一个整数参数的
epoch
,或列表等功能,为每个组optimizer.param_groups
。 - last_epoch (int) – 最后一个时期的索引。默认: -1.
例子:
>>> # Assuming optimizer has two groups.
>>> lambda1 = lambda epoch: epoch // 30 >>> lambda2 = lambda epoch: 0.95 ** epoch >>> scheduler = LambdaLR(optimizer, lr_lambda=[lambda1, lambda2]) >>> for epoch in range(100): >>> scheduler.step() >>> train(...) >>> validate(...)
class torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)
将每个参数组的学习速率设置为每个step_size时间段由gamma衰减的初始lr。当last_epoch = -1时,将初始lr设置为lr。
- optimizer (Optimizer) – 包装的优化器。
- step_size (int) – 学习率衰减期。
- gamma (float) – 学习率衰减的乘积因子。默认值:-0.1。
- last_epoch (int) – 最后一个时代的指数。默认值:1。
例子:
>>> # Assuming optimizer uses lr = 0.5 for all groups
>>> # lr = 0.05 if epoch < 30
>>> # lr = 0.005 if 30 <= epoch < 60 >>> # lr = 0.0005 if 60 <= epoch < 90 >>> # ... >>> scheduler = StepLR(optimizer, step_size=30, gamma=0.1) >>> for epoch in range(100): >>> scheduler.step() >>> train(...) >>> validate(...)
class torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)
一旦时间的数量达到一个里程碑,则将每个参数组的学习率设置为伽玛衰减的初始值。当last_epoch=-1时,将初始lr设置为lr。
参数:
- optimizer (Optimizer) – 包装的优化器。
- milestones (list) – 时期指标的列表。必须增加。
- gamma (float) – 学习率衰减的乘积因子。 默认: -0.1.
- last_epoch (int) – 最后一个时代的指数。 默认: -1.
例子:
>>> # Assuming optimizer uses lr = 0.5 for all groups
>>> # lr = 0.05 if epoch < 30
>>> # lr = 0.005 if 30 <= epoch < 80 >>> # lr = 0.0005 if epoch >= 80 >>> scheduler = MultiStepLR(optimizer, milestones=[30,80], gamma=0.1) >>> for epoch in range(100): >>> scheduler.step() >>> train(...) >>> validate(...)
class torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1)
将每个参数组的学习速率设置为每一个时代的初始lr衰减。当last_epoch=-1时,将初始lr设置为lr。
- optimizer (Optimizer) – 包装的优化器。
- gamma (float) – 学习率衰减的乘积因子。
- last_epoch (int) – 最后一个指数。默认: -1.
class torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10, verbose=False, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08)
当指标停止改善时,降低学习率。当学习停滞不前时,模型往往会使学习速度降低2-10倍。这个调度程序读取一个指标量,如果没有提高epochs的数量,学习率就会降低。
- optimizer (Optimizer) – 包装的优化器。
- mode (str) – min, max中的一个. 在最小模式下,当监测量停止下降时,lr将减少; 在最大模式下,当监控量停止增加时,会减少。默认值:'min'。
- factor (float) – 使学习率降低的因素。 new_lr = lr * factor. 默认: 0.1.
- patience (int) –epochs没有改善后,学习率将降低。 默认: 10.
- verbose (bool) – 如果为True,则会向每个更新的stdout打印一条消息。 默认: False.
- threshold (float) – 测量新的最优值的阈值,只关注显着变化。 默认: 1e-4.
- threshold_mode (str) – rel, abs中的一个. 在rel模型, dynamic_threshold = best ( 1 + threshold ) in ‘max’ mode or best ( 1 - threshold ) 在最小模型. 在绝对值模型中, dynamic_threshold = best + threshold 在最大模式或最佳阈值最小模式. 默认: ‘rel’.
- cooldown (int) – 在lr减少后恢复正常运行之前等待的时期数。默认的: 0.
- min_lr (float or list) – 标量或标量的列表。对所有的组群或每组的学习速率的一个较低的限制。 默认: 0.
- eps (float) – 适用于lr的最小衰减。如果新旧lr之间的差异小于eps,则更新将被忽略。默认: 1e-8.
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> scheduler = torch.optim.ReduceLROnPlateau(optimizer, 'min') >>> for epoch in range(10): >>> train(...) >>> val_loss = validate(...) >>> # Note that step should be called after validate() >>> scheduler.step(val_loss)
转载于:https://www.cnblogs.com/jfdwd/p/11240967.html
pytorch 优化器调参相关推荐
- 模型调参常见问题及Aadm优化器调参记录
超参数调试.Batch正则化和编程框架 参考链接:链接:https://blog.csdn.net/red_stone1/article/details/78403416 1. Tuning Proc ...
- Pytorch优化器全总结(一)SGD、ASGD、Rprop、Adagrad
目录 写在前面 一. torch.optim.SGD 随机梯度下降 SGD代码 SGD算法解析 1.MBGD(Mini-batch Gradient Descent)小批量梯度下降法 2.Moment ...
- Pytorch优化器
Pytorch优化器 了解不同优化器 构建一个优化器 差别 PyTorch种优化器选择 了解不同优化器 神经网络优化器,主要是为了优化我们的神经网络,使他在我们的训练过程中快起来,节省社交网络训练的时 ...
- Kaggle经典数据分析项目:泰坦尼克号生存预测!1. 数据概述与可视化2. 数据预处理3. 模型训练4. 模型优化(调参)
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习 ,不错过 Datawhale干货 作者:陈锴,中山大学,Datawhale成员 最近有很多读者留言,希望 ...
- Pytorch优化器全总结(三)牛顿法、BFGS、L-BFGS 含代码
目录 写在前面 一.牛顿法 1.看图理解牛顿法 2.公式推导-三角函数 3.公式推导-二阶泰勒展开 二.BFGS公式推导 三.L-BFGS 四.算法迭代过程 五.代码实现 1.torch.optim. ...
- Pytorch优化器全总结(四)常用优化器性能对比 含代码
目录 写在前面 一.优化器介绍 1.SGD+Momentum 2.Adagrad 3.Adadelta 4.RMSprop 5.Adam 6.Adamax 7.AdaW 8.L-BFGS 二.优化器对 ...
- pytorch 优化器 机器学习 调参
torch.optim 如何使用optimizer 构建 为每个参数单独设置选项 进行单次优化 optimizer.step() optimizer.step(closure) 算法 如何调整学习率 ...
- PyTorch + Ray Tune 调参
参考了PyTorch官方文档和Ray Tune官方文档 1.HYPERPARAMETER TUNING WITH RAY TUNE 2.How to use Tune with PyTorch 以Py ...
- pytorch优化器与学习率设置详解
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者 | 小新 来源 | https://a.3durl.cn/Yr ...
最新文章
- 唐筛的准确率这么低为什么还要做_【NT 唐筛 四维】 【唐筛结果通知】...
- C# 校验帮助类-正则表达式
- sqlite的数据导入 导出
- C#经典算法实践,回顾往生,更是致敬《算法导论》
- 纠前误码率与信噪比 matlab,信噪比与误码率关系.pdf
- Python---字符串与列表
- 撞库***:一场需要用户参与的持久战
- jQuery学习笔记03
- 个人IP网站源码 适合做个人主页和工作室网站
- win10自带c语言编程猫,编程猫教程:编程猫如何做游戏?
- 【人脸关键点】——PFLD人脸关键点检测解读
- 易掌管-计件工资系统免费登记派送中
- 定期报告系统服务器出错 1,做好Web服务器的日常维护必备常识
- 26字母 导航 android,Android自定义View实现字母导航栏的代码
- mysql grant什么意思_MySQL grant 语法的详细解析
- 地震了!最好直接砸死我!
- . net core在图片上写字
- 【Android App】二维码的讲解及生成属于自己的二维码实战(附源码和演示 超详细必看)
- 汇编语言(王爽第三版)实验大全
- Linux Oracle dbf文件误删 恢复操作