torch梯度更新

一、梯度产生和更新

import torch
import torch.optim as optim
from torch.autograd import Variable
x = torch.FloatTensor([2,3,4,5])
x = Variable(x,requires_grad=True)
y = x**2
opt = optim.SGD([x],lr=0.1,weight_decay=0)
y.backward(torch.ones(4))
opt.step()

y = x 2 y=x^2 y=x2
x的梯度公式为 d y d x = 2 x \frac{dy}{dx}=2x dxdy=2x,因为 x = [ 2 , 3 , 4 , 5 ] x=[2,3,4,5] x=[2,3,4,5],所以x的梯度 g r a d = [ 4 , 6 , 8 , 5 ] grad=[4,6,8,5] grad=[4,6,8,5],那么x在优化器为SGD的情况下,进行梯度更新的公式为
x n e w = x − l r ∗ g r a d = [ 2 , 3 , 4 , 5 ] − 0.1 ∗ [ 4 , 6 , 8 , 10 ] = [ 1.6 , 2.4 , 3.2 , 4.0 ] x_{new}=x-lr*grad=[2,3,4,5]-0.1*[4,6,8,10]=[1.6,2.4,3.2,4.0] xnew=xlrgrad=[2,3,4,5]0.1[4,6,8,10]=[1.6,2.4,3.2,4.0]

二、代码执行情况

  1. 前向运算
x = torch.FloatTensor([2,3,4,5])
x = Variable(x,requires_grad=True)
y = x**2

经过前向运算后, x = [ 2 , 3 , 4 , 5 ] x=[2,3,4,5] x=[2,3,4,5] y = [ 4 , 9 , 16 , 25 ] y=[4,9,16,25] y=[4,9,16,25]
2. 计算梯度

y.backward(torch.ones(4))

backward计算路径上张量的梯度,执行完这一步后,得到x.grad
在这里插入图片描述
3. 权重更新

opt.step()

该步骤的目的是利用backward计算得到的梯度,优化路径上的张量的权重。SGD优化公式为
x n e w = x − l r ∗ g r a d x_{new}=x-lr*grad xnew=xlrgrad
其中lr为学习率,grad为上一步计算得到的梯度,更新后的梯度如下
在这里插入图片描述

三、总结:

  1. 前向传播之后使用backward进行梯度计算,接着使用opt.step进行权重更新。
  2. 不同的优化器有不同的更新公式,在这里为了简化理解并未涉及weight_decay的影响。
  3. 上面x的权重全部更新,没有体现SGD的随机性。目前主流框架中所谓的SGD实际上都是Mini-batch Gradient Descent (MBGD,亦成为SGD)。对于含有N个训练样本的数据集,每次参数更新,仅依据一部分数据计算梯度。小批量梯度下降法既保证了训练速度,也保证了最后收敛的准确率。优化器SGD的内部只是根据梯度进行更新原有权重,并不能体现随机性,真正体现随机性的是我们传入的batch_data都是随机产生的。(第3问答案摘自https://ask.csdn.net/questions/7398069)
for epoch in range(N):
    for batch in data_loader:  # <== 随机获取一部分数据是由你构造的data_loader实现的
        optimizer.zero_grad()
        output = model(batch)  # <== 此处输入即为随机的一部分数据
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值