误差有三个来源:
误差计算公式:
误差的期望值 = 噪音的方差 + 模型预测值的方差 + 预测值相对真实值的偏差的平方
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)]
随机变量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
如果模型求解样本的期望与真实均值相同,则为无偏估计(unbiased)。
判断模型是偏差大还是方差大,决定了下一步模型如何进行优化。
如果模型不能很好地拟合训练集,也就是欠拟合。
模型很好地拟合训练集,即在训练集上得到很小的错误,但在测试集上得到大的错误,这意味着模型可能是方差比较大,也就是过拟合。
收集更多的训练集对于偏差过大的模型来说是没有用的。
如果直接用测试数据进行调参的话,会导致测试数据的误差不能反映真实误差。
考虑将训练集划分为训练集和验证集(validation set),用验证集的误差去选择模型参数。
注意:不要用testing
set的数据再去调整模型,否则还是会引入testing set的偏差,导致testing set无法反映真正的误差。
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带入,得到:
发现最后的式子就是梯度下降的式子。
值得注意的是:这里用这种方法找到这个式子有个前提,泰勒展开式给的损失函数的估算值是要足够精确的,也就是——红色的圈圈足够小(学习率足够小)。所以理论上每次更新参数都想要损失函数减小的话,需要学习率足够足够小。
此处只考虑了泰勒展开式的一次项,如果考虑到二次项(比如牛顿法),在实际中会涉及到二次微分等,增加大量运算,性价比不高。
下图左边黑色为损失函数的曲线,假设从左边最高点开始:
高维损失函数无法直接进行下图左图这样的可视化。因此,使用下图右边的方案,将参数改变对损失函数的影响进行可视化。比如学习率太小(蓝色的线),损失函数下降的非常慢;学习率太大(绿色的线),损失函数下降很快,但马上就无法下降了;学习率特别大(黄色的线),损失函数反而越来越大;红色,刚好的学习率,可以得到一个好的结果。
一开始的时候离最低点比较远,可以用较大的学习率比较快速地接近最低点,随着不断训练,越接近最低点的时候学习率应该要更小(根据迭代次数衰减)。学习率不能是一个值通用所有特征,不同的参数需要不同的学习率。
每个参数的学习率都把它除上之前微分的均方根。解释:
普通的梯度下降为:
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)
Adagrad计算过程:
对于$ \sqrt{\sum_{i=0}t(gi)^2}$ 就是希望再尽可能不增加过多运算的情况下模拟二次微分。(如果计算二次微分,在实际情况中可能会增加很多的时间消耗)
直观解释
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应该考虑到二次微分:
之前的梯度下降是将所有的样本学习完了以后,进行一次梯度下降(每个样本的损失求和):
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)
右图做了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(方差)有什么区别和联系? - 既生宇何生亮的回答 - 知乎