Loading

《动手学深度学习》 第二天 (自动求梯度)

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

在这里插入图片描述

posted @ 2020-04-08 09:26  XiaoJ_c  阅读(145)  评论(0)    收藏  举报