Pytorch中的梯度下降及优化

在PyTorch中使用Mini-batch这种方法进行训练

Mini-batch的梯度下降法

对整个训练集进行梯度下降法的时候,我们必须处理整个训练数据集,然后才能进行一步梯度下降,即每一步梯度下降法需要对整个训练集进行一次处理,如果训练数据集很大的时候处理速度会很慢,而且也不可能一次的载入到内存或者显存中

所以我们会把大数据集分成小数据集,一部分一部分的训练,这个训练子集即称为Mini-batch

对于普通的梯度下降法,一个epoch只能进行一次梯度下降;而对于Mini-batch梯度下降法,一个epoch可以进行Mini-batch的个数次梯度下降。

1

普通的batch梯度下降法和Mini-batch梯度下降法代价函数的变化趋势,如下图所示:

2

  • 如果训练样本的大小比较小时,能够一次性的读取到内存中,那我们就不需要使用Mini-batch
  • 如果训练样本的大小比较大时,一次读入不到内存或者现存中,那我们必须要使用 Mini-batch来分批的计算
  • Mini-batch size的计算规则如下,在内存允许的最大情况下使用2的N次方个size

3

torch.optim

torch.optim是一个实现了各种优化算法的库。大部分常用优化算法都有实现

torch.optim.SGD

Stochastic Gradient Descent

随机梯度下降算法,带有动量(momentum)的算法作为一个可选参数可以进行设置

可以把动量看作惯性:当你跑起来,由于惯性的存在你跑起来会比刚起步加速的时候更轻松,当你跑过头,想调头往回跑,惯性会让你拖着你。
在普通的梯度下降法的方向相同,则会加速。反之,则会减速。
加了动量的优势:

  1. 加速收敛
  2. 提高精度(减少收敛过程中的振荡)
SGD(params, lr=<required parameter>, momentum=0, dampening=0, weight_decay=0, nesterov=False)

torch.optim.RMSprop

Root Mean Square Prop

均方根传递。也是一种可以加快梯度下降的算法,利用RMSprop算法,可以减小某些维度梯度更新波动较大的情况,使其梯度下降的速度变得更快

相较于gradient descent with momentum,RMSprop的思想是:

  • 对于梯度震动较大的项,在下降时,减小其下降速度;
  • 对于震动幅度小的项,在下降时,加速其下降速度。

torch.optim.Adam

Adam 优化算法的基本思想就是将 Momentum 和 RMSprop 结合起来形成的一种适用于不同深度学习结构的优化算法

它能基于训练数据迭代地更新神经网络权重

详细介绍

e.d.

# 这里的lr,betas,还有eps都是用默认值即可,所以Adam是一个使用起来最简单的优化方法
optimizer = torch.optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-08)
### PyTorch 中实现随机梯度下降 SGD 示例 在 PyTorch 中,可以通过 `torch.optim.SGD` 类来轻松实现随机梯度下降 (Stochastic Gradient Descent, SGD)。下面是一个完整的示例,展示了如何设置参数、定义损失函数以及执行优化过程。 #### 导入必要的库 ```python import torch ``` #### 定义模型参数并初始化 创建一个可训练的张量 `w` 并指定其初始值为 10.0,同时开启自动求导功能以便后续计算梯度。 ```python w = torch.tensor([10.0], dtype=torch.float32, requires_grad=True) ``` #### 初始化优化器 配置 SGD 优化器时可以调整多个超参数如学习率 (`lr`) 和动量 (`momentum`) 等,默认情况下这些选项都是关闭或设定了固定数值;这里还设置了其他一些常见的调节项比如权重衰减(`weight_decay`) 来防止过拟合现象的发生[^3]。 ```python optimizer = torch.optim.SGD( params=[w], lr=0.1, momentum=0.9, dampening=0.5, weight_decay=0.01, nesterov=False ) ``` #### 训练循环 通过迭代更新权重的方式来进行多次前向传播和反向传播操作,在每次迭代结束之后打印当前轮次下的梯度信息及最新的权重量子状态。 ```python for epoch in range(5): # 前向传递: 计算目标函数/损失 loss = w ** 2 + 2 * w # 清除之前的梯度记录以防累积影响新一次的结果准确性 optimizer.zero_grad() # 反向传播误差信号到各层节点上 loss.backward() # 执行单步参数更新动作 optimizer.step() print(f"第{epoch+1}轮:变量梯度: {w.grad.item()}, 变量值:{w.data.item()}") ``` 此段代码片段实现了简单的二次多项式的最小化问题作为演示用途,实际应用中通常会涉及到更复杂的网络架构与更大的数据集处理流程[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值