ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-09-17 23:34:50  阅读:169  来源: 互联网

标签:03 04 方差 李宏毅 模型 微分 梯度 theta x0


李宏毅机器学习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,方差,李宏毅,模型,微分,梯度,theta,x0
来源: https://blog.csdn.net/weixin_43243315/article/details/120358718

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有