33.2_使用牛顿法进行优化

33.2 使用牛顿法进行优化

下面使用牛顿法进行优化。回顾之前的内容,使用牛顿法进行优化的式子如下所示。

xxf(x)f(x)(33.1)x \leftarrow x - \frac {f ^ {\prime} (x)}{f ^ {\prime \prime} (x)} \tag {33.1}

如式子33.1所示,我们将使用函数 f(x)f(x) 的一阶导数和二阶导数来更新 xx 。这次试着使用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方法来实现自动微分。运行上面的代码会输出以下 ×\times 值的更新过程。

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的函数了。