机器学习

李宏毅机器学习03、04-误差和梯度下降

本文主要是介绍李宏毅机器学习03、04-误差和梯度下降,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

李宏毅机器学习03、04-误差和梯度下降

误差

误差来源

误差有三个来源:

  1. 样本噪音noise;
  2. 模型预测值的方差variance;
  3. 预测值相对真实值的偏差bias。

误差计算公式:

误差的期望值 = 噪音的方差 + 模型预测值的方差 + 预测值相对真实值的偏差的平方
E ( ( y − f ^ ( x ) ) 2 ) = σ 2 + V a r [ f ^ ( x ) ] + ( B i a s [ f ^ ( x ) ] ) 2 B i a s [ f ^ ( x ) ] = E [ f ^ ( x ) − f ( x ) ] E((y−\hat f(x))^2)=σ^2+Var[\hat f(x)]+(Bias[\hat f(x)])^2 \\ Bias[\hat{f}(x)] = E[\hat{f}(x) - f(x)] E((y−f^​(x))2)=σ2+Var[f^​(x)]+(Bias[f^​(x)])2Bias[f^​(x)]=E[f^​(x)−f(x)]

方差variance

随机变量X的方差 = X平方的期望 - X期望的平方
V a r [ X ] = E [ X 2 ] − ( E [ X ] ) 2 Var[X]=E[X^2]−(E[X])^2 Var[X]=E[X2]−(E[X])2

  • 简单模型的方差比较小,(就像射击的时候每次的时候,每次射击的设置都集中在一个比较小的区域内),更简单的模型受不同训练集的影响较小;
  • 复杂模型的方差比较大。

img

偏差bias

如果模型求解样本的期望与真实均值相同,则为无偏估计(unbiased)。

  • 简单模型的偏差比较大(由于模型比较简单,function space可能根本不包括靶心(function),在这个function space里面自然找不到偏差小的function);
  • 复杂模型的偏差更小(function space比较大,可能包含了正确的靶心(function),但由于训练数据不足,对测试集拟合不好)。
    在这里插入图片描述
    在这里插入图片描述

如何判断自己的模型是偏差大还是方差大,以及如何解决?

判断模型是偏差大还是方差大,决定了下一步模型如何进行优化。

偏差过大

如果模型不能很好地拟合训练集,也就是欠拟合。

方差过大

模型很好地拟合训练集,即在训练集上得到很小的错误,但在测试集上得到大的错误,这意味着模型可能是方差比较大,也就是过拟合。

解决偏差过大

  1. 重新设计模型,比如考虑更多次幂、更复杂的模型;
  2. 输入更多的feature;

收集更多的训练集对于偏差过大的模型来说是没有用的。

解决方差过大

  1. 收集更多的数据/数据增强;
  2. 正则化(可能会导致一定的偏差)。

模型选择

如果直接用测试数据进行调参的话,会导致测试数据的误差不能反映真实误差。

img

交叉验证

考虑将训练集划分为训练集和验证集(validation set),用验证集的误差去选择模型参数。

注意:不要用testing在这里插入图片描述
set的数据再去调整模型,否则还是会引入testing set的偏差,导致testing set无法反映真正的误差。

N-fold交叉验证

N-fold交叉验证是指将训练集划分成好几份,每次取其中一份作为验证集,其他作为训练集,用得到模型的平均误差确定模型参数后。确定模型参数后,再把所有的数据用该模型参数进行训练,得到最终的模型。

在这里插入图片描述

梯度下降

什么是梯度下降?

低维度直观解释

根据斜率来判定移动的方向,不断找到loss function的最低点:

img

数学原理

我们的目标是在loss function下找到最小loss对应的参数:

img

比如在$ \theta^0$ 处,可以在一个小范围的圆圈内找到损失函数更小的 θ 1 \theta^1 θ1。**那么如何在圆圈内找到下降最快的方向?**这将基于泰勒展开式进行求解。

泰勒级数展开

