MXNet中矩阵x的2x²导数为何等于4x?
关于MXNet中矩阵求导的疑问解答
先看你提到的代码示例:
from mxnet import nd from mxnet import autograd x = nd.array([[1, 2], [3, 4]]) x.attach_grad() with autograd.record(): y = 2* x * x y.backward() print(x.grad)
你疑惑的点在于:x是2×2矩阵,为什么求导后x.grad等于4*x?
核心原因是这里的运算和求导都是逐元素进行的:
- 首先,
y = 2 * x * x是对x中的每个元素独立计算的,也就是对于x里的每个元素x_ij,对应的y元素是2 * x_ij * x_ij = 2x_ij²。 - 当调用
y.backward()时,默认会把y中所有元素的和作为总损失来求导(等价于y.sum().backward())。对于每个x_ij,它只影响对应的y_ij,所以对x_ij的导数就是2*2x_ij = 4x_ij,对x中其他元素的导数都是0。 - 最终
x.grad的每个元素就是对应x_ij的导数,也就是4*x_ij,整体来看就是4*x。
简单说,矩阵在这里就是多个独立实数元素的集合,逐元素运算的导数自然也是逐元素对应的结果,所以会得到和实数情况一致的逐元素导数。
内容的提问来源于stack exchange,提问作者firstname gklsodascb
相关产品推荐
相关产品推荐

