Deep Learning 1 -- autograd 自动求梯度

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. ?.

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值