若 h ( x ) h(x) h(x) 在 x = x 0 x=x_0 x=x0​点的某个领域内有无限阶导数(即无限可微分,infinitely differentiable),那么在此领域内有:
h ( x ) = ∑ k = 0 ∞ h k ( x 0 ) k ! ( x − x 0 ) k = h ( x 0 ) + h ′ ( x 0 ) ( x − x 0 ) + h ′ ′ ( x 0 ) 2 ! ( x − x 0 ) 2 + ⋯ \begin{aligned} h(x) &= \sum_{k=0}^{\infty }\frac{h^k(x_0)}{k!}(x-x_0)^k \\ & =h(x_0)+{h}'(x_0)(x−x_0)+\frac{h''(x_0)}{2!}(x−x_0)^2+⋯ \end{aligned} h(x)​=k=0∑∞​k!hk(x0​)​(x−x0​)k=h(x0​)+h′(x0​)(x−x0​)+2!h′′(x0​)​(x−x0​)2+⋯​
当 x x x 很接近 x 0 x_0 x0​ 时,有 h ( x ) ≈ h ( x 0 ) + h ′ ( x 0 ) ( x − x 0 ) h(x)≈h(x_0)+{h}'(x_0)(x−x_0) h(x)≈h(x0​)+h′(x0​)(x−x0​)上式就是函数$ h(x)$在 x = x 0 x=x_0 x=x0​点附近关于 x x x的幂函数展开式,也叫泰勒展开式。

两个变量的泰勒展开式如下图所示:

基于泰勒展开式,当这个红色圈很小的时候,在 ( a , b ) (a,b) (a,b) 点的红色圆圈范围内,可以将损失函数用泰勒展开式进行简化:

img

将问题进而简化为下图:

img

s s s与参数无关,剩下的部分就是向量 ( △ θ 1 , △ θ 2 ) (\triangle \theta_1,\triangle \theta_2) (△θ1​,△θ2​)和向量 ( u , v ) (u,v) (u,v) 的内积。而和向量 ( u , v ) (u,v) (u,v)方向相反的向量就可以让这个内积最小,从而求得向量 △ θ 1 , △ θ 2 ) \triangle \theta_1,\triangle \theta_2) △θ1​,△θ2​)

img

然后将u和v带入,得到:

img

发现最后的式子就是梯度下降的式子。

值得注意的是:这里用这种方法找到这个式子有个前提,泰勒展开式给的损失函数的估算值是要足够精确的,也就是——红色的圈圈足够小(学习率足够小)。所以理论上每次更新参数都想要损失函数减小的话,需要学习率足够足够小。

此处只考虑了泰勒展开式的一次项,如果考虑到二次项(比如牛顿法),在实际中会涉及到二次微分等,增加大量运算,性价比不高。

梯度下降的tips

Tip1:调整学习速率

下图左边黑色为损失函数的曲线,假设从左边最高点开始:

  1. 红色的线:学习率调整的刚刚好,能顺利找到最低点;
  2. 蓝色的线:学习率调整的太小,梯度下降太慢,这种情况给足够多的时间也可以找到最低点,实际情况可能会等不及出结果。
  3. 绿色的线:如果 学习率调整的有点大,可能会在局部震荡,永远无法到达最低点。
  4. 黄色的线:学习率过大,直接跳过了最优解,更新参数的时候只会发现损失函数越更新越大。

高维损失函数无法直接进行下图左图这样的可视化。因此,使用下图右边的方案,将参数改变对损失函数的影响进行可视化。比如学习率太小(蓝色的线),损失函数下降的非常慢;学习率太大(绿色的线),损失函数下降很快,但马上就无法下降了;学习率特别大(黄色的线),损失函数反而越来越大;红色,刚好的学习率,可以得到一个好的结果。

在这里插入图片描述

自适应调整学习率

一开始的时候离最低点比较远,可以用较大的学习率比较快速地接近最低点,随着不断训练,越接近最低点的时候学习率应该要更小(根据迭代次数衰减)。学习率不能是一个值通用所有特征,不同的参数需要不同的学习率。

在这里插入图片描述

Adagrad算法

每个参数的学习率都把它除上之前微分的均方根。解释:

普通的梯度下降为:
w t + 1 ← w t − η t g t η t = η t t + 1 w^{t+1} \leftarrow w^t -η^tg^t \\ \eta^t =\frac{\eta^t}{\sqrt{t+1}} wt+1←wt−ηtgtηt=t+1 ​ηt​
Adagrad算法为:
w t + 1 ← w t − η t σ t g t g t = ∂ L ( θ t ) ∂ w w^{t+1} \leftarrow w^t -\frac{η^t}{\sigma^t}g^t \\g^t =\frac{\partial L(\theta^t)}{\partial w} wt+1←wt−σtηt​gtgt=∂w∂L(θt)​

  • σ t \sigma^t σt :之前参数的所有微分的均方根,对于每个参数都是不一样的。

