李宏毅机器学习(四) 梯度下降
梯度下降
梯度下降介绍
模型中参数的组合很多,我们不能穷举所有参数组合,所以我们需要去找使得模型误差尽可能小的参数组合,找的方法就是梯度下降,梯度下降用于解决下面的最优化问题:
- \(L\):loss function(损失函数)
- \(\theta\) :parameters(参数)
- 这里的parameters是复数,即 \(\theta\) 指代一堆参数,比如上篇说到的 \(w\) 和\(b\) 。
假设\(\theta\) 有里面有两个参数 \(\{\theta_1, \theta_2\}\) ,随机选取初始值\(\theta^0\):
参数更新过程如下:
其中:
则参数更新过程可以化简为:
参数更新过程为:分别计算初始点处,两个参数对 \(L\) 的偏微分,然后乘上\(\eta\)(学习率,Learning Rate),表示此次要更新的部分,然后在 \(\theta^0\)减掉这部分,得到一组新的参数。同理反复进行这样的计算。右边部分式子为简洁的写法,\(\triangledown L(\theta)\)即为梯度。

红色箭头为参数对 \(L\) 的偏微分,减去偏微分,Loss则朝着蓝色笺头方向前进,不断走下去,最终走向Loss相对小的地方。
梯度下降的Tips
Tips1:调整学习率
谨慎调整学习率

-
红色:学习率合适,Loss持续降低。
-
蓝色:学习率太小,学习过程缓慢,需要迭代很多次。
-
绿色:学习率稍大,Loss降到一定程度就无法继续下降,发生震荡现象。
-
黄色:学习率过大,一次参数更新直接越过了最优参数的位置,导致Loss越来越大。
自适应学习率
如上所示,我们希望我们的学习率在最开始时(误差大时)大一点,模型误差能急速减小;在后期时(误差小时),学习率小一点,使得模型误差能收敛到更小的值,所以我们希望随着迭代增加,学习率不断减小。
- 通常刚开始,初始点会距离最低点比较远,所以使用大一点的学习率
- update好几次参数之后呢,比较靠近最低点了,此时减少学习率
- 比如 \(\eta^t =\frac{\eta}{\sqrt{t+1}}\),\(t\)是次数。随着次数的增加,\(\eta^t\)减小
学习率不能是一个值通用所有特征,不同的参数需要不同的学习率
Adagrad
Adagard概念
每个参数的学习率都把它除上之前微分的均方根。
-
普通梯度下降
\[\begin{aligned} \eta^{t+1} & \leftarrow w^{t}-\eta^{t} g^{t} \\ \eta^{t} &=\frac{\eta}{\sqrt{t+1}} \end{aligned} \] -
Adagrad
\[\begin{aligned} \eta^{t+1} & \leftarrow w^{t}-\frac{\eta^{t}}{\sigma^t} g^{t} \\ g^t & = \frac{\partial L(\theta^t)}{\partial w}\\ \end{aligned} \]\(\sigma^t\):之前参数的所有微分的均方根,对于每个参数都是不一样的。
Adagrad举例
下图展示了使用Adagrad策略的参数更新过程:

将 Adagrad 的式子进行化简:

矛盾点

矛盾:如图所示,\(g^t\)越大,梯度下降的步伐越大,但同时\(\sqrt{\sum^{t}_{i=0}(g^i)^2}\)越大,使得梯度下降步伐越小。
解释:消除特征量纲对损失函数的影响,如下图所示。

在两组梯度里,\(g^4\)的值都为0.1,但是相对于其所在特征组而言,第一个\(g^4\)比其他梯度大得多,第二个\(g^4\)比其他梯度小得多。
在Adagrad中,学习率除以历史梯度的均方根的意义就是为了消除这种反差。
留坑
Tips2:随机梯度下降
- 一般梯度下降:
- 随机梯度下降:
损失函数不需要处理训练集所有的数据,每次选取一个例子 \(x^n\),并根据此例子计算出梯度,然后进行更新。
此时不需要像之前那样对所有的数据进行处理,只需要计算某一个例子的损失,然后计算梯度,根据梯度,就可以赶紧update 参数。
- 实际效果:

一般梯度下降:计算完所有样本的损失,再计算其梯度,然后更新一次参数
随机梯度下降:每次只计算一个样本的损失,再计算其梯度,然后更新一次参数
常规梯度下降法走一步要处理到所有二十个例子,但随机算法此时已经走了二十步(每处理一个例子就更新)。同样的样本数,随机梯度下降法使得参数迭代次数远远超过一般梯度下降,所以随机梯度下降法更快。
Tips3:特征缩放
- 介绍
比如有个函数:
输入\(x_1x_2\)的分布的范围很不一样,建议把他们的范围缩放,使得不同输入的范围是一样的。

- 特征缩放必要性

上图左边是 \(x_1\) 的scale比 \(x_2\) 要小很多,所以当 \(w_1\) 和 \(w_2\) 做同样的变化时,\(w_1\) 对 \(y\) 的变化影响是比较小的,\(x_2\) 对 \(y\) 的变化影响是比较大的。
坐标系中是两个参数的error surface(现在考虑左边蓝色),因为 \(w_1\) 对 \(y\) 的变化影响比较小,所以 \(w_1\) 对损失函数的影响比较小,\(w_1\) 对损失函数有比较小的微分,所以 \(w_1\) 方向上是比较平滑的(等高线稀疏,值变化比较慢)。同理 \(x_2\) 对 \(y\) 的影响比较大,所以 \(x_2\) 对损失函数的影响比较大,所以在 \(x_2\) 方向(\(w_2\)方向)有比较尖的峡谷(等高线密集,也就是值变化比较快)。
上图右边是两个参数scaling比较接近,右边的绿色图就比较接近圆形。
对于左边的情况,上面讲过这种狭长的情形不过不用Adagrad的话是比较难处理的,两个方向上需要不同的学习率,同一组学习率会搞不定它。而右边情形更新参数就会变得比较容易。左边的梯度下降并不是向着最低点方向走的,而是顺着等高线切线法线方向走的。但绿色就可以向着圆心(最低点)走,这样做参数更新也是比较有效率。
- 特征缩放方法
方法非常多,这里举例一种常见的做法:

上图每一列都是一个例子,里面都有一组特征。
对每一个维度 \(i\)(绿色框)都计算平均数,记做\(m_i\);还要计算标准差,记做 \(\sigma _i\)。
然后用第 \(r\) 个例子中的第 \(i\) 个输入,减掉平均数 \(m_i\)mi,然后除以标准差 \(\sigma_i\),得到的结果是所有的维数都是 0,所有的方差都是 1
梯度下降的理论基础
当用梯度下降解决问题:
每次更新参数 \(\thetaθ\),都得到一个新的 \(\thetaθ\),它都使得损失函数更小。即:
结论是不正确的,并非每一次梯度下降参数更新,都能使得Loss减小。

浙公网安备 33010602011771号