2.3、自动求梯度
MXNet提供的autograd模块
可以用来自动求梯度。
2.3.1 一个简单的栗子
这里我们要求对函数 y = 2xTx (2乘以x的转秩乘以X)求关于列向量 x 的梯度。(使用jupyter notebook)
1、 创建变量x,并赋初值
x = nd.arange(4).reshape((4,1)) # 4行一列
x
2、 调用attach_grad函数
来申请存储梯度所需要的内存
x.attach_grad() #为了求有关变量x的梯度
3、 为减少计算和内存开销,默认条件下MXNet不会记录用于求梯度的计算,这里我们需要调用 record函数
来要求MXNet记录与求梯度有关的计算
with autograd.record():
y = 2 * nd.dot(x.T, x)
4、 通过调用backward函数自动求梯度
y.backward()
这里可以验证一下答案是否正确,我们知道,原函数的梯度是4x。
assert(x.grad - 4 * x).norm().asscalar() == 0
x.grad
2.3.2 训练模型和预测模型
默认情况下,autograd会将运行模式从预测模式转为训练模式,这时可以通过调用 is_training
函数来查看
print(autograd.is_training())
with autograd.record():
print(autograd.is_training())
2.3.3 对Python控制流求梯度
即使函数的计算图包含了Python的控制流,我们还是可能使用MXNet对变量求梯度。
example
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
仍然使用record函数记录计算,调用backward函数求梯度
a = nd.random.normal(shape=1)
a.attach_grad()
with autograd.record():
c = f(a)
c.backward()
验证是否正确
a.grad == c / a