对attach_grad和backward的理解

这篇博客探讨了在MXNet中如何使用attach_grad和backward进行梯度计算。attach_grad()用于标记变量以便记录其梯度,而backward()则根据链式法则计算指定变量的梯度。头梯度(heads)是乘法系数,影响最终梯度值。默认头梯度是单位矩阵,未定义时会使用ones_like()。通过这两个函数,可以有效地进行反向传播以求解神经网络的优化问题。
摘要由CSDN通过智能技术生成
from mxnet import autograd as ag
from mxnet import ndarray as nd
aa = nd.array([3,4,5,6])
aa.norm()
[9.273619]
<NDArray 1 @cpu(0)>

aa.norm()默认为二范数(平方和开根号)

aa.norm().asscalar()
9.273619

头梯度和链式法则

此时,由链式法则:

x = nd.array([[1,2],
              [3,4]])
x.attach_grad()
with ag.record():
    y = x*2
    z = y*x
head_gradient = nd.array([[10,1.],
                          [.1,.01]])
# 通过z.backword()来进行求导,如果z不是一个标量,z.backward()等价于nd.sum(z).backward().
z.backward(head_gradient)

x
[[1. 2.]
 [3. 4.]]
<NDArray 2x2 @cpu(0)>
y
[[2. 4.]
 [6. 8.]]
<NDArray 2x2 @cpu(0)>
x.grad
[[40.    8.  ]
 [ 1.2   0.16]]
<NDArray 2x2 @cpu(0)>

所谓头梯度,就是一个求导结果前的乘法系数:在本例中:

[ 10

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值