Pytorch——梯度计算

一、梯度介绍

梯度是一个向量,是学习(参数更新的方向)。收集数据x,构建机器学习模型f,得到 在这里插入图片描述

判断模型好坏的方法:

(回归损失)在这里插入图片描述
(分类损失) 在这里插入图片描述

通过调整参数w,尽可能降低loss
在这里插入图片描述随机选择一个起始w0,通过调整w0,使得loss函数取得最小值。

在这里插入图片描述

w的更新方法:

①计算的梯度(即导数):在这里插入图片描述

②更新:在这里插入图片描述

其中grad(w)<0,,意味着w将增大, grad(w)>0,意味着w将减小。当w小到一定的程度或者循环达到一定次数后,或停止循环。

二、反向传播算法

2.1计算图和反向传播

    计算图:通过图的方式来描述函数的图形。

例如在这里插入图片描述,令u=a+v,v=bc,将其绘制为计算图可以表示为:在这里插入图片描述

绘制为计算图后,可以清楚地看到向前计算的过程,之后对每个节点求偏导可以有:在这里插入图片描述

则反向传播的过程就是一个上图的从左到右的过程,自变量a,b,c各自的偏导就是连线上的梯度的乘机
在这里插入图片描述

2.2神经网络中的反向传播

w1,w2,…,wn表示网络第n层权重,wn[i,j]表示第n层第i个神经元,连接到第n+1层第j个神经元的权重。
在这里插入图片描述

将其化为计算图可得:
在这里插入图片描述

其中的f函数是激活函数,grad(out)是根据损失函数对预测值进行求导得到的结果。
则此时w1[1,2]的偏导,通过观察,发现out到w1[1,2]的连线有两条。结果为:
在这里插入图片描述
其中的grad(out)指的是传入数据后的Ypredict求偏导。

这样做,当模型很大的时候,计算量会很大,所以反向传播的思想是对其中某一个参数单独求梯度:

在这里插入图片描述

不会一次性地从输出层计算到输入层,而是一层一层地反向传播,

在这里插入图片描述

更新参数之后,继续反向传播:

在这里插入图片描述

继续反向传播:

在这里插入图片描述
在这里插入图片描述

通常的描述为:
在这里插入图片描述
在这里插入图片描述

三、pytorch中反向传播和梯度计算

3.1向前计算

对于pytorch中的一个tensor,如果设置它的属性.requires_grad为True,那么它会追踪该张量的所有操作。或者可以理解为,这个tensor是一个参数,后续会被计算梯度,更新该参数。

假设有以下条件(1/4表示求均值,xi为2*2的矩阵),使用torch完成向前的计算过程

  • 在这里插入图片描述
    zi=3(xi+2)2
    其中: (x_{1}=1,z_{1}=27)

如果x为参数,需要对其进行梯度的计算和更新。则最开始指定的值的过程中,需要指定requires_grad为True

import torch
x = torch.ones(2,2,requires_grad = True)
x
tensor([[1., 1.],
[1., 1.]], requires_grad=True)
y = x + 2
y
tensor([[3., 3.],
[3., 3.]], grad_fn=)
z = y ** 2 * 3
z
tensor([[27., 27.],
[27., 27.]], grad_fn=)
out = z.mean()
out
tensor(27., grad_fn=)

从上可以看出,每次的操作都会修改其grad_fn属性,用来记录做过的操作。

为了防止跟踪历史记录(和使用内存),可以将代码块包装在with torch.no_grad():中。在评估模型时特别有用,因为模型可能具有requires_grad = True的可训练的参数,但是我们不需要在此过程中对他们进行梯度计算。

import torch

a = torch.randn(2,2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)#False
a.requires_grad_(True)#更改
print(a.requires_grad)#True
b = (a * a).sum()
print(b.grad_fn)#<SumBackward0 object at 0x00000148E9E46188>
with torch.no_grad():
    c = (a * a).sum()

print(c.requires_grad)#False

3.2梯度计算

对于3.1中的out而言,我们可以用backward方法进行反向传播,计算梯度out.backward(),此时便能够求出导数d(out)/d(x),调用x.grad能够获取导数值,如下:

out
tensor(27., grad_fn=)
out.backward()
x.grad
tensor([[4.5000, 4.5000],
[4.5000, 4.5000]]) #x为1时,值为4.5

在输出为一个标量的情况下,我们可以调用tensor的backward()方法,但是在数据是一个向量的时候,调用backward()的时候还需要传入其他参数torch.ones_like(输入名)。loss.backward()就是根据损失函数,计算其梯度,并且将其累加保存到x_gard,此时还并未更新其梯度。在第二次反向传播时,应该先对参数的梯度清零。

注意:

tensor.data:在tensor的require_grad=False,tensor.data和tensor等价。require_grad = True时,tensor.data仅是获取tensor中的数据,不带grad等属性。

tensor.numpy():require_grad = True时,不能够直接转换,需要使用tensor.detach().numpy(),进行深拷贝。

  • 30
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
梯度下降算法在PyTorch中是一个常用的优化算法,用于更新模型参数以最小化损失函数。在PyTorch中,可以使用torch.optim模块中的优化器来实现梯度下降算法。 使用梯度下降算法的一般步骤如下: 1. 定义模型:首先,需要定义一个模型,并将其初始化为一些随机的参数。 2. 定义损失函数:在PyTorch中,通常使用torch.nn模块中的损失函数,例如均方误差损失函数(MSE loss)或交叉熵损失函数(CrossEntropyLoss)。 3. 定义优化器:选择一个合适的优化器,例如SGD(随机梯度下降法)或Adam优化器,并传入模型的参数和学习率作为参数。 4. 迭代更新参数:使用优化器的step()方法来更新模型的参数,同时计算损失函数,然后反向传播并调用优化器的zero_grad()方法清空之前的梯度。 5. 重复以上步骤:重复迭代更新参数的过程,直到达到停止条件(例如达到指定的迭代次数或损失函数的值收敛)。 梯度下降算法还有一个小批量梯度下降算法(mini-batch gradient descend),它是在每次迭代中使用一小部分样本来计算梯度,并更新模型参数。这种方法可以更快地收敛,并且可以在处理大量数据时节省计算资源。 需要注意的是,梯度下降算法可以通过梯度上升法进行转化。梯度上升法用于求解最大化的损失函数,而梯度下降法用于求解最小化的损失函数。实际上,两者是相互转化的。 因此,在PyTorch中,可以根据具体问题选择使用梯度下降算法或梯度上升算法来迭代求解损失函数的最小值或最大值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [PyTorch深度学习——梯度下降算法](https://blog.csdn.net/weixin_42603976/article/details/126043798)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【Pytorch梯度下降算法](https://blog.csdn.net/weixin_45437022/article/details/113941191)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值