MXNET深度学习框架-02-autograd求导

Autograd求导

在机器(深度)学习中,我们通常使用梯度下降的方法来求解参数的最优解,在回归\分类模型中,通常对损失函数进行梯度(优化)求解,但在一个数据量十分庞大的模型中,手工沿着梯度方向更新模型并不现实。因此,mxnet中提供了一个autograd包来自动化求导。

1、为变量附上梯度
首先先定义一个函数f(x)= 2 x 2 2*x^2 ,接下来对其进行求导。

x=nd.array([[1,2],[3,4]]) # x的初始值
x.attach_grad() # 计算x的导数时,需要一个地方来存放x的导数,使用NDarra中的attach_grad()来申请
# 下面定义f(x)
with ag.record():# mxnet不会记录用于求导的计算图,需要使用ag.record()来进行记录
    y=2*(x**2)
    print(y)
y.backward() # 求导
print(x.grad)

运行结果:
在这里插入图片描述
由于f(x)的导数g(x)=4*x,所以把x代入可得上述结果。

2、控制流求导
当逻辑中包含if、else等条件或循环命令时,依旧可以进行求导

def f(a): # 条件函数
    b=a*2
    while nd.norm(b).asscalar()<1000: # norm()是对所有元素求平方在相加,最后开根号
        b=b*2
    if nd.sum(b).asscalar()>0:
        c=b
    else:
        c=100*b
    return c
a=nd.random_normal(shape=3)
a.attach_grad()
with ag.record():
    c=f(a)
c.backward()
print(a.grad)

运行结果:
在这里插入图片描述
f(a)的求导函数为g(a)=c/a,我们可以验证一下:

print(c/a)  # f(a)求导结果

运行结果:
在这里插入图片描述
所有代码:

import mxnet.autograd as ag
import mxnet.ndarray as nd

'''---为变量附上梯度---'''
# 求解f(x)=2*(x^2)
x=nd.array([[1,2],[3,4]]) # x的初始值
x.attach_grad() # 计算x的导数时,需要一个地方来存放x的导数,使用NDarra中的attach_grad()来申请
# 下面定义f(x)
with ag.record():# mxnet不会记录用于求导的计算图,需要使用ag.record()来进行记录
    y=2*(x**2)
    print(y)
y.backward() # 求导
print(x.grad)

'''---对控制流求导---'''
def f(a): # 条件函数
    b=a*2
    while nd.norm(b).asscalar()<1000: # norm()是对所有元素求平方在相加,最后开根号
        b=b*2
    if nd.sum(b).asscalar()>0:
        c=b
    else:
        c=100*b
    return c
a=nd.random_normal(shape=3)
a.attach_grad()
with ag.record():
    c=f(a)
c.backward()
print(a.grad)
print(c/a)  # f(a)求导结果

发布了88 篇原创文章 · 获赞 39 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Daker_Huang/article/details/104879597