MXNet学习:梯度

在MXNet中,计算一个函数的梯度,一般有一个固定的套路:

from mxnet import autograd

1、申请存储梯度所需要的内存
如,求y=2x关于x的梯度,先要申请梯度x所需要的内存,x是什么形状,计算出来的梯度就是什么形状

x.attach_grad()

2、调用record函数来记录有关梯度的计算,即定义一种计算的规则,比如定义y=2x或者更复杂的计算规则;计算规则写在with语句的里面

with autograd.record():

3、求梯度
Compute the gradients of this NDArray w.r.t variables.(w.r.t是关于的意思,是with respect to的缩写),从计算图的顶部自上而下求梯度

backward()

4、查看梯度
Returns gradient buffer attached to this NDArray.

x.grad

一个例子:y=2x^2的梯度:

from mxnet import ndarray as nd
from mxnet import autograd

x = nd.arange(4).reshape(4, 1)
x.attach_grad()
with autograd.record():
    y = 2 * nd.dot(x.T, x)
y.backward()
x.grad

x的梯度是
MXNet学习:梯度_第1张图片
注意:y如果不是一个标量,MXNet默认先对y中元素求和得到新的变量,再求该变量有关x的梯度,下面举个例子:

x = nd.arange(4).reshape(2, 2)
x.attach_grad()
with autograd.record():
    y = 2 * nd.dot(x.T, x)
y.backward()
x.grad

x的梯度是
在这里插入图片描述
怎么算的?按照上面的说法:
MXNet学习:梯度_第2张图片

其它:

1、Gluon是MXNet提供的接口,可以更方便地开发深度学习应用。Gluon里参数(如权重参数weight、偏差参数bias)类型为Parameter类,可以通过grad()函数来访问参数的梯度数值
MXNet学习:梯度_第3张图片
2、使用NDArray.detach()函数可以将这个NDArray从计算图中分离出来,使它成为一个叶子节点,避免了梯度计算开销越来越大,通俗来讲,梯度到这儿就被截住了,比如可以应用在在循环神经网络中,这个函数很重要
在这里插入图片描述
举例说明:有一个计算图:
MXNet学习:梯度_第4张图片
现在从Z开始求梯度,假如只想计算B网络的梯度,而不想计算A网络的,那么可以把Y通过detach()函数分离出来,使它成为一个叶子节点,这样就与A网络无关了,梯度到Y就被截住了,具体实现:

y=A(x)
z=B(y.detach())
z.backward()

你可能感兴趣的:(MXNet,深度学习,机器学习,深度学习)