数学基础 讨论区

http://zh.diveintodeeplearning.org/chapter_appendix/math.html

常见梯度演算公式有推导 过程吗?

1赞


不知道这样对不对

推导如下:

1赞

数学基础中的练习题:


这个偏导应该是6 * x1 才对?计算结果怎么不对

image
去掉x2的项之后就对了。请问咋回事?


对x2求偏导是对的

2赞

很好的问题,思考了下没想出结果。 希望知道的朋友解答下!

autograde不是用来求函数梯度的吗,可以这么求偏导吗。

原来题目是求f(x)的梯度,所以f(x)的梯度应该是[6x1, 5exp(x2)]。所以我理解里面的x1, x2是向量X[x1, x2]

q = nd.arange(1,3).reshape(1,-1)

q.attach_grad()
with autograd.record():
    p = 3 * q[0,0] *q[0,0] + 5 * nd.exp(q[0,1])
p.backward()
q.grad

输出:
[[ 6. 36.945282]]
<NDArray 1x2 @cpu(0)>

我是新手,刚开始看,有可能理解的不对。

梯度一般是一个向量,偏导数是其中的components,不冲突。

以第一个公式为例:

函数f = A^Tx
函数对x 求梯度,相当于函数对x的各个分量分别求偏导数,然后将结果组成向量。

如此以来,求导就简化为函数f对一元变量 x_1,x_2,…,x_n 求导。最后结果即为:A

其他结果,可以类比得到。

求函数梯度部分,书中的讲解和课程视频中的讲解不完全一致。虽然向量来说,行和列本质上没区别,但是还是希望在求梯度的时候,用统一的标准来确定行向量或者列向量。
example:

  1. 书中内容:
    Screenshot%20from%202019-02-28%2021-11-38

  2. 讲课视频中的内容:
    Screenshot%20from%202019-02-28%2021-12-28

求 Ax关于x的梯度,结果有差别。

@astonzhang aston能请帮忙解释下嘛, 为什么x1.grad 不等于 6*x_1 而是 24*x_1,谢谢!

from mxnet import autograd, nd

x1 = nd.arange(4).reshape((4, 1))
x2 = nd.array([[2], [4], [6], [8]])
print("x1: ", x1)
print("x2: ", x2)

x1.attach_grad()
x2.attach_grad()

print("nd.exp(x2): ", nd.exp(x2))

with autograd.record():
y = 3 * (x1 * x1) + 5 * nd.exp(x2)

print("y: ", y)

y.backward()

print("x1.grad: ", x1.grad)
print("x2.grad: ", x2.grad)

把y值打印出来应该就明白了

请问视频教材链接在哪

这个问题提的挺好的,思考了半天,说说我的猜测结合一下实验结果说说我的理解吧

其实导致这个问题的主要原因还是出现在y的表达式上,因为第一项用了nd.dot表示的是矩阵的点乘,而第二项只是一个标量,为了统一表达,MXNet将nd.dot的点乘也转成了标量,在上面x1的size为4,所以y的表达式结果就变成了y=3*(x1x1+x1x1+x1x1+x1x1) = 3 * 4 * x1 * x1 = 12 * x1 * x1 所以求导的时候x1的梯度就变成了24,需要注意的是此时的梯度还与x1的项数有关

from mxnet import autograd,nd
x1 = nd.arange(5).reshape((-1,1))
x2 = nd.array([[2],[4],[6],[8],[10]])

x1.attach_grad()
x2.attach_grad()
with autograd.record():
y = 3 nd.dot(x1.T,x1) + 5 nd.exp(x2)

y.backward()
print(x1.grad)

[[ 0.]
[ 30.]
[ 60.]
[ 90.]
[120.]]

如果y的表达式统一都为向量或者标量就不会出现这种问题

3赞

https://space.bilibili.com/209599371/
也可以在B站搜索:ApacheMXNet


没有看到正确的答案,自己推导了一遍,验证没问题。楼上网友关于x1梯度为什么不是6x的疑惑,在于公式写的有问题,不需要做矩阵转置

您好, 错误原因在于您的公式计算方式不符合题目中的要求.
x1 = nd.arange(4).reshape([-1,1])
您的公式计算 x1 * x1 的方式为: nd.dot(x1.T,x1)
题中要求的公式应为:
y = 3 * x1 * x1 + 5 * nd.exp(x2)
至于nd.dot 的计算中 x1 的梯度为什么是24 的倍数, 而且如果去掉 nd.exp 就正确了, 我觉得可能是因为自动广播机制, 当去掉 nd.exp, 本质上还是 y 对 x1 向量求导, 而如果加上nd.exp, nd.dot 后会被推广到4x1, 所以求导时 nd.dot 的系数需要增加 4 倍, 梯度计算的是 3 * 4 * 2 * x1.

2赞

MXNet的NDArray哪个方法是求特征值和特征向量的呀?
numpy有eig方法: np.linalg.eig
看了一下MXNet API没找到

未来应该在 mxnet.np 下支持

@reminisce

不清楚的话,就用矩阵式子转化成一般式子先求导,完成后再写出矩阵形式。
比如X‘A={{x1a11+x2a21+…+xnan1},{x1a12+x2a22+…+xnan2},…{x1a1n+x2a2n+…+xn*ann}}
∂y/∂x={{∂y/∂x1},{∂y/∂x2},…{∂y/∂xn}}