c++ vector向量直接赋值_vector-Jacobian product 解释 ---- pytorch autograd

fd4253bedfb0e42df682ae65f8255867.png

这篇文章将要解释pytorch autograd文档中的vector-Jacobian product

文章由pytorch 官方文档中的这段话引出。

38d6ef496686d0649f05b4ecd0d458bb.png

首先,雅各比矩阵J计算的是向量Y对于向量X的导数。这里假设向量X[x1,x2,...,xn]是某个model中的weight。而Y[y1,y2,...,yn]进而由X经过某个函数f产生。那么在backpropagation时,我们要求得就是这个雅各比矩阵J

f76a15cade9d5fb2be9fd4a6ccd23059.png

那么为什么又要求vector-Jacobian product呢?

首先复习一下backpropagation

0b263f29f38032905f861ba27b20592b.png

在进行backpropagation的过程,其实就是本层节点的导数与上流节点的导数的乘积。(local gradient * upstream gradient)

那么我们可以假设,在上面Y = f(X)的基础上,在引入一层:l = g(Y),其中g是一个新的函数,l是标量。

那么由链式法则,我们可以知道,l对于X的导数即为l对于Y的导数与Y对于X的导数的乘积。

这里再假设,向量v就是l对于Y的导数。

9a33317a357b885406952d122355be8e.png

那么,l对于X的导数就是:

f2d18a3452b24ef30b3f63ec821c1b8b.png

上面的公式从右往左看,说明的问题就是:当我新增加一层l = g(Y)时,l关于X的导数直接用l关于Y的导数和之前代表导数的雅各比矩阵J进行乘法即可。这个乘法,就是vector-Jacobian product

至于为什么,l关于Y的导数只有一列,因为l是标量。

所以,pytorch函数backward()进行的就是vector-Jacobian product操作。backward的参数即为v,调用者即为Y。由于v就是l关于Y的导数,所以vY的形状要相同。若Y为标量,则不需要加参数。

x = torch.randn(3, requires_grad=True)

y = x * 2
while y.data.norm() < 1000:
    y = y * 2

print(y)

Out:

tensor([-1864.6609, -473.0628, 259.2955], grad_fn=<MulBackward0>)
v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)

print(x.grad)

Out:

tensor([1.0240e+02, 1.0240e+03, 1.0240e-01])
y.backward()

Out:

RuntimeError: grad can be implicitly created only for scalar outputs

csdn链接:

CSDN-专业IT技术社区-登录​blog.csdn.net

Reference:

pytorch autograd​pytorch.org cs231n​www.youtube.com Medium towards datascience​towardsdatascience.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值