Loading

李宏毅机器学习(四) 梯度下降

梯度下降

梯度下降介绍

模型中参数的组合很多,我们不能穷举所有参数组合,所以我们需要去找使得模型误差尽可能小的参数组合,找的方法就是梯度下降,梯度下降用于解决下面的最优化问题:

\[\theta^{*}=\underset{\theta}{\arg \min L}(\theta) \]

  • \(L\):loss function(损失函数)
  • \(\theta\) :parameters(参数)
  • 这里的parameters是复数,即 \(\theta\) 指代一堆参数,比如上篇说到的 \(w\)\(b\)

假设\(\theta\) 有里面有两个参数 \(\{\theta_1, \theta_2\}\) ,随机选取初始值\(\theta^0\):

\[\theta^{0}=\left[\begin{array}{l} \theta_{1}^{0} \\ \theta_{2}^{0} \end{array}\right] \]

参数更新过程如下:

\[\begin{aligned} &{\left[\begin{array}{l} \theta_{1}^{1} \\ \theta_{2}^{1} \end{array}\right]=\left[\begin{array}{l} \theta_{1}^{0} \\ \theta_{2}^{0} \end{array}\right]-\eta\left[\begin{array}{l} \partial L\left(\theta_{1}^{0}\right) / \partial \theta_{1} \\ \partial L\left(\theta_{2}^{0}\right) / \partial \theta_{2} \end{array}\right]} \\ &{\left[\begin{array}{l} \theta_{1}^{2} \\ \theta_{2}^{2} \end{array}\right]=\left[\begin{array}{l} \theta_{1}^{1} \\ \theta_{2}^{1} \end{array}\right]-\eta\left[\begin{array}{l} \partial L\left(\theta_{1}^{1}\right) / \partial \theta_{1} \\ \partial L\left(\theta_{2}^{1}\right) / \partial \theta_{2} \end{array}\right]} \end{aligned} \]

其中:

\[\nabla L(\theta)=\left[\begin{array}{l} \partial C\left(\theta_{1}\right) / \partial \theta_{1} \\ \partial C\left(\theta_{2}\right) / \partial \theta_{2} \end{array}\right] \]

则参数更新过程可以化简为:

\[\begin{aligned} &\left[\begin{array}{l} \theta_{1}^{1} \\ \theta_{2}^{1} \end{array}\right]=\left[\begin{array}{l} \theta_{1}^{0} \\ \theta_{2}^{0} \end{array}\right]-\eta\left[\begin{array}{l} \partial L\left(\theta_{1}^{0}\right) / \partial \theta_{1} \\ \partial L\left(\theta_{2}^{0}\right) / \partial \theta_{2} \end{array}\right] \quad \longrightarrow \quad \theta^{1}=\theta^{0}-\eta \nabla L\left(\theta^{0}\right)\\ &\left[\begin{array}{l} \theta_{1}^{2} \\ \theta_{2}^{2} \end{array}\right]=\left[\begin{array}{l} \theta_{1}^{1} \\ \theta_{2}^{1} \end{array}\right]-\eta\left[\begin{array}{l} \partial L\left(\theta_{1}^{1}\right) / \partial \theta_{1} \\ \partial L\left(\theta_{2}^{1}\right) / \partial \theta_{2} \end{array}\right] \quad \longrightarrow \quad \theta^{2}=\theta^{1}-\eta \nabla L\left(\theta^{1}\right) \end{aligned} \]

参数更新过程为:分别计算初始点处,两个参数对 \(L\) 的偏微分,然后乘上\(\eta\)(学习率,Learning Rate),表示此次要更新的部分,然后在 \(\theta^0\)减掉这部分,得到一组新的参数。同理反复进行这样的计算。右边部分式子为简洁的写法,\(\triangledown L(\theta)\)即为梯度。

image

红色箭头为参数对 \(L\) 的偏微分,减去偏微分,Loss则朝着蓝色笺头方向前进,不断走下去,最终走向Loss相对小的地方。

梯度下降的Tips

Tips1:调整学习率

谨慎调整学习率