Adagrad计算过程:

img

img

img

对于$ \sqrt{\sum_{i=0}t(gi)^2}$ 就是希望再尽可能不增加过多运算的情况下模拟二次微分。(如果计算二次微分,在实际情况中可能会增加很多的时间消耗)

Adagrad为什么有效

直观解释

Adagrad让梯度变化不会特别剧烈:

在这里插入图片描述

数学解释

对于 ∑ i = 0 t ( g i ) 2 \sqrt{\sum_{i=0}^t(g^i)^2} ∑i=0t​(gi)2 ​ 就是希望再尽可能不增加过多运算的情况下模拟二次微分。(如果计算二次微分,在实际情况中可能会增加很多的时间消耗)。

img

比如初始点在 x 0 x_0 x0​,最低点为 − b 2 a −\frac{b}{2a} −2ab​,最佳的步伐就是 x 0 x0 x0 到最低点之间的距离$ \left | x_0+\frac{b}{2a}\right|$,也可以写成 ∣ 2 a x 0 + b 2 a ∣ \left | \frac{2ax_0+b}{2a} \right | ∣∣​2a2ax0​+b​∣∣​,刚好 ∣ 2 a x 0 + b ∣ |2ax_0+b| ∣2ax0​+b∣就是方程绝对值在 x 0 x_0 x0​ 这一点的微分。

这样可以认为如果算出来的微分越大,则距离最低点越远。而且最好的步伐和微分的大小成正比。所以如果踏出去的步伐和微分成正比,它可能是比较好的。

也就是说:梯度越大,就跟最低点的距离越远。但这个结论在多个参数的时候就不一定成立了。

比如下图:

img

事实上最佳距离 ∣ 2 a x 0 + b 2 a ∣ \left | \frac{2ax_0+b}{2a} \right | ∣∣​2a2ax0​+b​∣∣​,还有个分母 2 a 2a 2a 。对function进行二次微分刚好可以得到:

$\frac{\partial ^2y}{\partial x^2} = 2a $

所以最好的步长应该是:

一 次 微 分 二 次 微 分 \frac{一次微分}{二次微分} 二次微分一次微分​

即不止和一次微分成正比,还和二次微分成反比。最好的step应该考虑到二次微分:

img

Tip2:随机梯度下降stochastic gradient descent

之前的梯度下降是将所有的样本学习完了以后,进行一次梯度下降(每个样本的损失求和):
L = ∑ n ( y n − ( b + ∑ w i x i n ) 2 θ i = θ i − 1 − η ▽ L ( θ i − 1 ) L= ∑_n( y^n −(b+∑w_ix_i^n)^2\\ \theta^i =\theta^{i-1}- \eta\triangledown L(\theta^{i-1}) L=n∑​(yn−(b+∑wi​xin​)2θi=θi−1−η▽L(θi−1)
而随机梯度下降损失函数不需要处理训练集所有的数据,每次选取一个例子 x n x^n xn,就直接进行一次梯度更新,因此随机梯度下降速度快。
L = ( y n − ( b + ∑ w i x i n ) ) 2 θ i = θ i − 1 − η ▽ L n ( θ i − 1 ) L=(y^n−(b+∑w_ix_i^n))2\\\theta^i =\theta^{i-1}- \eta\triangledown L^n(\theta^{i-1}) L=(yn−(b+∑wi​xin​))2θi=θi−1−η▽Ln(θi−1)
img

Tip3:特征缩放feature scaling/特征标准化

什么是feature scaling

img

为什么要feature scaling

在这里插入图片描述

右图做了feature scaling,做参数更新时可以向着圆心(最低点)走,比较有效率。

怎么做feature scaling

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

img

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

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

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

参考资料

偏差(Bias)和方差(Variance)——机器学习中的模型选择

李宏毅机器学习笔记

李宏毅机器学习视频2019春季

机器学习中的 Bias(偏差)、Error(误差)、Variance(方差)有什么区别和联系? - 既生宇何生亮的回答 - 知乎

这篇关于李宏毅机器学习03、04-误差和梯度下降的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!