梯度下降是一个优化算法,为什么是梯度呢?为什么不是硬度?长度?零度?百度?
优化问题分成无约束优化和有约束优化,有约束优化最终都要调整成无约束优化问题,所以我们直接看无约束优化问题,它的标准形式如下:
严格的数学定义里要求是一个平滑函数,一般来说是向量,比如机器学习里面动不动就是上百维的,我们的目标是找到一个使得最小,小学二年级在学习完微积分后我们知道最小值肯定出现在一阶导数等于0的时候,可以使一阶导数等于0的叫驻点,那你可能就要问了,既然可以得到解析解(analytical solution/closed solution),为什么还要用梯度下降求呢?原因大概如此:如果极其复杂的话,计算它的一阶导数非常困难,其次还得让计算机求解
为了求解一个问题,引入另一个复杂问题~这不是解决问题的思路~所以才会出现优化算法。
求解优化问题肯定脱离不了大概也许是计算机世界最伟大的思想——迭代,给定一个初始的,叫它, 通过某种策略,得到一个新的,叫它,要求,再找一个新的,叫,同样要求,一只更新 ,一直得到更小的,直到您满意为止,如何从到直到就是各种优化算法干的活,简单点说就是如何从大概有两种思路,一种叫线性搜索(Linear Search),另一种叫信任域(Trust Range),Trust Range我没仔细看过,不瞎指挥~梯度下降属于线性搜索。
既然要求,再次迭代的函数值要小于这次的函数值,只要每次迭代都能保证这样,函数值就会一直变小,多么美好的愿景(耗子尾汁),如何得到 呢?这里需要引荐一个人,Taylor
当然不是霉霉,而是下面这位:
以这位泰勒命名的定理,泰勒定理,还记得么?
定理:
设 是一个正整数。如果定义在一个包含 的区间上的函数 在 点处 次可导,那么对于这个区间上的任意 ,都有:
其中的多项式称为函数在a 处的泰勒展开式,剩余的是泰勒公式的余项,是的高阶无穷小。
上面定理来自维基百科泰勒公式,看起来就很伤吧,没关系,这不重要,放在我们的情况下可以这样解释,新引入一个,如果这个足够小的话,近似等于,这里为啥把一阶导数换成梯度符号,首先因为帅,其次因为简书不支持上面一撇的写法。当然计算二阶导数会更准确,但是也更复杂了,使用二阶导数更新的方法叫牛顿方法(newton)超出本文的番位,后面咱再聊,我们现在就使用一阶导数近似:
是向量所以也是向量,是向量就有两部分长度和方向
是大于0的非常小的常数,叫它步长吧,是单位向量,新一轮的函数值可以写成:
,既然要求它小于,所以小于0,既然是让,反正是走一步,那就尽量让这一步的函数值小一点,索性就让这一次迭代的函数值最小得了,当然是在这个常数一定的情况~~~所以新一轮迭代的要求可以写成:
因为每次迭代都发生了变化,所以每次都可以计算上面这个最小化问题,大概跟下山一样,每次下降到一个位置,就需要重新选择一个方向继续下降。其中是上一轮的函数值,已知,大于0的很小的常数,事先给定的,已知,与下面的最小化是等价的:
啰嗦一句,最小化就是最小化,也就是最小化,也就是 最下化,意思就是,下一步在步长固定的情况下尽可能的让小,每一次迭代都尽可能的小,直到到达某个稳定下来~其实这个思路非常贪婪,很可能会掉入局部最小值无法自拔,当然也有解决思路,有机会聊~
怎么解?两个向量做乘法,假如两个向量的夹角,看下图:
根据向量乘法的定义,其中是大于0的,最小等于-1,于是最小等于,此时,像这样:
和的方向是相反的,向量表示就是,有没有一种似曾相识的感觉,没错,梯度下降的公式终于出现了,新一轮可以使尽可能小移动方向是负梯度方向~梯度下降~
如果每次我们都选择负梯度方向更新,在保证的同时,还能保证一直是最小的,每次迭代都会更新,所以下次又可以计算,这样一直迭代下去,总是会找到一个使得最小~当然可能是局部最小。
PS:
既然保证每次迭代,也就是小于0就可以,所以不一定非要选择负梯度方向
只要足够小, 可以选择左边蓝色区域的任意方向,都以保证新一轮的小于。