欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-06 10:00:38
...

Autograd求导

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

1、为变量附上梯度
首先先定义一个函数f(x)=2x22*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)

运行结果:
MXNET深度学习框架-02-autograd求导
由于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)

运行结果:
MXNET深度学习框架-02-autograd求导
f(a)的求导函数为g(a)=c/a,我们可以验证一下:

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

运行结果:
MXNET深度学习框架-02-autograd求导
所有代码:

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)求导结果

相关标签: mxnet