机器学习|李宏毅机器学习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
  • 简单模型的方差比较小,(就像射击的时候每次的时候,每次射击的设置都集中在一个比较小的区域内),更简单的模型受不同训练集的影响较小;
  • 复杂模型的方差比较大。

偏差bias 如果模型求解样本的期望与真实均值相同,则为无偏估计(unbiased)。
  • 简单模型的偏差比较大(由于模型比较简单,function space可能根本不包括靶心(function),在这个function space里面自然找不到偏差小的function);
  • 复杂模型的偏差更小(function space比较大,可能包含了正确的靶心(function),但由于训练数据不足,对测试集拟合不好)。
    机器学习|李宏毅机器学习03、04-误差和梯度下降
    文章图片

    机器学习|李宏毅机器学习03、04-误差和梯度下降
    文章图片
如何判断自己的模型是偏差大还是方差大,以及如何解决?
判断模型是偏差大还是方差大,决定了下一步模型如何进行优化。
偏差过大 如果模型不能很好地拟合训练集,也就是欠拟合。
方差过大 模型很好地拟合训练集,即在训练集上得到很小的错误,但在测试集上得到大的错误,这意味着模型可能是方差比较大,也就是过拟合。
解决偏差过大
  1. 重新设计模型,比如考虑更多次幂、更复杂的模型;
  2. 输入更多的feature;
收集更多的训练集对于偏差过大的模型来说是没有用的。
解决方差过大
  1. 收集更多的数据/数据增强;
  2. 正则化(可能会导致一定的偏差)。
模型选择
如果直接用测试数据进行调参的话,会导致测试数据的误差不能反映真实误差。
机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

交叉验证 考虑将训练集划分为训练集和验证集(validation set),用验证集的误差去选择模型参数。
注意:不要用testing机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

set的数据再去调整模型,否则还是会引入testing set的偏差,导致testing set无法反映真正的误差。
N-fold交叉验证 N-fold交叉验证是指将训练集划分成好几份,每次取其中一份作为验证集,其他作为训练集,用得到模型的平均误差确定模型参数后。确定模型参数后,再把所有的数据用该模型参数进行训练,得到最终的模型。
机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

梯度下降 什么是梯度下降?
低维度直观解释 根据斜率来判定移动的方向,不断找到loss function的最低点:
机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

数学原理 我们的目标是在loss function下找到最小loss对应的参数:
机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

比如在$ \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的幂函数展开式,也叫泰勒展开式。
两个变量的泰勒展开式如下图所示:
机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

基于泰勒展开式,当这个红色圈很小的时候,在 ( a , b ) (a,b) (a,b) 点的红色圆圈范围内,可以将损失函数用泰勒展开式进行简化:
机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

将问题进而简化为下图:
机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

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?)。
机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

然后将u和v带入,得到:
机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

发现最后的式子就是梯度下降的式子。
值得注意的是:这里用这种方法找到这个式子有个前提,泰勒展开式给的损失函数的估算值是要足够精确的,也就是——红色的圈圈足够小(学习率足够小)。所以理论上每次更新参数都想要损失函数减小的话,需要学习率足够足够小。
此处只考虑了泰勒展开式的一次项,如果考虑到二次项(比如牛顿法),在实际中会涉及到二次微分等,增加大量运算,性价比不高。
梯度下降的tips
Tip1:调整学习速率 下图左边黑色为损失函数的曲线,假设从左边最高点开始:
  1. 红色的线:学习率调整的刚刚好,能顺利找到最低点;
  2. 蓝色的线:学习率调整的太小,梯度下降太慢,这种情况给足够多的时间也可以找到最低点,实际情况可能会等不及出结果。
  3. 绿色的线:如果 学习率调整的有点大,可能会在局部震荡,永远无法到达最低点。
  4. 黄色的线:学习率过大,直接跳过了最优解,更新参数的时候只会发现损失函数越更新越大。
高维损失函数无法直接进行下图左图这样的可视化。因此,使用下图右边的方案,将参数改变对损失函数的影响进行可视化。比如学习率太小(蓝色的线),损失函数下降的非常慢;学习率太大(绿色的线),损失函数下降很快,但马上就无法下降了;学习率特别大(黄色的线),损失函数反而越来越大;红色,刚好的学习率,可以得到一个好的结果。
机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

自适应调整学习率 一开始的时候离最低点比较远,可以用较大的学习率比较快速地接近最低点,随着不断训练,越接近最低点的时候学习率应该要更小(根据迭代次数衰减)。学习率不能是一个值通用所有特征,不同的参数需要不同的学习率。
机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

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计算过程:
机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

对于$ \sqrt{\sum_{i=0}t(gi)^2}$ 就是希望再尽可能不增加过多运算的情况下模拟二次微分。(如果计算二次微分,在实际情况中可能会增加很多的时间消耗)
Adagrad为什么有效 直观解释
Adagrad让梯度变化不会特别剧烈:
机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

数学解释
机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

对于∑ i = 0 t ( g i ) 2 \sqrt{\sum_{i=0}^t(g^i)^2} ∑i=0t?(gi)2 ? 就是希望再尽可能不增加过多运算的情况下模拟二次微分。(如果计算二次微分,在实际情况中可能会增加很多的时间消耗)。
机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

【机器学习|李宏毅机器学习03、04-误差和梯度下降】比如初始点在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? 这一点的微分。
这样可以认为如果算出来的微分越大,则距离最低点越远。而且最好的步伐和微分的大小成正比。所以如果踏出去的步伐和微分成正比,它可能是比较好的。
也就是说:梯度越大,就跟最低点的距离越远。但这个结论在多个参数的时候就不一定成立了。
比如下图:
机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

事实上最佳距离∣ 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应该考虑到二次微分:
机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

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)
机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

Tip3:特征缩放feature scaling/特征标准化 什么是feature scaling 机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

为什么要feature scaling 机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

右图做了feature scaling,做参数更新时可以向着圆心(最低点)走,比较有效率。
怎么做feature scaling 方法非常多,这里举例一种常见的做法:
机器学习|李宏毅机器学习03、04-误差和梯度下降
文章图片

上图每一列都是一个例子,里面都有一组特征。
对每一个维度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(方差)有什么区别和联系? - 既生宇何生亮的回答 - 知乎

    推荐阅读