模型过拟合和欠拟合的图像特征
偏差大表示欠拟合,而方差大表示过拟合,我们这一节再深入探讨下过拟合和欠拟合问题。一个经典的图如下:
其中d=1为欠拟合,d=4为过拟合,而d=2则刚刚好。回顾下刚刚说的使用训练集和交叉验证集计算出来的误差(又称代价函数)
J
t
r
a
i
n
(
θ
)
J_{train}(\theta)
Jtrain(θ)和
J
c
v
(
θ
)
J_{cv}(\theta)
Jcv(θ),当d=1的时候,模型欠拟合,那么
J
t
r
a
i
n
(
θ
)
J_{train}(\theta)
Jtrain(θ)和
J
c
v
(
θ
)
J_{cv}(\theta)
Jcv(θ)都很大,因为模型对训练集的拟合都不好,对交叉验证集训练出来的结果只会更烂,此时一般来说
J
t
r
a
i
n
(
θ
)
J_{train}(\theta)
Jtrain(θ)和
J
c
v
(
θ
)
J_{cv}(\theta)
Jcv(θ)很接近,但是
J
c
v
(
θ
)
J_{cv}(\theta)
Jcv(θ)略高。当d=4的时候,模型过拟合,模型对训练集的拟合已经很好了,但是泛化能力很差,因此
J
t
r
a
i
n
(
θ
)
J_{train}(\theta)
Jtrain(θ)比较小,但是
J
c
v
(
θ
)
J_{cv}(\theta)
Jcv(θ)比较大。
J
t
r
a
i
n
(
θ
)
J_{train}(\theta)
Jtrain(θ)和
J
c
v
(
θ
)
J_{cv}(\theta)
Jcv(θ)图像如下
方差、偏差和正则化
本节继续深入讨论方差和偏差的关系,以及正则化是如何影响这两者的。
假设对于假设函数
h
(
x
)
=
θ
0
+
θ
1
x
+
θ
2
x
2
+
θ
3
x
3
+
θ
4
x
4
h(x)=\theta_0+\theta_1x+\theta_2x^2+\theta_3x^3+\theta_4x^4
h(x)=θ0+θ1x+θ2x2+θ3x3+θ4x4我们使用如下的正则化代价函数训练
J
(
θ
)
=
1
2
m
∑
i
=
1
m
h
θ
(
x
(
i
)
−
y
(
i
)
)
2
+
λ
2
m
∑
j
=
1
m
θ
j
2
J(\theta) = \frac{1}{2m}\sum_{i=1}^m h_\theta(x^{(i)}-y^{(i)})^2+\frac{\lambda}{2m}\sum_{j=1}^m\theta_j^2
J(θ)=2m1i=1∑mhθ(x(i)−y(i))2+2mλj=1∑mθj2那么可能会有如下图三种情况
左边是
λ
\lambda
λ非常大的情况,也就是对于任意偏差的惩罚都十分重,这时候图像会倾向于欠拟合(高偏差);右边是
λ
\lambda
λ非常小的情况,也就是对于任意偏差的惩罚都十分轻微,这时候图像会倾向于过拟合(高方差),就和没使用正则化差不多。只有正则化参数大小适中才能获得泛化能力强偏差小的模型。 另外我们设训练函数为
J
t
r
a
i
n
(
θ
)
=
1
2
m
∑
i
=
1
m
h
θ
(
x
(
i
)
−
y
(
i
)
)
2
J_{train}(\theta) = \frac{1}{2m}\sum_{i=1}^m h_\theta(x^{(i)}-y^{(i)})^2
Jtrain(θ)=2m1i=1∑mhθ(x(i)−y(i))2
也就是去掉正则化项,同样,我们将交叉验证的代价函数和测试集的代价函数设置为
J
c
v
(
θ
)
=
1
2
m
c
v
∑
i
=
1
m
c
v
h
θ
(
x
c
v
(
i
)
−
y
c
v
(
i
)
)
2
J_{cv}(\theta) = \frac{1}{2m_{cv}}\sum_{i=1}^{m_{cv}} h_\theta(x^{(i)}_{cv}-y^{(i)}_{cv})^2
Jcv(θ)=2mcv1i=1∑mcvhθ(xcv(i)−ycv(i))2
J
t
e
s
t
(
θ
)
=
1
2
m
t
e
s
t
∑
i
=
1
m
t
e
s
t
h
θ
(
x
t
e
s
t
(
i
)
−
y
t
e
s
t
(
i
)
)
2
J_{test}(\theta) = \frac{1}{2m_{test}}\sum_{i=1}^{m_{test}} h_\theta(x^{(i)}_{test}-y^{(i)}_{test})^2
Jtest(θ)=2mtest1i=1∑mtesthθ(xtest(i)−ytest(i))2
我们会以每次翻一番的速度更新
λ
\lambda
λ的值,并且得出代价函数
J
(
θ
)
J(\theta)
J(θ)最小的时候的
θ
\theta
θ值。然后通过计算出的
θ
\theta
θ计算
J
c
v
(
θ
)
J_{cv}(\theta)
Jcv(θ),其基本计算过程如下:
t
r
y
λ
=
0
→
m
i
n
J
(
θ
)
→
θ
(
1
)
→
J
c
v
(
θ
(
1
)
)
try\:\lambda=0\to minJ(\theta)\to \theta^{(1)}\to J_{cv}(\theta^{(1)})
tryλ=0→minJ(θ)→θ(1)→Jcv(θ(1))
t
r
y
λ
=
0.01
→
m
i
n
J
(
θ
)
→
θ
(
2
)
→
J
c
v
(
θ
(
2
)
)
try\:\lambda=0.01\to minJ(\theta)\to \theta^{(2)}\to J_{cv}(\theta^{(2)})
tryλ=0.01→minJ(θ)→θ(2)→Jcv(θ(2))
t
r
y
λ
=
0.02
→
m
i
n
J
(
θ
)
→
θ
(
3
)
→
J
c
v
(
θ
(
3
)
)
try\:\lambda=0.02\to minJ(\theta)\to \theta^{(3)}\to J_{cv}(\theta^{(3)})
tryλ=0.02→minJ(θ)→θ(3)→Jcv(θ(3))
t
r
y
λ
=
0.04
→
m
i
n
J
(
θ
)
→
θ
(
4
)
→
J
c
v
(
θ
(
4
)
)
try\:\lambda=0.04\to minJ(\theta)\to \theta^{(4)}\to J_{cv}(\theta^{(4)})
tryλ=0.04→minJ(θ)→θ(4)→Jcv(θ(4))
…
t
r
y
λ
=
10.24
→
m
i
n
J
(
θ
)
→
θ
(
12
)
→
J
c
v
(
θ
(
12
)
)
try\:\lambda=10.24\to minJ(\theta)\to \theta^{(12)}\to J_{cv}(\theta^{(12)})
tryλ=10.24→minJ(θ)→θ(12)→Jcv(θ(12))
假设我们计算出 J c v ( θ ( 5 ) ) J_{cv}(\theta^{(5)}) Jcv(θ(5))的值最小,那么我们可以用选择出来的 θ ( 5 ) \theta^{(5)} θ(5)来计算出其 J t e s t ( θ ( 5 ) ) J_{test}(\theta^{(5)}) Jtest(θ(5))的值,该值可以衡量模型对新样例泛化的能力
之前我们谈到,如果正则化参数很小,那么会过拟合;反之则会欠拟合,我们画出正则化参数和
J
c
v
(
θ
)
J_{cv}(\theta)
Jcv(θ)以及
J
t
r
a
i
n
(
θ
)
J_{train}(\theta)
Jtrain(θ)的关系。
其中紫红色的为
J
c
v
(
θ
)
J_{cv}(\theta)
Jcv(θ),蓝色的为
J
t
r
a
i
n
(
θ
)
J_{train}(\theta)
Jtrain(θ),因为
λ
\lambda
λ小的时候,过拟合对训练集拟合很好,但是泛化能力很差;而
λ
\lambda
λ过大的时候,欠拟合对训练集都拟合不充分,其泛化能力也很差
学习曲线
学习曲线可以验证你的模型是否正确,或者改进算法的精度。我们以训练集的数量m作为横轴,将代价函数作为纵轴,那么可以得出如下的图像:
如果只有训练集一个样例,那么训练集可以拟合的十分精准——只需要找到任意一条经过该点的曲线便可,但是其泛化能力是很差的。随着样例数量增加,实际上假设函数无法精确经过每一个样例,此时 J t r a i n ( θ ) J_{train}(\theta) Jtrain(θ)会有所上升,但是逐渐总结出规律后,样例和假设函数的偏差不会太大,因此 J t r a i n ( θ ) J_{train}(\theta) Jtrain(θ)在上升后会逐渐趋于平缓。而模型的泛化能力则是随着训练集样本的增加而逐渐增强的,因此 J c v ( θ ) J_{cv}(\theta) Jcv(θ)一开始会很高,然后逐渐下降。
在欠拟合(高偏差)的情况下,如果我们增大训练量会怎么样?(如图右边)
结果是没什么用,因为假设函数次数不够,哪怕增加了样例其假设函数(也就是误差)还是很高。同样的,连训练集都搞不定就更别提交叉验证集了,其结果是
J
t
r
a
i
n
(
θ
)
J_{train}(\theta)
Jtrain(θ)和
J
c
v
(
θ
)
J_{cv}(\theta)
Jcv(θ)都很高。其结论是,如果在欠拟合的情况下,增大训练集数据量会使得
J
t
r
a
i
n
(
θ
)
J_{train}(\theta)
Jtrain(θ)和
J
c
v
(
θ
)
J_{cv}(\theta)
Jcv(θ)逐渐趋于平缓,但其值依旧较高。
在过拟合(高方差)的时候,如果增加样本量会如何?
可以看出样本小的时候对训练集拟合很好,但是泛化能力很差。随着样本量增大,假设函数很难将所有训练集样本都拟合的很好,因此 J t r a i n ( θ ) J_{train}(\theta) Jtrain(θ)会轻微上升,但是换来的是其泛化能力的增强——因为模型学会应对更多情况了因此 J c v ( θ ) J_{cv}(\theta) Jcv(θ)会逐渐下降,而如果持续增大样本来给你,其 J c v ( θ ) J_{cv}(\theta) Jcv(θ)和 J t r a i n ( θ ) J_{train}(\theta) Jtrain(θ)会逐渐靠近,最后 J t r a i n ( θ ) J_{train}(\theta) Jtrain(θ)只比 J c v ( θ ) J_{cv}(\theta) Jcv(θ)大一些,而总的来说,两个值都会比在欠拟合情况下要小得多
总结
接下来我们总结若干应对各种问题的方法:
修正过拟合(高方差):增加训练及数量、使用更少的特征、增加正则化参数的值
修正欠拟合(高偏差):增加额外的特征、增加假设函数的复杂度和次方数、减小正则化参数的值