台大李宏毅Machine Learning 2017Fall学习笔记 (4)Gradient Descent
这节课首先回顾了利用梯度下降法优化目标函数的基本步骤,然后对梯度下降法的应用技巧和其背后的数学理论支撑进行了详细的介绍。李老师讲解之透彻,真是让人有醍醐灌顶之感~~~
梯度下降法(Gradient Descent)回顾
详细步骤如下两图中所示。值得一提的是:梯度下降的方向是损失函数Loss的等高线的法线方向。
Gradient Descent Tip1: Tuning your learning rates
学习率(learning rate)对函数的优化过程影响很大:若学习率太小,则loss曲线下降太慢;若学习率太大,则loss曲线会卡在某一位置不动或飞上天。。。具体如下图所示。
自适应学习率
为了找到合适的学习率,一种简单的方法是随着迭代步数增加而逐渐降低学习率(一开始离目标远,所以学习率大些,后来离目标近,学习率就小些),并且不同的参数有不同的学习率)。
Adagrad是调整学习率的一种简单有效方法。
对参数更新的表达式稍加整理,如下图示:
仔细看Adagrad的参数更新表达式,可以看出其中有矛盾的地方:g^t是损失函数L关于参数w的偏导数,g^t越大,迭代步长越大,参数更新越快,但分母实现的效果却恰好相反。
怎样解释这种“矛盾”呢?
直观解释是造成反差,给人以surprise。。。(并不太懂惊喜在哪里......
以loss function为一元二次函数的解释是,在参数迭代更新的过程中,最优步长是:
g^t是一阶导数,用之前算的一阶导数平方和的平方根来表示二阶导。
Gradient Descent Tip2: Stochastic Gradient Descent
随机梯度下降最大的优点是让训练过程变得更快!
GD和SGD比较如下图:
GD:看完所有的examples后更新参数,过程比较稳定,Loss走的方向是按Gradient建议的方向走。
SGD:看完一个example就更新一次参数,如果有20个example就更新20次参数,更快一些。
Gradient Descent Tip3: Feature Scaling
建议把不同的feature缩放到相同的范围内。为啥这么做,以下图为例:
如上图左上所示,feature x1和x2有不同的scale(可以认为x2是x1的100倍)。x1较小,w1对y的影响比较小,Loss在w1方向上比较平滑。因为x2较大,所以w2的轻微变化就会对Loss产生很大的影响,Loss在w2方向上比较sharp。
对GD有何影响?
如上图左下所示,不同参数的更新需要不同的学习率,同一组学习率搞不定。未对feature进行缩放时,更新参数比较难。
上图右下所示,在缩放后,Loss函数的等高线成了圆形,更新参数比较容易。在GD过程中,Loss并不是朝着最低点走,更新参数时,Loss走的方向是顺着等高线的方向走。如果Loss函数的等高线是正圆形,则起始点不管在这个区域的哪个位置都会朝着圆心走。所以在feature scaling后,更新参数比较有效率。
feature scaling的方式有很多,最简单的一种是把不同样本中的同一维的数据进行处理使其符合高斯分布。
Gradient Descent Theory
在利用梯度下降法(GD)求解损失函数时,参数更新后,Loss一定下降吗?答案未必!
先不考虑梯度下降法,可以利用这种方法求最小值,如下图所示,在起始点画一个圈,找到圆形边上Loss最小的点;然后以该点为圆心,再画一个圆,
找到圆形边上Loss最小的点,以此类推。
基于泰勒公式,若红圈无穷小时,则L(theta)=s+u(theta1-a)+v(theta2-b)成立。
所以,理论上学习率(即红色圈)要无穷小时,L(theta)那个式子才成立。在利用GD每次更新完参数后,理论上学习率要无穷小才能保证Loss越来越小。
在实际执行过程中,学习率够小就行了。所以若学习率可能未设好,可能在更新参数后,L(theta)那个式子不成立,导致在GD过程中没法让Loss越来越小。
如果考虑泰勒展开式的二次项,会在DL过程中增加很多计算量,用此来换取高效地更新参数是不划算的,所以通常梯度下降法仍是主流做法。
梯度下降法的限制
可能会陷入到局部极小值点或鞍点中,但这些在具体的问题中最多只是幻想。当微分值很小时,不见得很接近局部极小值点。只有在开天眼的情况下,才能判断某一点是否是全局最小值。