# 梯度下降法的概念
对于一个线性回归的损失函数 ,我们希望找到它的最小值 。而梯度下降就是一种可用于尝试任何函数最小化的算法,这不仅仅局限与线性回归的损失函数。
梯度下降法是一种常用的一阶 (first-order) 优化方法,是求解无约束优化问题最简单、最经典的方法之一。考虑一个无约束优化问题 ,其中 为连续可微函数,如果能够构造一个序列 并能够满足 。那么我们就能够不断执行该过程即可收敛到局部极小点,可参考下图。
那么这个问题的关键就在于:下一个 是从上一个 沿着哪一个方向走一小步 得到的?
对于一元函数来说, 自会有两个走向:要么是正方向 ,要么是负方向 。判断应该往哪个方向走其实很简单,利用在该点的导数,即梯度,就可以了。若该点的导数 ,说明正方向是使得函数值增大的方向,则应该往负方向走;反之,则相反。因此,我们可以令走的步长为:
其中 是该点的导数值。而 是一个大于零的小量,这是一个很重要的量,我们称它为学习率。
这一方法也很容易进行高维推广,例如二元函数 。我们可以将它两个方向进行梯度下降,下降的步长为:
# 梯度下降法会遇到的问题
梯度下降法是一种简单的、经典的最优化算法。但这并不会说明它是完美的,它会遇到如下的问题:
- 运用梯度下降法要选择初始点与学习率。这个过程本就具有随机性与不确定性,一个函数的极小值点也许有很大。却决于初始点和学习率的不同,梯度下降法也许会收敛到不同的极小值点,而这些极小值点不一定是最小点。这一问题在一元函数就会遇到,推广到高维那么就会更棘手了。
- 学习率的选择很重要。学习率太大,会导致步长太大,也许就无法收敛到极小值点;学习率太小,步长太短,收敛速度就会太慢,并且也许会收敛到一个不想要的 “小坑” 里面无法爬出来,而不能收敛到想要的最小值。过大或过小的学习率都会影响算法的效率,因此学习率可以作为超参数由人为指定,也可以在搜索过程中由算法本身自适应调节。
# 梯度下降法的改进
# 自适应学习率的 Bold Driver 方法
自适应学习率的 Bold Driver 方法的操作很简单,就是将函数 与其之前的值 进行比较:
- 若函数值的确减小了,则将学习率 增加一小部分(通常为 );
- 若函数值是增加了,则撤销最后一步 的移动,并大幅减小 (通常减小 )。
该方法实现了自适应学习率调节:在梯度下降取得成功时会尝试更大的步伐试探;如果失败,则自己可能走在错误的相反斜率上(意味着函数可能已经到达了一个棘手的区域),此时就大幅度减小步长以进行更保守的试探。
该方法即为有效。但在函数包含大量噪声的时候容易失效(容易钻到某个微小谷中无法跳出)。
# 淬火学习率调整法
在函数包含大量噪声时,可以考虑采用淬火学习率调整法,学习率随迭代次数如下变换:
其中 为已迭代的次数。 是设置的一个较大值。该算法的特点是:在初始附近的步骤保持几乎不变的学习率,随着算法进行到 后显著减小学习率。
# 市场上相对成熟的梯度下降算法
- :提前使用下一点的梯度。
- :存储在各个方向上震荡的历史积累,并以此作为震荡抑制,但容易抑制过度。
- :为梯度下降引入一个惯性,即,有助于减缓收敛过程出现的振荡,并且可以冲出局部最优解。
- :存储在各个方向上震荡的历史积累,并以此作为震荡抑制,但容易抑制过度。
- :相比 grad_squared 加了一个 decay ,让阻力不太过分。
- :整合了 momentum 派系以及阻力派系。
......