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

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值