前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【NLP】深入了解PyTorch:autograd

【NLP】深入了解PyTorch:autograd

原创
作者头像
小馒头学Python
发布2023-11-15 11:43:34
1740
发布2023-11-15 11:43:34
举报
文章被收录于专栏:小馒头学Python

🍀关于torch.tensor

torch.Tensor是整个package中的核心类如果将属性requires_grad设置为True,它将追踪在这个类上定义的所有操作.当代码要进行反向传播的时候,直接调用.backword()就可以自动计算所有的梯度在这个Tensor上的所有梯度将被累加进属性.grad中

如果想终止一个Tensor在计算图中的追踪回溯,只需要执行.detach()就可以将该Tensor从计算图中撤下,在未来的回溯计算中也不会再计算该Tensor

除了.detach(),如果想终止对计算图的回溯,也就是不再进行方向传播求导数的过程,也可以采用代码块的方式with torch.no_grad():,这种方式非常适用于对模型进行预测的时候,因为预测阶段不再需要对梯度进行计算


🍀关于torch.Function

Function类是和Tensor类同等重要的一个核心类,它和Tensor共同构建了一个完整的类,每一个Tensor拥有一个.grad_fn属性,代表引用了哪个具体的Function创建了该Tensor

如果某个张量Tensor是用户自定义的,则其对应的grad_fn is None.


🍀有关Tensor的操作

代码语言:javascript
复制
import torch
x = torch.ones(3,3)
print(x)
y = torch.ones(2,2,requires_grad=True)
print(y)
12345

运行结果如下

在具有requires_grad=True的基础上对Tensor执行加法操作

代码语言:javascript
复制
z = y + 2
print(z)
12

运行结果如下

代码语言:javascript
复制
print(x.grad_fn)
print(y.grad_fn)
12

接下来分两种情况,一种是没有进行加法操作,另一种是进行了加法操作,这也就印证了 如果某个张量Tensor是用户自定义的,则其对应的grad_fn is None.

运行结果如下

接下来进行比加法操作稍微复杂的操作演示

代码语言:javascript
复制
k = z * z * 2
out = k.mean()
print(k,out)
123

运行结果如下

接下来介绍方法.requires_grad_()该方法可以原地改变Tensor的属性.requires_grad的值,如果没有改变默认为FALSE

代码语言:javascript
复制
a = torch.randn(2,2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
b = (a * a).sum()
print(b)
print(b.grad_fn)
12345678

运行结果如下


🍀关于梯度Gradients的介绍

反向传播(Backpropagation)是深度学习中一种用于计算梯度的算法。它可以有效地计算神经网络中各个参数对于损失函数的梯度,进而用于网络参数的更新和优化。

反向传播的过程可以简单分为两个步骤:前向传播和反向传播。

  • 前向传播:在前向传播过程中,输入数据通过神经网络的各个层进行正向计算,得到最终的输出结果。中间每一层的计算都可以看作是一个函数,通过层与层之间的变换(如矩阵乘法、激活函数等),将输入数据逐层传递并进行计算,直至输出层得到最终的预测结果。
  • 反向传播:在反向传播过程中,通过计算链式法则,将输出结果与真实标签之间的误差反向传播回每一层网络,计算每个参数对于损失函数的梯度。这样,就可以得到每个参数的梯度信息,进而根据梯度信息进行参数的更新和优化。

反向传播的基本思路是利用链式法则来计算导数,通过不断链式求导,将误差逐层反向传播回网络的每一个参数。这样可以高效地计算出每个参数对于整个网络输出的误差的贡献程度,从而进行梯度更新和权重调整。

反向传播算法的重要性在于它使得深度神经网络的训练变得可行。通过求解参数的梯度,我们可以使用梯度下降等优化方法对神经网络进行训练,最小化损失函数,使得网络在给定输入上获得更准确的输出。

这里注意,反向传播通过.backword()来实现

关于自动求导的属性设置:可以通过设置.requires_grad=True来执行自动求导,也可以通过代码块的限制来停止自动求导

代码语言:javascript
复制
print(y.requires_grad)
print((y ** 3).requires_grad)
with torch.no_grad():
    print((x ** 3).requires_grad)
1234

运行结果如下

可以通过.detach()进而获得一个新的张量Tensor,且拥有相同的内容但不需要自动求导

代码语言:javascript
复制
print(y.requires_grad)
z = y.detach()
print(z.requires_grad)
print(y.eq(z).all())
1234

运行结果如下

🍀总结

本篇文章是在b站学习后完成的,若有人想了解视频可以点击Python人工智能20个小时玩转NLP自然语言处理【黑马程序员】

挑战与创造都是很痛苦的,但是很充实。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🍀关于torch.tensor
  • 🍀关于torch.Function
  • 🍀有关Tensor的操作
  • 🍀关于梯度Gradients的介绍
  • 🍀总结
相关产品与服务
NLP 服务
NLP 服务(Natural Language Process,NLP)深度整合了腾讯内部的 NLP 技术,提供多项智能文本处理和文本生成能力,包括词法分析、相似词召回、词相似度、句子相似度、文本润色、句子纠错、文本补全、句子生成等。满足各行业的文本智能需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档