栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

pytorch中的torch.autograd.backward()

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

pytorch中的torch.autograd.backward()

backward()用法介绍

深度学习中反向传播尤为重要,pytorch中的torch.autograd.backward()函数实现了反向传播的功能。具体相关的参数如下所示:

torch.autograd.backward(tensors, grad_tensors=None, retain_graph=None, create_graph=False, grad_variables=None)

  • tensors指定需要被求梯度的张量
  • grad_tensors通常是对应张量的每个元素的梯度
  • retain_graph释放或者保留用于计算梯度的计算图
  • create_graph用于计算高阶导数

给定三个向量分别是 y = ( y 1 , y 2 , ⋯   , y 3 ) , x = ( x 1 , x 2 , ⋯   , x 3 ) , a = ( a 1 , a 2 , ⋯   , a 3 ) boldsymbol{y}=(y_1,y_2,cdots,y_3),quadboldsymbol{x}=(x_1,x_2,cdots,x_3),quad boldsymbol{a}=(a_1,a_2,cdots,a_3) y=(y1​,y2​,⋯,y3​),x=(x1​,x2​,⋯,x3​),a=(a1​,a2​,⋯,a3​)利用 b a c k w a r d ( ) mathrm{backward}() backward()求 y boldsymbol{y} y关于 x boldsymbol{x} x的梯度的命令为

Jacobian-vecotr = y.backward(torch.FloatTensor([a]))

返回的结果是一个向量,并且每个分量值的数学计算结果为 J a c o b i a n _ v e c t o r ( i ) = a 1 y 1 x i + a 2 y 2 x i + a 3 y 3 x i + ⋯ + a m y m x i (1) tag{1}mathrm{Jacobian_vector(i)}=a_1 frac{y_1}{x_i}+a_2frac{y_2}{x_i}+a_3 frac{y_3}{x_i}+cdots+a_m frac{y_m}{x_i} Jacobian_vector(i)=a1​xi​y1​​+a2​xi​y2​​+a3​xi​y3​​+⋯+am​xi​ym​​(1)

实例讲解

假定令 x = ( x 1 , x 2 ) = ( 2 , 3 ) boldsymbol{x}=(x_1,x_2)=(2,3) x=(x1​,x2​)=(2,3), y = ( x 1 2 , x 2 2 ) boldsymbol{y}=(x_1^2,x^2_2) y=(x12​,x22​),则有 ∂ y ∂ x = ( 2 x 1 0 0 2 x 2 ) = ( 4 0 0 6 ) frac{partial boldsymbol{y}}{partialboldsymbol{x}}=left(begin{array}{cc}2x_1&0\0&2x_2end{array}right)=left(begin{array}{cc}4&0\0&6end{array}right) ∂x∂y​=(2x1​0​02x2​​)=(40​06​)根据公式(1)可知,如下命令的结果理论值为

y.backward(torch.FloatTensor([1,1])) => x.grad=(4+0,0+6)=(4,6)
y.backward(torch.FloatTensor([1,0])) => x.grad=(4+0,0+0)=(4,0)
y.backward(torch.FloatTensor([0,1])) => x.grad=(0+0,0+6)=(0,6)

为了验证如上结果,具体的程序代码如下所示:

import torch
from torch.autograd import Variable
FloatTensorList = [torch.FloatTensor([1,1]),torch.FloatTensor([1,0]),torch.FloatTensor([0,1])]
for item in FloatTensorList:
	x = Variable(torch.tensor([2.0 , 3.0]), requires_grad = True)
	y = x**2
	y.backward(item, retain_graph=True)
	print(x.grad)

运行的结果为:

tensor([4., 6.])
tensor([4., 0.])
tensor([0., 6.])

由此可以发现,理论值与实验结果值一致。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/349858.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号