我们经常需要对函数求梯度(gredient),本文将介绍如何使用MXNet提供的autograd模块来对自动求梯度。
from mxnet import autograd,nd
为了求有关变量x的梯度,我们需要先调用attach_grad函数来申请存储梯度所需要的内存。
x.attach_grad()
下面定义有关变量x的函数。为了减少计算和内存开销,默认情况下MXNet不会记录用于求梯度的计算。我们需要调用record函数来要求MXNet记录与求梯度有关的计算。
with autograd.record():
y=2*nd.dot(x.T,x)
Pytorch中是根据前向传播生成计算图的,如果最终生成的函数是标量,那么这是一般情况下的backward反向传播。如果y不是一个标量,MXNet将默认先对y中元素求和得到新的变量,再求该变量有关x的梯度。
默认情况下autograd还会将运行模式从预测模式转为训练模式。这可以通过is_training函数来查看。
print(autograd.is_training())
with autograd.recored():
print(autograd.is_training())
def f(a):
b=a*2
while b.norm().asscalar()<1000:
b=b*2
if b.sum().asscalar()>0:
c=b
else:
c=100*b
return c
a=nd.random.normal(shape=1)
a=attach_grad()
with autograd.record():
c=f(a)
c.backward()