33.2_使用牛顿法进行优化
33.2 使用牛顿法进行优化
下面使用牛顿法进行优化。回顾之前的内容,使用牛顿法进行优化的式子如下所示。
如式子33.1所示,我们将使用函数 的一阶导数和二阶导数来更新 。这次试着使用DeZero来自动求解。
steps/step33.py
import numpy as np
fromdezero import Variable
deff(x): $\mathrm{y} = \mathrm{x}^{**}4 - 2\mathrm{*}\times \mathrm{x}^{**}2$ return y
x=Variable(np.array(2.0))
iters $= 10$
fori in range它是: print(i,x)$\mathbf{y} = \mathbf{f}(\mathbf{x})$
x.cleargrad()
y.backupcreate_graph=True)
gx=x.grad
x.cleargrad()
gx.backup()
gx2=x.grad
x.data $= =$ gx.data/gx2.data上面的代码以步骤29中实现的代码为基础。之前的代码采用了手动计算二阶导数的做法,而这次我们通过执行两次backward方法来实现自动微分。运行上面的代码会输出以下 值的更新过程。
0 variable(2.0)
1 variable(1.4545454545454546)
2 variable(1.1510467893775467)
3 variable(1.0253259289766978)
4 variable(1.0009084519430513)
5 variable(1.0000012353089454)
6 variable(1.000000000002289)
7 variable(1.0)
8 variable(1.0)
9 variable(1.0)从上面的结果可以看出,迭代7次就可以到达最小值1。这个结果与步骤29中的结果相同。也就是说,我们实现了自动使用牛顿法进行优化的方法。
步骤34
sin函数的高阶导数
目前,我们已经实现了几个支持高阶导数的函数了。这些函数的实现都在dezero/core.py中(具体来说是Add类、Mul类、Neg类、Sub类、Div类和Pow类)。本步骤,我们将实现几个新的DeZero函数。

今后我们会把DeZero的函数添加到dezero/functions.py中。这样在其他文件中就可以使用fromdezero-functions import sin来导入DeZero的函数了。