深度学习五个步骤:数据 ——> 模型 ——> 损失函数 ——> 优化器 ——> 迭代训练,通过前向传播,得到模型的输出和真实标签之间的差异,也就是损失函数,有了损失函数之后,模型反向传播得到参数的梯度,接下来就是优化器根据这个梯度去更新参数。

优化器

pytorch的优化器:更新模型参数。

在更新参数时一般使用梯度下降的方式去更新。梯度下降常见的基本概念

  1. 导数:函数在指定坐标轴上的变化率;
  2. 方向导数:指定方向上的变化率;
  3. 梯度:一个向量,方向为方向导数取得最大值的方向。

所以梯度是一个向量,方向是导数取得最大值的方向,也就是增长最快的方向,而梯度下降是沿着梯度的负方向去变化。

优化器的属性和方法

class Optimizer:defaults: dictstate: dictparam_groups: List[dict]def __init__(self, params: _params_t, default: dict) -> None: ...def __setstate__(self, state: dict) -> None: ...def state_dict(self) -> dict: ...def load_state_dict(self, state_dict: dict) -> None: ...def zero_grad(self, set_to_none: Optional[bool]=...) -> None: ...def step(self, closure: Optional[Callable[[], float]]=...) -> Optional[float]: ...def add_param_group(self, param_group: dict) -> None: ...

  • defaults:优化器的超参数,主要存储一些学习率、momentum的值等等
  • state:用来存储参数的一些缓存。例如使用momentum的时候,需要用到前几次的梯度,就存在这。
  • params_groups:管理参数组。是一个list。list的每一个元素是一个字典。字典中有一个'params'的key,其对应的值才是真正的参数

 optimizer的基本方法

zero_grad()

清空所管理参数的梯度。

参数是一个张量,张量有梯度grad.

pytorch有一个特性:张量梯度是不会清零的。在每一次反向传播采用autograd计算梯度的时候,是累加的。

所以应当在梯度求导之前(backward之前)把梯度清零。

step()

执行一步更新。

step()会采用梯度下降等策略,具体的策略有很多种,例如随机梯度下降法,momentum加动量的方法,自适应学习率的方法等。

add_param_group()

添加一组参数到优化器中。

优化器可以管理很多参数,这些参数是可以分组的。我们对不同组的参数可以有不同的超参数的设置。例如在模型的fintune中,对模型前面特征提取的部分希望他的学习率小一些,更新的慢一些;而后面的自己定义的全连接层,希望学习率更大一些。这样就可以把整个模型分成两组,一组是前面特征提取的参数,一组是后面全连接层的参数

state_dict()

获取优化器当前状态信息字典。

optimizer = optim.SGD([weight], lr=0.1, momentum=0.9)
opt_state_dict = optimizer.state_dict()print("state_dict before step:\n", opt_state_dict)for i in range(10):optimizer.step()print("state_dict after step:\n", optimizer.state_dict())
# 训练10次之后将模型的参数保存下来
torch.save(optimizer.state_dict(), os.path.join(BASE_DIR, "optimizer_state_dict.pkl"))

load_state_dict()

加载状态信息字典

optimizer = optim.SGD([weight], lr=0.1, momentum=0.9)
state_dict = torch.load(os.path.join(BASE_DIR, "optimizer_state_dict.pkl"))print("state_dict before load state:\n", optimizer.state_dict())
optimizer.load_state_dict(state_dict)
print("state_dict after load state:\n", optimizer.state_dict())

学习率,动量的影响

在梯度下降的过程中,学习率起到控制参数更新的一个步伐的作用。

Momentum(动量、冲量):结合当前的梯度与上一次更新的信息,用于当前更新。

import torch
import matplotlib.pyplot as pltdef func(x):return torch.pow(x, 3)iteration = 100
m = 0.0
###设置学习率列表
lr_list = [0.01, 0.03,0.05,0.08]
###设置动量参数列表
momentum_list = [0.1,0.1,0.1,0.1]loss_rec = [[] for l in range(len(lr_list))]for i, lr in enumerate(lr_list):x = torch.tensor([2.], requires_grad=True)momentum = momentum_list[i]optimizer = torch.optim.SGD([x], lr=lr, momentum=momentum)for iter in range(iteration):y = func(x)y.backward()optimizer.step()optimizer.zero_grad()loss_rec[i].append(y.item())for i, loss_r in enumerate(loss_rec):plt.plot(range(len(loss_r)), loss_r, label="LR: {} M:{}".format(lr_list[i], momentum_list[i]))
plt.legend()
plt.xlabel('Iterations')
plt.ylabel('Loss value')
plt.show()

学习率的影响,由下图可以看到,学习率越大,loss下降的就越快

动量的影响:

常见的优化器:

Adam优化器

torch.optim.Adam(params,lr=0.001,betas=(0.9, 0.999),eps=1e-08,weight_decay=0,amsgrad=False)

参考博客:

pytorch学习笔记十二:优化器_Dear_林的博客-CSDN博客_pytorch优化器

