I. What is autograd?
很多时候,在机器学习(machine learning)中,或者深度学习(Artificial Intelligence)领域,我们要搭建多层的神经网络(Neural Network)来训练我们的模型(modeling),说到底无非是一堆公式的组合叠加。很多时候我们需要对我们公式中的某个变量或几个变量进行求导、求微分。这个时候如果层数过多后,这样的求导工作就显得力不从心了。所以autograd是一个自动求导函数,帮助我们有效的完成这些事情。
II. How to apply autograd to your code?
- import package:
In[1]: from mxnet import autograd, nd
- attach_grad:
对要求导的元素使用attach_grad,通过这个函数来申请存储导数、梯度所需要的内存。相当与一个申请内存的工作,因为有可能求导公式比较复杂,需要耗费大量资源。
In[2]: x = nd.arange(4).reshape((4, 1))
Out[2]:
[[0.]
[1.]
[2.]
[3.]]
<NDArray 4x1 @cpu(0)>
In[3]: x.attach_grad()
- derivative in with-block:
In[4]: with autograd.record():
y = 2 * nd.dot(x.T, x)
# 为了减少计算和内存开销,MXNet在默认情况下不会记录用于求
# 梯度的计算。我们需要用 record 函数记录计算过程。
- backward:
In[4]: y.backward()
# 变量 y 对刚才已经 attach_grad 的变量 x,
# 求梯度(求导数)。
In[5]: x.grad == 4 * x
Out[5]:
[[1.]
[1.]
[1.]
[1.]]
<NDArray 4x1 @cpu(0)>
# 返回全1, 说明两个 ndarray 元素完全一样。
III. summary
首先, 对要求导变量 d y d x \frac{dy}{dx} dxdy中的 x 使 attch_grad 申请求导所需内存,不申请runtime时会报错。 然后就是就是求导过程,这个过程一般需要用 record 函数记录下来,以便后续 backward。That’s it. ?.