28.2_求导

28.2 求导

首先求Rosenbrock函数在 (x0,x1)=(0.0,2.0)(x_0,x_1) = (0.0,2.0) 的导数 yx0\frac{\partial y}{\partial x_0}yx1\frac{\partial y}{\partial x_1} 。使用DeZero可按如下方式实现。

steps/step28.py

import numpy as np   
fromdezero import Variable   
defrosenbrock(x0,x1):  $\mathrm{y} = 100^{*}$  (x1-x0\*\*2)\*\*2+(x0-1)\*\*2 return y   
 $\mathbf{x0} =$  Variable(np.array(0.0))   
 $\mathrm{x1} =$  Variable(np.array(2.0))   
 $y =$  rosenbrock(x0,x1)   
y.backup()   
print(x0.grad,x1.grad)

运行结果

-2.0 400.0

如上所示,先把数值数据(ndearray实例)封装在Variable中,然后根据式子编码。之后只要调用y.backup(),DeZero就会自动求出导数。

执行上面的代码,得到的 ×0\times 0 的导数和 ×1\times 1 的导数分别为-2.0和400.0。将这两个导数以向量的形式汇总起来的(-2.0,400.0)称为梯度或梯度向量。梯度展示了各点上函数的输出值增加得最快的方向。拿前面的例子来说,就是在点 (×0,×1)=(0.0,2.0)(\times 0, \times 1) = (0.0, 2.0) 上,y的值增加得最快的方向是(-2.0,400.0)。这就意味着梯度的反方向(2.0,-400.0)是y的值减少得最快的方向。