pytorch 优化器相关推荐

  1. Pytorch优化器全总结(三)牛顿法、BFGS、L-BFGS 含代码

    目录 写在前面 一.牛顿法 1.看图理解牛顿法 2.公式推导-三角函数 3.公式推导-二阶泰勒展开 二.BFGS公式推导 三.L-BFGS 四.算法迭代过程 五.代码实现 1.torch.optim. ...

  2. Pytorch优化器全总结(四)常用优化器性能对比 含代码

    目录 写在前面 一.优化器介绍 1.SGD+Momentum 2.Adagrad 3.Adadelta 4.RMSprop 5.Adam 6.Adamax 7.AdaW 8.L-BFGS 二.优化器对 ...

  3. Pytorch优化器全总结(一)SGD、ASGD、Rprop、Adagrad

    目录 写在前面 一. torch.optim.SGD 随机梯度下降 SGD代码 SGD算法解析 1.MBGD(Mini-batch Gradient Descent)小批量梯度下降法 2.Moment ...

  4. Pytorch优化器

    Pytorch优化器 了解不同优化器 构建一个优化器 差别 PyTorch种优化器选择 了解不同优化器 神经网络优化器,主要是为了优化我们的神经网络,使他在我们的训练过程中快起来,节省社交网络训练的时 ...

  5. pytorch优化器与学习率设置详解

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者 | 小新 来源 | https://a.3durl.cn/Yr ...

  6. Pytorch —— 优化器Optimizer(二)

    1.learning rate学习率 梯度下降:wi+1=wi−LR∗g(wi)w_{i+1}=w_{i}-LR*g\left(w_{i}\right)wi+1​=wi​−LR∗g(wi​)梯度是沿着 ...

  7. Pytorch:优化器

    4.2 优化器 PyTorch将深度学习中常用的优化方法全部封装在torch.optim中,其设计十分灵活,能够很方便的扩展成自定义的优化方法. 所有的优化方法都是继承基类optim.Optimize ...

  8. pytorch优化器学习率调整策略以及正确用法

    优化器 optimzier优化器的作用:优化器就是需要根据网络反向传播的梯度信息来更新网络的参数,以起到降低loss函数计算值的作用. 从优化器的作用出发,要使得优化器能够起作用,需要主要两个东西: ...

  9. pytorch优化器详解:Adam

    目录 说明 Adam原理 梯度滑动平均 偏差纠正 Adam计算过程 pytorch Adam参数 params lr betas eps weight_decay amsgrad 说明 模型每次反向传 ...

  10. pytorch优化器详解:SGD

    目录 说明 SGD参数 params lr momentum dampening weight_decay nesterov 举例(nesterov为False) 第1轮迭代 第2轮迭代 说明 模型每 ...

最新文章

  1. C# 中的委托和事件
  2. 最怕的是,你永远也忘不掉 BY顾明烟
  3. 02-合并frame
  4. Http 四种请求访问代码 HttpGet HttpPost HttpPut HttpDelete .
  5. python爬虫爬取雪球网_Python爬虫爬取天天基金网基金排行
  6. 以色列网络武器出口对象国从102个锐减至37个
  7. 恩布开源安卓手机IM,EntboostIM发布1.5.1版本
  8. Mysql数据库性能优化配置:my.cnf/my.ini配置说明详解(测试机器为16GB内存)
  9. 增强内容表现的jQuery插件
  10. Windows下【AxureRP】原型设计工具破解码与安装包
  11. c语言做线性代数第六版答案,线性代数求解(C语言):
  12. 网络编程学习笔记之TCP_01(帅帅老师讲堂)
  13. html制作手机预览效果,webstorm实现手机预览页面
  14. 个人角度谈IE10浏览器
  15. 容联云通讯完成发送验证码
  16. 【Unity 优化篇】 | 优化专栏《导航帖》,全面学习Unity优化技巧,让我们的Unity技术上升一个档次
  17. python和javascript哪个好学-python和js哪个难学
  18. 如何用html5制作3d旋转照片集
  19. pgsql sql中获取当前时间_PostgreSQL 如何获取当前日期时间及注意事项
  20. allegro差分信号走线_原创|PCB设计软件allegro16.6演示差分规则的设置

热门文章

  1. TED-谷歌创始人演示谷歌眼睛
  2. android壁纸设置bug(一)
  3. 第五题:输入三个整数x,y,z,请把这三个数由小到大输出,sort()默认按照从小到大输出
  4. 利用Dynamo绘制行车道标线
  5. Python基础入门 (四数据分析处理库Pandas应用)
  6. stust2 hibernate spring 框架复习(三)
  7. Redis(2):持久化
  8. 【转】诺基亚和微软:一名曾经用户眼中的“下坡组合”
  9. x1计算机价格,除了不靠谱的售价,X1 Carbon 是一台完美的 ThinkPad
  10. C语言: 数列第一项为2,此后各项均为它前一项的两倍再加三,计算该数列前10项之和;