标量的反向传播

文章介绍了如何在PyTorch中创建张量x,设置其grad需求为True,计算x与自身点积的2倍,然后执行反向传播以获取梯度。示例中x.grad的结果为[0.,4.,8.,12.],展示了张量操作和梯度计算的基本过程。
摘要由CSDN通过智能技术生成
import torch
x = torch.arange(4.0)
x.requires_grad_(True)


y=2*torch.dot(x,x)


y.backward()
print(x.grad)

首先创建了一个从0到3(包含)的浮点数张量x,并将其requires_grad属性设置为True,表明我们打算对这个张量执行反向传播来计算梯度。

接着,计算y,它是x与自身的点积(内积),然后乘以2:

y = 2 * torch.dot(x, x)

torch.dot(x, x)本质上是计算x的每个元素与其自身一一对应相乘后求和,然后再将结果乘以2。假设x = [0, 1, 2, 3],则:

  • torch.dot(x, x) = (0*0 + 1*1 + 2*2 + 3*3)
  • 所以,y = 2 * (0*0 + 1*1 + 2*2 + 3*3)

接下来,执行y.backward()进行反向传播。因为y是关于x的标量输出,所以计算的是y关于x各元素的梯度。

对于y = 2 * x1^2 + 2 * x2^2 + 2 * x3^2 + 2 * x4^2,对其求导得:

  • dy/dx1 = 4 * x1
  • dy/dx2 = 4 * x2
  • dy/dx3 = 4 * x3
  • dy/dx4 = 4 * x4

执行y.backward()后,x.grad将存储这些梯度,即x各元素的四倍。对于给定的x,其梯度将是[0., 4., 8., 12.]

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch中,我们可以使用autograd模块轻松计算一阶导数。但是,计算二阶导数需要更多的工作。 首先,我们需要定义一个计算Hessian矩阵的函数,它将会使用PyTorch的自动微分机制计算二阶导数。下面是一个简单的实现: ```python def hessian(y, x): """ Compute the Hessian matrix of y w.r.t. x """ # First derivative jacobian = torch.autograd.grad(y, x, create_graph=True)[0] # Initialize Hessian matrix hessian = torch.zeros(x.size() + x.size()) # Second derivative for idx in range(x.nelement()): grad2rd = torch.autograd.grad(jacobian.view(-1)[idx], x, create_graph=True)[0] hessian[idx] = grad2rd.view(x.size() + x.size()[1:]) return hessian ``` 这个函数需要两个输入参数:$y$和$x$。$y$是一个标量函数,而$x$是一个张量,可以是模型参数或输入数据。该函数返回一个张量,表示$y$关于$x$的Hessian矩阵。 现在,我们可以使用这个函数计算任意函数的Hessian矩阵了。下面是一个简单的示例: ```python import torch # Define a simple function def f(x): return x**2 + 2*x # Define an input tensor x = torch.tensor([1.0], requires_grad=True) # Compute the Hessian matrix of f w.r.t. x h = hessian(f(x), x) # Print the Hessian matrix print(h) ``` 这个示例计算了$f(x) = x^2 + 2x$在$x=1$处的Hessian矩阵。输出结果如下: ``` tensor([[2.]]) ``` 这个结果表明,$f(x)$关于$x$的二阶导数在$x=1$处的值为2。 需要注意的是,计算Hessian矩阵需要创建一个二阶计算图,这可能会占用大量的内存。在计算高维张量的Hessian矩阵时,可能需要考虑使用分块技术或其他优化方法来减少内存开销。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值