梯度下降算法

UTF8gbsn

梯度

什么是梯度?

  • 梯度和导数有关但是梯度却不是导数.

  • 直观的解释是把梯度看做是一个向量.这个向量指向函数值增长最快的方向.它的摸长就是增长的比率.

某一个点x0\mathbf{x_0}的梯度的数学定义如下.
f(x0)=(fx1(x0),fx2(x0),,fxn(x0))\nabla f(\mathbf{x_0})=(\frac{\partial f}{\partial x_1}(\mathbf{x_0}), \frac{\partial f}{\partial x_2}(\mathbf{x_0}), \cdots, \frac{\partial f}{\partial x_n}(\mathbf{x_0}))

画出梯度的图象

比如我们来画出函数 f(x,y)=sin(x+y2)f(x,y)=sin(x+y^2) 的图象.
梯度下降算法
\newpage
它的梯度
梯度下降算法

  • 箭头方向就是梯度的方向.

  • 箭头的长度就是梯度的增量幅度.

我们画出函数的登高线让大家和梯度比较起来观察更为方便.

梯度下降算法

梯度下降

对梯度有了直观的认识,那么梯度下降算法就很简单了.线来看看梯度下降算法的描述.
梯度下降算法就是从某个点x0\mathbf{x_0}出发,按照梯度的反方向,去找到函数的一个局部最小值.如果是凸函数,则可以得到全局最优解.我们就讨论一下一般情况局部最有解的情况.

简单的函数

f(x,y)=x2+y2f(x,y)=x^2+y^2

这个函数的极小值出现在(0,0)(0,0)点.画出图象如下

梯度下降算法

并且我们画出它的梯度图象为.

梯度下降算法

假如我们的出发点位于(1,1).

  • 求出这个点的梯度 (2x,2y)=(2,2)(2x, 2y)=(2,2)

  • 设置我们的移动步长比如s=0.05s=0.05

  • 那么第一次迭代 (x1,y1)=(x0,y0)sf(x0,y0)(x_1,y_1)=(x_0,y_0)-s\nabla f(x_0,y_0)
    用在例子上就是 (x1,y1)=(1,1)0.05(2,2)=(0.9,0.9)(x_1,y_1)=(1,1)-0.05(2,2)=(0.9, 0.9)

  • 第二次迭代. (x2,y2)=(x1,y1)sf(x1,y1)(x_2,y_2)=(x_1,y_1)-s\nabla f(x_1,y_1) 用在列子上是
    (x2,y2)=(0.9,0.9)0.05(1.8,1.8)=(0.81,0.81)(x_2,y_2)=(0.9,0.9)-0.05(1.8,1.8)=(0.81,0.81)

如果你反复运行100次.你会得到
(x100,y100)=(2.65614e05,2.65614e05)(x_{100}, y_{100})=(2.65614e-05, 2.65614e-05)

这个点已经很接近(0,0)了.可见梯度下降算法的确找到了这个局部最有解.当然我们给出的函数实际上是一个凸函数.所以你可以很容易的得出.这个局部最优解就是全局最优解.当然梯度下降算法的停止条件是两次迭代之间的误差小于某个范围.那么我们来看看迭代的时候点的轨迹运动是怎么回事?

梯度下降算法

我们再看一个稍微复杂一点的函数.这个函数图象为 f(x,y)=Cos(y)Sin(x)f(x,y)=Cos(y)Sin(x)

我们出发点为(1.0,0.5)
梯度下降算法
梯度下降算法