image

  1. 红色:学习率合适,Loss持续降低。

  2. 蓝色:学习率太小,学习过程缓慢,需要迭代很多次。

  3. 绿色:学习率稍大,Loss降到一定程度就无法继续下降,发生震荡现象。

  4. 黄色:学习率过大,一次参数更新直接越过了最优参数的位置,导致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策略的参数更新过程:

image

将 Adagrad 的式子进行化简:

image

矛盾点

image

矛盾:如图所示,\(g^t\)越大,梯度下降的步伐越大,但同时\(\sqrt{\sum^{t}_{i=0}(g^i)^2}\)越大,使得梯度下降步伐越小。

解释:消除特征量纲对损失函数的影响,如下图所示。

image

在两组梯度里,\(g^4\)的值都为0.1,但是相对于其所在特征组而言,第一个\(g^4\)比其他梯度大得多,第二个\(g^4\)比其他梯度小得多。

在Adagrad中,学习率除以历史梯度的均方根的意义就是为了消除这种反差。


留坑


Tips2:随机梯度下降

  • 一般梯度下降:

\[\begin{align} L&=\sum_n(\hat{y}^n −(b+\sum w_ix_i^n))^2 \\ \theta^i &=\theta^{i-1}- \eta\triangledown L(\theta^{i-1}) \end{align} \]

  • 随机梯度下降:

损失函数不需要处理训练集所有的数据,每次选取一个例子 \(x^n\),并根据此例子计算出梯度,然后进行更新。

\[\begin{align} L &=(y^n−(b+\sum w_ix_i^n)) ^2 \\ \theta^i &=\theta^{i-1}- \eta\triangledown L^n(\theta^{i-1}) \end{align} \]

此时不需要像之前那样对所有的数据进行处理,只需要计算某一个例子的损失,然后计算梯度,根据梯度,就可以赶紧update 参数。

  • 实际效果:

image

一般梯度下降:计算完所有样本的损失,再计算其梯度,然后更新一次参数

随机梯度下降:每次只计算一个样本的损失,再计算其梯度,然后更新一次参数

常规梯度下降法走一步要处理到所有二十个例子,但随机算法此时已经走了二十步(每处理一个例子就更新)。同样的样本数,随机梯度下降法使得参数迭代次数远远超过一般梯度下降,所以随机梯度下降法更快。

Tips3:特征缩放

  • 介绍

比如有个函数:

\[y=b+w_1x_1+w_2x_2 \]

输入\(x_1x_2\)的分布的范围很不一样,建议把他们的范围缩放,使得不同输入的范围是一样的。

image

  • 特征缩放必要性

image

上图左边是 \(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的话是比较难处理的,两个方向上需要不同的学习率,同一组学习率会搞不定它。而右边情形更新参数就会变得比较容易。左边的梯度下降并不是向着最低点方向走的,而是顺着等高线切线法线方向走的。但绿色就可以向着圆心(最低点)走,这样做参数更新也是比较有效率。

  • 特征缩放方法

方法非常多,这里举例一种常见的做法:

image

上图每一列都是一个例子,里面都有一组特征。

对每一个维度 \(i\)(绿色框)都计算平均数,记做\(m_i\);还要计算标准差,记做 \(\sigma _i\)

然后用第 \(r\) 个例子中的第 \(i\) 个输入,减掉平均数 \(m_i\)mi,然后除以标准差 \(\sigma_i\),得到的结果是所有的维数都是 0,所有的方差都是 1

梯度下降的理论基础

当用梯度下降解决问题:

\[\theta^∗= \underset{ \theta }{\operatorname{arg\ min}} L(\theta) \]

每次更新参数 \(\thetaθ\),都得到一个新的 \(\thetaθ\),它都使得损失函数更小。即:

\[L(\theta^0) >L(\theta^1) > L(\theta^2)> \cdots \]

结论是不正确的,并非每一次梯度下降参数更新,都能使得Loss减小。

理论

限制

posted @ 2021-07-16 22:39  c0co  阅读(314)  评论(0)    收藏  举报