from mxnet import autograd, nd
例子:对函数y = 2x⊤x 求关于列向量x 的梯度
from mxnet import autograd,nd
#先创建变量x,并赋初值
x = nd.arange(4).reshape((4,1))
print(x)
#先调用 attach_grad 函数来申请存储梯度所需要的内存
x.attach_grad()
#为了减少计算和内存开销,默认条件下MXNet不会记录求梯度的计算。我们需要调用record函数来要求MXNet记录与求梯度有关的计算
with autograd.record():
y = 2 *nd.dot(x.T,x)
#由于x的形状为(4, 1),y是个标量。接下来我们可以通过调用backward函数自动求梯度。需要注意的是,如果y不是一个标量,MXNet将默认先对y中元素求和得到新的变量,再求该变量有关x的梯度
y.backward()
#验证求出来的梯度是正确的
assert(x.grad - 4 * x).norm().asscalar() == 0
print(x.grad)
输出:
[[0.]
[1.]
[2.]
[3.]]
<NDArray 4x1 @cpu(0)>
[[ 0.]
[ 4.]
[ 8.]
[12.]]
<NDArray 4x1 @cpu(0)>
1.创建变量并初始化
2.申请内存
3.调用record记录
4.自动求梯度
5.验证