ITPub博客

首页 > IT职业 > IT图书 > NDArray自动求导

NDArray自动求导

IT图书 作者:nike_hao 时间:2021-09-09 09:15:24 0 删除 编辑

NDArray可以很方便的求解导数,比如下面的例子:

图片描述

 用代码实现如下:

图片描述

 1 import mxnet.ndarray as nd 
 2 import mxnet.autograd as ag 
 3 x = nd.array([[1,2],[3,4]]) 
 4 print(x) 
 5 x.attach_grad() #附加导数存放的空间 
 6 with ag.record(): 
 7     y = 2*x**2 
 8 y.backward() #求导
  9 z = x.grad #将导数结果(也是一个矩阵)赋值给z10 print(z) #打印结果

图片描述

[[ 1.  2.] [ 3.  4.]][[  4.   8.] [ 12.  16.]]

 

对控制流求导

NDArray还能对诸如if的控制分支进行求导,比如下面这段代码:

图片描述

1 def f(a):2     if nd.sum(a).asscalar()

图片描述

数学公式等价于:

图片描述

这样就转换成本文最开头示例一样,变成单一函数求导,显然导数值就是x前的常数项,验证一下:

图片描述

import mxnet.ndarray as nd
import mxnet.autograd as agdef 
f(a):    if nd.sum(a).asscalar()

图片描述

x1=[[ 1.  2.] [ 3.  4.]]
y1=[[ 2.  4.] [ 6.  8.]]
x1.grad=[[ 2.  2.] [ 2.  2.]]
x2=[[ 2.  4.] [ 6.  8.]]
y2=[[ 2.  4.] [ 6.  8.]]
x2.grad=[[ 1.  1.] [ 1.  1.]]

 

头梯度

原文上讲得很含糊,其实所谓头梯度,就是一个求导结果前的乘法系数,见下面代码:

图片描述

 1 import mxnet.ndarray as nd 
 2 import mxnet.autograd as ag 
 3  
 4 x = nd.array([[1,2],[3,4]]) 
 5 print("x=") 
 6 print(x) 
 7  
 8 x.attach_grad() 
 9 with ag.record():
 10     y = 2*x*x
 11 
 12 head = nd.array([[10, 1.], [.1, .01]]) #所谓的"头梯度"13 print("head=")14 print(head)15 y.backward(head_gradient) #用头梯度求导16 17 print("x.grad=")18 print(x.grad) #打印结果

图片描述

x=[[ 1.  2.] [ 3.  4.]]
head=[[ 10.     1.  ] [  0.1    0.01]]
x.grad=[[ 40.           8.        ] [  1.20000005   0.16      ]]

对比本文最开头的求导结果,上面的代码仅仅多了一个head矩阵,最终的结果,其实就是在常规求导结果的基础上,再乘上head矩阵(指:数乘而非叉乘)

图片描述

 

链式法则

先复习下数学

图片描述

注:最后一行中所有变量x,y,z都是向量(即:矩形),为了不让公式看上去很凌乱,就统一省掉了变量上的箭头。NDArray对复合函数求导时,已经自动应用了链式法则,见下面的示例代码:

图片描述

 1 import mxnet.ndarray as nd 
 2 import mxnet.autograd as ag 
 3  
 4 x = nd.array([[1,2],[3,4]]) 
 5 print("x=") 
 6 print(x) 
 7  
 8 x.attach_grad() 
 9 with ag.record():
 10     y = x**2
 11     z = y**2 + y
 12 
 13 z.backward()
 14 
 15 print("x.grad=")
 16 print(x.grad) #打印结果
 17 
 18 print("w=")
 19 w = 4*x**3 + 2*x
 20 print(w) # 验证结果

图片描述

x=[[ 1.  2.] [ 3.  4.]]
x.grad=[[   6.   36.] [ 114.  264.]]
w=[[   6.   36.] [ 114.  264.]]

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/3643/viewspace-2809035/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-14

  • 博文量
    84
  • 访问量
    668