梯度概念回顾
多元函数$f(x_1, x_2, \cdots, x_n)$在点$p_0$处的梯度$\nabla f$是一个n维向量:
\[\begin{bmatrix}\frac{\partial f}{\partial x_1} & \frac{\partial f}{\partial x_2} & \cdots & \frac{\partial f}{\partial x_n}\end{bmatrix}^T\]其次, 多元函数$f$在$p_0$处的梯度向量与该函数过点$p_0$处的等位线的切线向量相互正交。
最重要的是, 沿着梯度$\nabla f$方向向量, 函数$f$的增长速度最快; 相应地, 沿着负梯度, 也就是$-\nabla f$向量的方向, 函数f的值下降地最快。
类比盲人下山的例子
利用迭代法,在⼀个多元函数上去探索极小值的过程,我们可以把它想象成⼀个盲人下山的过程,盲⼈看不到整个山的全貌,不清楚全局,拥有的能力只是去感知他所站⽴位置四周的坡度,而他的⽬标却是要下到山的最低点。
假设盲⼈站在⼭的任意⼀个位置点,开始下⼭的过程,⾸先他感知⼀下⾃⼰四周的⼭坡,选择坡度最陡峭的⼀个⽅向,然后 沿着这个⽅向走⼀小步,到达⼀个新的位置点,然后不断重复上⾯的“感知坡度”-“选择最陡峭的⽅向”-“走⼀小步”的 过程,不断更新⾃⼰的位置点。
最终什么时候停下来呢?那应该是在盲⼈⾝处某个点的时候发现四周坡度已经很“平”了,他就判断⾃⼰下到了⼭底,此时 就能停下来了。
梯度下降法的算法思路
我们从随机的初始点$p_0$开始迭代,这就好⽐那个盲⼈站在了⼭上的任意⼀个位置点上。函数的极小值点在哪,最终该往哪走?我们也不知道,我们 就好⽐那个盲⼈什么也看不到⼀样。
但是,我们也可以利⽤梯度这个⼯具来找到 邻域内具体哪个⽅向上函数的下降速度最快,即 负梯度向量的⽅向,我们沿着它来微小的更新我们取值点的位置,就好⽐盲⼈沿着最陡峭的⽅向走了⼀小步。
我们就不停的重复“计算梯度”—“沿着负梯度的⽅向”—“更新位置值”的过程,直到突然间我们发现,梯度已经很小 了,小于我们预设的阈值,此时的位置点就认定为我们找到的函数的局部极小值点,这就好⽐盲⼈发现四周的坡度已经很平 了。
梯度下降法的背后,其实还是离不开多元函数的⼀阶泰勒展开以及函数的线性近似的思想。
就拿简单的⼆元函数来说, $f(x_1, x_2)$在点$p_0$处的⼀阶泰勒展开式为:
\[f(p) \approx f(p_0) + \nabla f(p_0)(p - p_0)\]这个泰勒近似是在$p_0$的小的邻域范围内近似效果较好,因此迭代的步⼦不能迈得过⼤,太⼤的话$p_0$处的梯度的精度就失效了。
那么进⼀步的,从点$p_0$处迭代到下⼀个点$p_1$,⼆者之间的迭代关系具体是怎样的呢?
按照我们前⾯所说的,我们是按照负梯度$- \nabla f$的向量⽅向,从点$p_0$走到了点$p_1$ ,那么向量$p_1 - p_0$的方向就和$p_0$处的梯度⽅向正好反向,在表达式上满⾜下⾯的关系:
\[\frac{p_1 - p_0}{\mid p_1 - p_0\mid} = - \frac{\nabla f(p_0)}{\mid \nabla f(p_0)\mid}\]我们对表达式稍作调整,就有:
\[p_1 - p_0 = - \frac{\nabla f(p_0)}{\mid \nabla f(p_0) \mid} \mid p_1 - p_0 \mid\]此时,进⼀步进⾏整理,迭代的关系初⻅雏形:
\[p_1 = p_0 - \frac{\nabla f(p_0)}{\mid \nabla f(p_0) \mid}\mid p_1 - p_0 \mid\]最后, 我们嫩令:
\[\lambda_0 = \frac{\mid p_1 - p_0 \mid}{\mid \nabla f(p_0) \mid}\]整个迭代的关系就简化成了如下的形式:
\[p_1 = p_0 - \nabla f(p_0) \lambda_0\]我们把它⼀般化,就有了最终的迭代公式:
\[p_{k+1} = p_k - \nabla f(p_k)\lambda_k\]这个$\lambda_k$,我们称之为 学习率 ,它是迭代步⻓与梯度向量模的⽐值,我们⼀般把学习率设置为⼀个⽐较小的固定常数。
当坡度陡峭、梯度值较⼤时,我们的步⻓相应变⼤,快速下⼭,而当我们快要接近⼭底,坡度变得平缓,梯度变小的时候,步⻓也相应变小,以免⼀⼤步跨过极小值点 的情况发⽣。