MXNet提供自动求梯度,from mxnet import autograd as ag,nd
这有个很大的好处在于,不需要去写求导的式子,只需要知道原函数是什么样,然后需要给哪个求导就给谁开一个求导内存就行。
基本步骤:
- 创建初始变量x
- 求关于x的梯度,所以为x申请一个储存梯度的内存x.attach_grad()
- 定义关于x的函数(被求导的函数)。减少计算和内存开销,MXNET默认不记录求梯度的计算。调用record记录
调用record后,mxnet默认将“autograd”的运行模式从预测模式转为训练模式。用is_training查看 - With autograd.record():
y = fun(x) - 调用backward()求导数
注意:y是一个标量。接下来我们可以通过调用backward函数自动求梯度。需要注意的是,如果y不是一个标量,MXNet将默认先对y中元素求和得到新的变量,再求该变量有关x的梯度。
- 输出求导结果x.grad,基于x为变量,y为函数的导数
- Assert函数-->断言功能,
lists = [0,1,2]
assert len(lists) >=5,'列表元素个数小于5'
如果为假,则反馈
AssertionError: 列表元素个数小于5
- 使用MXNET的一个便利之处,即使函数的计算图里包含了python的控制流(如条件和循环控制),我们也有可能对变量求梯度
【来自讨论区问题集合】
1.MXNET默认是不储存求梯度的过程的,什么意思呢?如下面问题:
可以看出,中间变量y的求导是没有被记录下来的,这是为了节约内存的原因。那么如果想要得到y的求导结果怎么做呢?