李宏毅机器学习03、04-误差和梯度下降
2021/9/18 6:11:40
本文主要是介绍李宏毅机器学习03、04-误差和梯度下降,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
李宏毅机器学习03、04-误差和梯度下降
误差
误差来源
误差有三个来源:
- 样本噪音noise;
- 模型预测值的方差variance;
- 预测值相对真实值的偏差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),但由于训练数据不足,对测试集拟合不好)。
如何判断自己的模型是偏差大还是方差大,以及如何解决?
判断模型是偏差大还是方差大,决定了下一步模型如何进行优化。
偏差过大
如果模型不能很好地拟合训练集,也就是欠拟合。
方差过大
模型很好地拟合训练集,即在训练集上得到很小的错误,但在测试集上得到大的错误,这意味着模型可能是方差比较大,也就是过拟合。
解决偏差过大
- 重新设计模型,比如考虑更多次幂、更复杂的模型;
- 输入更多的feature;
收集更多的训练集对于偏差过大的模型来说是没有用的。
解决方差过大
- 收集更多的数据/数据增强;
- 正则化(可能会导致一定的偏差)。
模型选择
如果直接用测试数据进行调参的话,会导致测试数据的误差不能反映真实误差。
交叉验证
考虑将训练集划分为训练集和验证集(validation set),用验证集的误差去选择模型参数。
注意:不要用testing
set的数据再去调整模型,否则还是会引入testing set的偏差,导致testing set无法反映真正的误差。
N-fold交叉验证
N-fold交叉验证是指将训练集划分成好几份,每次取其中一份作为验证集,其他作为训练集,用得到模型的平均误差确定模型参数后。确定模型参数后,再把所有的数据用该模型参数进行训练,得到最终的模型。
梯度下降
什么是梯度下降?
低维度直观解释
根据斜率来判定移动的方向,不断找到loss function的最低点:
数学原理
我们的目标是在loss function下找到最小loss对应的参数:
比如在$ \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) 点的红色圆圈范围内,可以将损失函数用泰勒展开式进行简化:
将问题进而简化为下图:
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)。
然后将u和v带入,得到:
发现最后的式子就是梯度下降的式子。
值得注意的是:这里用这种方法找到这个式子有个前提,泰勒展开式给的损失函数的估算值是要足够精确的,也就是——红色的圈圈足够小(学习率足够小)。所以理论上每次更新参数都想要损失函数减小的话,需要学习率足够足够小。
此处只考虑了泰勒展开式的一次项,如果考虑到二次项(比如牛顿法),在实际中会涉及到二次微分等,增加大量运算,性价比不高。
梯度下降的tips
Tip1:调整学习速率
下图左边黑色为损失函数的曲线,假设从左边最高点开始:
- 红色的线:学习率调整的刚刚好,能顺利找到最低点;
- 蓝色的线:学习率调整的太小,梯度下降太慢,这种情况给足够多的时间也可以找到最低点,实际情况可能会等不及出结果。
- 绿色的线:如果 学习率调整的有点大,可能会在局部震荡,永远无法到达最低点。
- 黄色的线:学习率过大,直接跳过了最优解,更新参数的时候只会发现损失函数越更新越大。
高维损失函数无法直接进行下图左图这样的可视化。因此,使用下图右边的方案,将参数改变对损失函数的影响进行可视化。比如学习率太小(蓝色的线),损失函数下降的非常慢;学习率太大(绿色的线),损失函数下降很快,但马上就无法下降了;学习率特别大(黄色的线),损失函数反而越来越大;红色,刚好的学习率,可以得到一个好的结果。
自适应调整学习率
一开始的时候离最低点比较远,可以用较大的学习率比较快速地接近最低点,随着不断训练,越接近最低点的时候学习率应该要更小(根据迭代次数衰减)。学习率不能是一个值通用所有特征,不同的参数需要不同的学习率。
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ηtgtgt=∂w∂L(θt)
- σ t \sigma^t σt :之前参数的所有微分的均方根,对于每个参数都是不一样的。
Adagrad计算过程:
对于$ \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 就是希望再尽可能不增加过多运算的情况下模拟二次微分。(如果计算二次微分,在实际情况中可能会增加很多的时间消耗)。
比如初始点在 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 这一点的微分。
这样可以认为如果算出来的微分越大,则距离最低点越远。而且最好的步伐和微分的大小成正比。所以如果踏出去的步伐和微分成正比,它可能是比较好的。
也就是说:梯度越大,就跟最低点的距离越远。但这个结论在多个参数的时候就不一定成立了。
比如下图:
事实上最佳距离 ∣ 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应该考虑到二次微分:
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+∑wixin)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+∑wixin))2θi=θi−1−η▽Ln(θi−1)
Tip3:特征缩放feature scaling/特征标准化
什么是feature scaling
为什么要feature scaling
右图做了feature scaling,做参数更新时可以向着圆心(最低点)走,比较有效率。
怎么做feature scaling
方法非常多,这里举例一种常见的做法:
上图每一列都是一个例子,里面都有一组特征。
对每一个维度 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-误差和梯度下降的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-17机器学习资料入门指南
- 2024-12-06如何用OpenShift流水线打造高效的机器学习运营体系(MLOps)
- 2024-12-06基于无监督机器学习算法的预测性维护讲解
- 2024-12-03【机器学习(六)】分类和回归任务-LightGBM算法-Sentosa_DSML社区版
- 2024-12-0210个必须使用的机器学习API,为高级分析助力
- 2024-12-01【机器学习(五)】分类和回归任务-AdaBoost算法-Sentosa_DSML社区版
- 2024-11-28【机器学习(四)】分类和回归任务-梯度提升决策树(GBDT)算法-Sentosa_DSML社区版
- 2024-11-26【机器学习(三)】分类和回归任务-随机森林(Random Forest,RF)算法-Sentosa_DSML社区版
- 2024-11-18机器学习与数据分析的区别
- 2024-10-28机器学习资料入门指南