梯度下降是一个优化算法,为什么是梯度呢?为什么不是硬度?长度?零度?百度?

优化问题分成无约束优化和有约束优化,有约束优化最终都要调整成无约束优化问题,所以我们直接看无约束优化问题,它的标准形式如下: 

$$\min_{x}f(x)$$

严格的数学定义里要求$f(x)$是一个平滑函数,一般来说$x$是向量,比如机器学习里面动不动就是上百维的,我们的目标是找到一个$x$使得$f(x)$最小,小学二年级在学习完微积分后我们知道最小值肯定出现在$f(x)$一阶导数等于0的时候,可以使一阶导数等于0的$x$叫驻点,那你可能就要问了,既然可以得到解析解(analytical solution/closed solution),为什么还要用梯度下降求呢?原因大概如此:如果$f(x)$极其复杂的话,计算它的一阶导数非常困难,其次还得让计算机求解$f'(x)=0$为了求解一个问题,引入另一个复杂问题~这不是解决问题的思路~所以才会出现优化算法。

求解约束问题肯定脱离不了计算机世界最伟大(也许)的思想——迭代,给定一个初始$x$,叫它$x_0$,通过某种策略可到一个新的$x$,叫它$x_1$,要求$f(x_1) < f(x_0)$,再找一个新的$x$,叫$x_2$,要求$f(x_2) < f(x_1)$,一直这样更新$x$,一直得到更小的$f(x)$,直到你满意为止,如何从$x_0$到$x_1$直到$x_n$就是各种优化算法干的活,大概有两种思路,一种叫线性搜索(Linear Search),另一种叫信任域(Trsut Range),Trust Range是在一个局部空间中用一个简单函数替换原函数得到计算该简单函数的最小值,依次执行这个过程。梯度下降属于线性搜索,于是咱们还是主要说线性搜索。

既然要求$f(x_{k+1}) < f(x_{k})$,只要保证每次迭代都能保证函数值变小不就行了?如何做呢?这里需要引荐一个人,Taylor

当然不是霉霉,是下面这位:

以这位泰勒命名的公式还记的吗?

设$n$是一个正整数。如果定义在一个包含$a$的区间上的函数$f$在点$a$处$n+1$次可导,那么对于这个区间上任意$x$,都有:

$$f(x) = f(a) + \frac{f^{‘}(a)}{1!}(x -a ) + \frac{f^{(2)}(a)}{2!}(x – a)^2 + … + \frac{f^{(n)}(a)}{n!}(x – a)^n + o[(x-a)^n]$$

其中的多项式称为函数在$a$处的泰勒展开式,剩余的$R_{n}(a)$式泰勒公式的余项,是$(x-a)^n$的高阶无穷小.

来自维基百科

放在我们的情况下,可以这样解释,新引入一个变量$\Delta x = x_{k+1} – x_{k}$,如果这个$\Delta x$足够小的话,$f(x_{k+1})$近似等于$f(x_k) + \nabla f(x_k) \cdot \Delta x$,这里把导数换成梯度符号$\nabla$一般我们碰到的是高纬向量。 当然也可以计算二阶导数,这样近似的更准确,但是也变得复杂了,有机会再聊这个,现在我们就用一阶导数近似

$$f(x_{k+1}) \approx f(x_k + \Delta x) \sim f(x_k) + \nabla f(x_k)\cdot \Delta x$$

$\Delta x$是向量,是向量就有两个部分,长度和方向,$\Delta x = \alpha \rho_{k}$,$\alpha$是大于0的非常小的常数,叫它步长,$\rho_k$是单位向量,新一轮的函数值可以写成

$$f(x_k) + \alpha \rho_{k}^{T} \nabla f(x_k)$$

既然要求它小于$f(x_k)$,只能加号右边的$\\alpha \rho_{k}^{T} \nabla f(x_k)$部分小于0了,反正是走一步,那索性让这一步尽可能的小吧,最小化这一部分吧,$\alpha$是常数,所以新一轮的目标就是

$$\min \rho_{k}^{T}\nabla f(x_k)$$

啰嗦一句,最小化$\rho_{k}^{T}\nabla f(x_k)$就是最小化$f(x_k) + \alpha \rho_{k}^{T} \nabla f(x_k)$,也就是最小化$f(x_k + \Delta x)$,也就是最小化$f(x_{k+1})$,即下一步再步长$\alpha$固定的情况下尽可能的让$f(x_{k+1})$小,每一次迭代都尽可能的小,直到到达某个$x$稳定下来。实际上这个思路非常贪婪,于是很容易掉进句步最小值无法自拔。

$\min \rho_{k}^{T}\nabla f(x_k)$怎么解? 两个向量做乘法,假如向量的夹脚是$\theta$

根据向量乘法的定义$\rho_{k}^{T} \nabla f(x_k) = ||\rho_{k}|| \cdot ||\nabla f(x_k)|| \cos\theta$,其中$ ||\rho_{k}|| \cdot ||\nabla f(x_k)|| $是大于0的,$\cos \theta$最小是-1,于是$\rho_{k}^{T} \nabla f(x_k)$最小值是$ -||\rho_{k}|| \cdot ||\nabla f(x_k)|| $,此时$\theta = 180^\circ$,像这样

$\rho_k$和$\nabla f(x_k)$的方向是相反的,即$\rho_k = -\nabla f(x_k)$,有没有一种似曾相识的感觉,没错,梯度下降公式终于出现了,新一轮可以使$f(x_{k+1})$最小化的行进方向是负梯度方向。

如果每次我们都选择负梯度方向更新$x$,再保证$f(x_k +\Delta x) < f(x_k)$的同时,还能保证$f(x_k + \Delta x)$一直是最小的,每次迭代都会更新$x$,所以下次又可以计算$\min f(x_k + \Delta x)$,这样一致迭代下去,总会找到一个$x$是的$f(x)$最小,当然有可能是局部最小。

PS:既然保证每次迭代$f(x_{k+1}) < f(x_k)$,也就是$\rho_{k}^{T} \nabla f(x_k)$小于0就行吧,所以$\rho_k$并不一定非要选择负梯度方向,也能是$f(x)$逐渐变小

只要$\alpha$足够小,$\rho_k$可以选择蓝色区域的任意方向,都可以保证新一轮的迭代$f(x_{k+1})$小于$f(x_k)$。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注