Rosenbrock Function

Rosenbrock function是最优化课本中经常出现的函数。stanfordnlp的代码中也经常拿它测试各种最优化方法的正确性和性能。

Rosenbrock function定义如下:

$$ f(x,y)=100(y-x^2)^2+(1-x)^2 $$

函数图像如下:

image

它的一阶导数为:

$$ \frac {\partial }{\partial y} f (x,y) = -200{x}^{2}+200y $$

$$ \frac {\partial }{\partial x}f (x,y) =-400(-{x}^{2}+y)x-2+2x $$

它的二阶导数(Hessian Matrix)为:

$$ \left[ \begin {array}{cc} 1200{x}^{2}-400y+2 & -400x \\ -400x & 200\end {array} \right] $$

当它取极值的时候它的一阶导数等于0。所以由\( \frac {\partial }{\partial y} f (x,y) =0 \) 可得 \( y=x^2 \)。代入\( \frac {\partial }{\partial x} f (x,y) =0 \)的式子中可解得它只有唯一解x=1,y=1。

把(1,1)代入Hessian矩阵中得到

$$ \left[ \begin {array}{cc} 802&-400 \\ -400&200 \end {array} \right] $$

它是正定的。所以f(x,y)在(1,1)这一点取得极小值。

等高线图如下:

> with(plots);

> contourplot(100*(-x^2+y)^2+(1-x)^2, x = -3 .. 3, y = -20 .. 20, contours = 20);

image

当使用牛顿迭代法的时候需要用到Hessian矩阵的逆:

> LinearAlgebra:-MatrixInverse( VectorCalculus:-Hessian(100*(-x^2+y)^2+(1-x)^2, [x, y]) );

$$ H^{-1} = \left[ \begin {array}{cc} \frac{1}{2(200{x}^{2}-200y+1)}&{\frac {x}{200{x}^{2}-200y+1}} \\ {\frac {x}{200{x}^{2}-200y+1}}&{\frac {600{x}^{2}-200y+1}{40000{x}^{2}-40000y+200}}\end {array} \right] $$

在它右边乘以梯度后得到

$$ p=\frac{1}{200x^2-200y+1}\begin{bmatrix} x-1 \\ -200x^4+(400y+1)x^2-2x-200y^2+y
\end{bmatrix} $$

p就是牛顿迭代法中的搜索方向。

此博客中的热门博文

在windows下使用llvm+clang

少写代码,多读别人写的代码

tensorflow distributed runtime初窥