视频地址 | 课件(PDF) |
---|
Gradient Decent 梯度下降
前情回顾:在机器学习 step 3 中,我们要挑出一个可以使得 Loss 最小的一个function,当做best function。我们这里使用梯度下降来解决这个最优化问题。
梯度下降的三个小技巧
Tip 1: 调整学习率
学习率对梯度下降的影响还是比较大的。在做梯度下降时最好画出loss随参数更新次数的曲线(如图),这样可以直观的看到Loss的走势。
如何做到调整学习率呢?最流行也是最简单的做法:每隔几个epoch,用一些因子来减小learning rate。
- 起始位置距离最低点较远,所以我们用较大 。
- 经过几个epoch,我们接近最低点,所以减小 。
- E.g. 衰减:
并且不同的参数有不同的学习率。接下来让我们学习梯度下降中的一个方法AdaGrad。
AdaGrad
用学习率
除以之前所有偏导数的均方根
。
更新方法如下图所示。更新后,每组参数的learning rate都不同。
使用Adagrad,参数变化或者梯度下降公式可改写为:
这里我们有一处矛盾。本来梯度越大,步子越大。但是添加因子之后,Adagrad分母部分梯度越大,步子越小。
直观解释:Adagrad关注的是梯度有多大的“反差”,用平方和看过去的梯度有多大,做除法,观察反差多大。
在一个参数时,微分大小可以代表距离最低点的远近。
但是跨参数时,微分越大并不意味着距离最低点越远。这里c对
微分大但是距离近,a对
微分小但是距离远。
Best step:与函数的一阶偏导成正比,与二阶偏导成反比。
从下图我们可以看出,
方向上二阶偏导更小,
方向上二阶偏导更大。用二阶偏导调整后才能真正表示该点距离最低点的距离。所以正确的比较方法是用 一阶偏导/二阶偏导 来比较。
为什么用一阶偏导的均方根估算二阶偏导,而不是直接求二阶偏导?
如果参数较多,算一阶偏导就要很长时间,算二阶偏导得不偿失。
Tip 2: Stochastic Gradient Descent
加快训练的速度
传统梯度下降,Loss是所有训练样本误差的总和,更新一次参数。但SGD每次只拿一个样本,Loss只考虑某一个样本,只根据那一个样本更新参数。
实际操作一下:传统GD走一次的时候,SGD已经走了二十次。
Tip 3: Feature Scaling
如果不同参数的取值范围不同,那么loss函数等高线方向(负梯度方向,参数更新方向)不是直指向loss最低点,需要不同的learning rate来调整。Feature Scaling让不同参数的取值范围在相同的区间,这样Loss函数等高线是一系列共圆心的正圆,不管在哪一点,更新参数都向圆心走,更新比较有效率。
Feature Scaling常见做法是,把input feature的每个维度都标准化(
第
个component减去该维度特征的均值
,除以该维度的标准差
)。
Warning:梯度下降算法的原理
下图中我们不可能马上说住Loss function的最低点在哪里。但在起始点
附近画一个圈圈可以找到它的最低点。再画圈再找最小值。
如何快速找到圈圈里的最低点?
泰勒级数
如果
在点
具有任意阶导数,则幂级数如下。当
接近
的时候
远大于
,就可以把高次项省略。
多变量泰勒级数:
在很小很小的范围内,可以用泰勒级数简化Loss function。
将常量用字母代替,在圆圈范围内
s为常量与
无关,所以可以先忽略。损失函数的计算就变为了两个向量之间的乘法,且其中向量(u,v)的方向和大小是已知的,当(theta1,theta2)与(u,v)反向的时候,两个向量相乘的结果最小。
又因为是在一个以(theta1,theta2)为圆心的小范围内,所以可以在(theta1,theta2)之前乘上一个值,让这个向量的长度正好等于这个小圆的半径,这样我们就求出了损失函数的最小值。
带回去,就得到这个式子。就是Gradient Decent,前提是红色圈圈够小,泰勒级数才够精确。Learning rate要够小才行。
如果使用泰勒级数的二次展开式的话,就会变成使用牛顿法来求解最优问题了。
但在深度学习中,那并不实用,还是用选择用一次展示式——梯度下降。
在梯度下降中,通常认为是当导数值为0时,就认为求得了最优解了。但是,出现导数为0的点并不仅仅是最优点,还有可能是之前谈及的局部最优点,鞍点(不是极大值也不是极小值的临界点),甚至在“高原”处,导数值小到可以约等于0。这就是梯度下降的限制。
参考目录: