1. 算法的改进方法
对于一个机器学习算法,当我们得到假设函数后,如果其在测试集的误差过大,我们应该怎么对其进行优化?对于如下所示的代价函数:
J
(
θ
)
=
1
2
m
[
∑
i
=
1
m
[
h
θ
(
x
(
i
)
)
−
y
(
i
)
]
2
+
λ
∑
j
=
1
n
θ
j
2
]
J(\theta) = \frac{1}{2m} \left[ \sum_{i=1}^m \left[ h_\theta(x^{(i)}) - y^{(i)} \right]^2 + \lambda \sum_{j=1}^n \theta_j^2 \right]
J(θ)=2m1[i=1∑m[hθ(x(i))−y(i)]2+λj=1∑nθj2]
我们对其优化的方法包括如下:
- 用更多的训练样本训练模型
- 选择更少或更多的特征
- 添加多项式特征,如( x 1 2 , x 2 2 , x 1 , x 2 , ⋯ x_1^2,x_2^2,x_1,x_2,\cdots x12,x22,x1,x2,⋯)
- 增大或减少正则项中的 λ \lambda λ
对于这么多优化方法,如果我们只是随机的选择,可能会造成时间与精力的浪费。我们应该怎么选择用哪种方法对模型进行优化呢?
本节通过机器学习诊断算法,通过这种测试方法,可以找到算法在哪里出现了问题,从而找到更加有意义的改进方式。
2. 模型评估
为了学习到一个想要的模型,我们通过最小化代价函数的方式来求得最佳的参数
θ
\theta
θ,如下所示拟合的假设函数有着非常小的代价,但是其并不是一个很好的模型,因为它在训练集上有着很好的表现,但是泛化性能较差。
对于特征量比较少的数据,我们可以通过画图的方式判断模型的好坏,但是如果存在很多特征量,我们应该怎么对训练得到的假设函数的好坏进行判断呢?
通常情况下,我们可以将数据集按照 7 : 3 7:3 7:3 的比例划分训练集和测试集,通过在训练集上训练模型,在测试上评估得到的假设函数对新数据的误差,这样就可以对模型的效果进行粗略的判断。
对于线性回归,我们可以通过如下两步对模型进行评估:
- 从训练集中通过最小化代价函数 J ( θ ) J(\theta) J(θ),学习参数 θ \theta θ
- 利用得到的假设函数,计算测试集的误差
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}}\left[h_\theta(x_{test}^{(i)})-y_{test}^{(i)}\right]^2 Jtest(θ)=2mtest1i=1∑mtest[hθ(xtest(i))−ytest(i)]2
对于逻辑回归,我们可以通过如下的方式进行评估:
- 从训练集学习参数 θ \theta θ
- 计算测试集误差,由于逻辑回归和线性回归的代价函数不同,所以利用如下方式评估
J t e s t ( θ ) = − 1 m t e s t ∑ i = 1 m t e s t y t e s t ( i ) log h θ ( x t e s t ( i ) ) + ( 1 − y t e s t ( i ) ) log [ 1 − h θ ( x t e s t ( i ) ) ] J_{test}(\theta)= - \frac{1}{m_{test}} \sum_{i=1}^{m_{test}} y_{test}^{(i)} \log h_{\theta}(x_{test}^{(i)}) + (1-y_{test}^{(i)})\log \left[1-h_{\theta}(x_{test}^{(i)})\right] Jtest(θ)=−mtest1i=1∑mtestytest(i)loghθ(xtest(i))+(1−ytest(i))log[1−hθ(xtest(i))] - 对于逻辑回归,我们还可以定义 分类错误误差 来对模型进行评估,该误差表示进行分类时,有多少测试集数据被分类错误。如下所示表示 0/1 分类错误误差:
e r r ( h θ ( x ) , y ) = { 1 , i f h θ ( x ) ≥ 0.5 , y = 0 o r h θ ( x ) < 0.5 , y = 1 0 , o t h e r w i s e T e s t e r r o r = 1 m t e s t ∑ i = 1 m t e s t e r r [ h θ ( x t e s t ( i ) ) , y ( i ) ] \begin{aligned} err(h_{\theta}(x),y)= & \begin{cases} 1 & ,\begin{matrix} if \quad h_{\theta}(x)\geq 0.5,y=0 \\ or \quad h_{\theta}(x)\lt 0.5,y=1 \end{matrix} \\ \\ 0 & ,otherwise \end{cases} \\ \\ Test \ error = & \frac{1}{m_{test}} \sum_{i=1}^{m_{test}} err\left[h_{\theta}(x_{test}^{(i)}),y^{(i)}\right] \end{aligned} err(hθ(x),y)=Test error=⎩⎪⎪⎨⎪⎪⎧10,ifhθ(x)≥0.5,y=0orhθ(x)<0.5,y=1,otherwisemtest1i=1∑mtesterr[hθ(xtest(i)),y(i)]
3. 模型选择
对于一个数据集,我们怎么能够选择出拟合该数据集最好的多项式次数呢?如下所示的多个假设函数,我们记 d d d 表示假设函数中多项式的最高系数,那么 d = 1 , 2 , 3 , ⋯ , 10 d = 1,2,3,\cdots,10 d=1,2,3,⋯,10。
h θ ( x ) = θ 0 + θ 1 x h θ ( x ) = θ 0 + θ 1 x + θ 2 x 2 h θ ( x ) = θ 0 + θ 1 x + ⋯ + θ 3 x 3 ⋮ h θ ( x ) = θ 0 + θ 1 x + ⋯ + θ 10 x 10 \begin{aligned} h_{\theta}(x) & =\theta_0 + \theta_1 x \\ h_{\theta}(x) & =\theta_0 + \theta_1 x + \theta_2 x^2\\ h_{\theta}(x) & =\theta_0 + \theta_1 x + \cdots + \theta_3 x^3\\ \vdots \\ h_{\theta}(x) & =\theta_0 + \theta_1 x + \cdots + \theta_{10} x^{10}\\ \end{aligned} hθ(x)hθ(x)hθ(x)⋮hθ(x)=θ0+θ1x=θ0+θ1x+θ2x2=θ0+θ1x+⋯+θ3x3=θ0+θ1x+⋯+θ10x10
为了找到最合适的模型,我们可以首先求出每个多项式假设函数的参数,再根据参数算出在测试集上的误差,选出误差最小的作为最好的模型,表示如下:
h
θ
(
x
)
=
θ
0
+
θ
1
x
→
θ
(
1
)
→
J
t
e
s
t
(
θ
(
1
)
)
h
θ
(
x
)
=
θ
0
+
θ
1
x
+
θ
2
x
2
→
θ
(
2
)
→
J
t
e
s
t
(
θ
(
2
)
)
h
θ
(
x
)
=
θ
0
+
θ
1
x
+
⋯
+
θ
3
x
3
→
θ
(
3
)
→
J
t
e
s
t
(
θ
(
3
)
)
⋮
h
θ
(
x
)
=
θ
0
+
θ
1
x
+
⋯
+
θ
10
x
10
→
θ
(
10
)
→
J
t
e
s
t
(
θ
(
10
)
)
\begin{aligned} h_{\theta}(x) & =\theta_0 + \theta_1 x & \rightarrow \theta^{(1)} & \rightarrow J_{test}(\theta^{(1)})\\ h_{\theta}(x) & =\theta_0 + \theta_1 x + \theta_2 x^2 & \rightarrow \theta^{(2)} & \rightarrow J_{test}(\theta^{(2)})\\ h_{\theta}(x) & =\theta_0 + \theta_1 x + \cdots + \theta_3 x^3 & \rightarrow \theta^{(3)} & \rightarrow J_{test}(\theta^{(3)})\\ \vdots \\ h_{\theta}(x) & =\theta_0 + \theta_1 x + \cdots + \theta_{10} x^{10} & \rightarrow \theta^{(10)} & \rightarrow J_{test}(\theta^{(10)})\\ \end{aligned}
hθ(x)hθ(x)hθ(x)⋮hθ(x)=θ0+θ1x=θ0+θ1x+θ2x2=θ0+θ1x+⋯+θ3x3=θ0+θ1x+⋯+θ10x10→θ(1)→θ(2)→θ(3)→θ(10)→Jtest(θ(1))→Jtest(θ(2))→Jtest(θ(3))→Jtest(θ(10))
从上面的过程中,我们可以选择出最小的 J t e s t ( θ ( d ) ) J_{test}(\theta^{(d)}) Jtest(θ(d)),将该模型对应的假设函数作为模型,但是这样做会存在一个问题,就是我们无法衡量模型的泛化性。因为我们是根据测试集选出的模型,如果再使用测试集的代价函数值 J t e s t ( θ ( 5 ) ) J_{test}(\theta^{(5)}) Jtest(θ(5)) 作为泛化误差是不合适的。
为了对模型进行泛化性能评估,我们可以改变数据集的划分方式,这里我们将数据集按照 6 : 2 : 2 6:2:2 6:2:2 的比例划分为 训练集、交叉验证集(Cross validation, 验证集)和测试集,这样我们就可以得到三个误差函数,分别为:
- 训练集误差
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 \left[ h_{\theta}(x^{(i)}) - y^{(i)} \right]^2 Jtrain(θ)=2m1i=1∑m[hθ(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}} \left[ h_{\theta}(x_{cv}^{(i)}) - y_{cv}^{(i)} \right]^2 Jcv(θ)=2mcv1i=1∑mcv[hθ(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}} \left[ h_{\theta}(x_{test}^{(i)}) - y_{test}^{(i)} \right]^2 Jtest(θ)=2mtest1i=1∑mtest[hθ(xtest(i))−ytest(i)]2
从而,我们可以使用验证集对模型进行选择,使用测试集误差作为对模型的泛化性能进行评估:如下所示:
h
θ
(
x
)
=
θ
0
+
θ
1
x
→
θ
(
1
)
→
J
c
v
(
θ
(
1
)
)
h
θ
(
x
)
=
θ
0
+
θ
1
x
+
θ
2
x
2
→
θ
(
2
)
→
J
c
v
(
θ
(
2
)
)
h
θ
(
x
)
=
θ
0
+
θ
1
x
+
⋯
+
θ
3
x
3
→
θ
(
3
)
→
J
c
v
(
θ
(
3
)
)
⋮
h
θ
(
x
)
=
θ
0
+
θ
1
x
+
⋯
+
θ
10
x
10
→
θ
(
10
)
→
J
c
v
(
θ
(
10
)
)
\begin{aligned} h_{\theta}(x) & =\theta_0 + \theta_1 x & \rightarrow \theta^{(1)} & \rightarrow J_{cv}(\theta^{(1)})\\ h_{\theta}(x) & =\theta_0 + \theta_1 x + \theta_2 x^2 & \rightarrow \theta^{(2)} & \rightarrow J_{cv}(\theta^{(2)})\\ h_{\theta}(x) & =\theta_0 + \theta_1 x + \cdots + \theta_3 x^3 & \rightarrow \theta^{(3)} & \rightarrow J_{cv}(\theta^{(3)})\\ \vdots \\ h_{\theta}(x) & =\theta_0 + \theta_1 x + \cdots + \theta_{10} x^{10} & \rightarrow \theta^{(10)} & \rightarrow J_{cv}(\theta^{(10)})\\ \end{aligned}
hθ(x)hθ(x)hθ(x)⋮hθ(x)=θ0+θ1x=θ0+θ1x+θ2x2=θ0+θ1x+⋯+θ3x3=θ0+θ1x+⋯+θ10x10→θ(1)→θ(2)→θ(3)→θ(10)→Jcv(θ(1))→Jcv(θ(2))→Jcv(θ(3))→Jcv(θ(10))
选择出最小的验证集误差 J c v ( θ ( d ) ) J_{cv}(\theta^{(d)}) Jcv(θ(d)) 对应的代价函数,再使用测试集误差 J t e s t ( θ ( 4 ) ) J_{test}(\theta^{(4)}) Jtest(θ(4)) 作为泛化性的度量。
4. 过拟合与欠拟合
4.1 根据训练和交叉验证误差判断
前面我们曾介绍,通过数据集得到的假设函数,如果不能很好的拟合训练集,那么模型可能就是欠拟合的。如果对训练集的拟合很好,但是对测试集的泛化能力很差,那么模型就可能是过拟合的。
如果根据训练误差和验证集误差来判断:
J
t
r
a
i
n
(
θ
)
=
1
2
m
∑
i
=
1
m
[
h
θ
(
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
\begin{aligned} J_{train}(\theta) &=\frac{1}{2m}\sum_{i=1}^m \left[ h_{\theta}(x^{(i)}) - y^{(i)} \right]^2 \\ J_{cv}(\theta) &=\frac{1}{2m_{cv}}\sum_{i=1}^{m_{cv}} \left[ h_{\theta}(x_{cv}^{(i)}) - y_{cv}^{(i)} \right]^2 \end{aligned}
Jtrain(θ)Jcv(θ)=2m1i=1∑m[hθ(x(i))−y(i)]2=2mcv1i=1∑mcv[hθ(xcv(i))−ycv(i)]2
随着多项式中次数的增大,我们可以根据误差得到如下的图像。
- 蓝色曲线表示训练集误差的变化,曲线表示随着多项式次数的增大,对训练集的拟合越来越准确。
- 红色曲线表示验证集误差的变化,表示随着多项式次数的增大,对验证集的误差先减小、后增大,这是因为在左边时,模型处于欠拟合的状态,最低点处的假设函数是具有最好泛化能力的模型,右边随着次数的增大,模型发生了过拟合。
从图中可以看到:
- 当多项式次数处于 d 1 d_1 d1侧时,训练集和验证集的误差都较大,即 J c v ( θ ) ≈ J t r a i n ( θ ) J_{cv}(\theta) \approx J_{train}(\theta) Jcv(θ)≈Jtrain(θ),这时表明模型处于欠拟合的状态,即存在高偏差(bias),表示模型和真实数据之间存在很大的偏差。
- 当多项式的次数处于 d 2 d_2 d2 侧时,训练集的误差较小,验证集的误差较大,即 J c v ( θ ) ≫ J t r a i n ( θ ) J_{cv}(\theta) \gg J_{train}(\theta) Jcv(θ)≫Jtrain(θ),表明模型出现了过拟合,即存在 高方差(variance)。
4.2 过拟合与正则参数的关系
当我们构建一个模型后,可以得到该模型对应的假设函数
h
θ
(
x
)
h_{\theta}(x)
hθ(x),如果构建的假设函数是一个复杂的多项式,为了让假设函数中的参数对数据更好的拟合,我们可以加入如下的正则项,从而构建用于梯度下降的代价函数:
J
(
θ
)
=
1
2
m
[
∑
i
=
1
m
[
h
θ
(
x
(
i
)
)
−
y
(
i
)
]
2
+
λ
∑
j
=
1
n
θ
j
2
]
J(\theta) = \frac{1}{2m} \left[ \sum_{i=1}^m \left[ h_\theta(x^{(i)}) - y^{(i)} \right]^2 + \lambda \sum_{j=1}^n \theta_j^2 \right]
J(θ)=2m1[i=1∑m[hθ(x(i))−y(i)]2+λj=1∑nθj2]
其中正则项的参数 λ \lambda λ 对模型的拟合存在如下三种影响:
-
当 λ \lambda λ 比较大时,假设 λ = 10000 \lambda = 10000 λ=10000,这时为了让上式的代价函数最小,算法会偏向于将 θ j \theta_j θj 优化到无限小,即 θ j ≈ 0 \theta_j \approx 0 θj≈0,这时 h θ ( x ) ≈ θ 0 h_{\theta}(x) \approx \theta_0 hθ(x)≈θ0 ,这时就会出现欠拟合(高偏差,high bias)。
-
当 λ \lambda λ 比较小时,假设 λ = 0 \lambda = 0 λ=0,这时表示正则项不存在,那么就不能通过正则化避免过拟合问题,从而会产生过拟合(高方差,high variance)。
-
当 λ \lambda λ 刚刚好时,我们才能得到对数据集拟合很好的假设函数。
需要注意的一点是,上面的代价函数是用来在梯度更新时对参数
θ
\theta
θ 进行更新的,为了衡量不同值
λ
\lambda
λ 的效果,我们可以取不同大小的
λ
\lambda
λ 计算参数
θ
\theta
θ 的值,再选择使验证集误差最小的
λ
\lambda
λ 作为最终的正则项系数,如下所示:
λ
=
0
→
min
θ
J
(
θ
)
→
θ
(
0
)
→
J
c
v
(
θ
(
0
)
)
λ
=
0.01
→
min
θ
J
(
θ
)
→
θ
(
1
)
→
J
c
v
(
θ
(
1
)
)
λ
=
0.02
→
min
θ
J
(
θ
)
→
θ
(
2
)
→
J
c
v
(
θ
(
2
)
)
λ
=
0.04
→
min
θ
J
(
θ
)
→
θ
(
3
)
→
J
c
v
(
θ
(
3
)
)
⋮
⋮
λ
=
10.24
→
min
θ
J
(
θ
)
→
θ
(
12
)
→
J
c
v
(
θ
(
12
)
)
\begin{aligned} \lambda &= 0 & \rightarrow && \min_{\theta}J(\theta) & \rightarrow && \theta^{(0)} & \rightarrow && J_{cv}(\theta^{(0)}) \\ \lambda &= 0.01 & \rightarrow && \min_{\theta}J(\theta) & \rightarrow && \theta^{(1)} & \rightarrow && J_{cv}(\theta^{(1)}) \\ \lambda &= 0.02 & \rightarrow && \min_{\theta}J(\theta) & \rightarrow && \theta^{(2)} & \rightarrow && J_{cv}(\theta^{(2)}) \\ \lambda &= 0.04 & \rightarrow && \min_{\theta}J(\theta) & \rightarrow && \theta^{(3)} & \rightarrow && J_{cv}(\theta^{(3)}) \\ &&& \vdots &&& \vdots \\ \lambda &= 10.24 & \rightarrow && \min_{\theta}J(\theta) & \rightarrow && \theta^{(12)} & \rightarrow && J_{cv}(\theta^{(12)}) \\ \end{aligned}
λλλλλ=0=0.01=0.02=0.04=10.24→→→→→⋮θminJ(θ)θminJ(θ)θminJ(θ)θminJ(θ)θminJ(θ)→→→→→⋮θ(0)θ(1)θ(2)θ(3)θ(12)→→→→→Jcv(θ(0))Jcv(θ(1))Jcv(θ(2))Jcv(θ(3))Jcv(θ(12))
通过比较 J c v ( θ ( i ) ) J_{cv}(\theta^{(i)}) Jcv(θ(i)) 的大小,我们就能选择出最合适的 λ \lambda λ。
为了比较不同大小的
λ
\lambda
λ 对得到模型的影响,我们通过选择不同的
λ
\lambda
λ 对代价函数进行优化,得到参数
θ
\theta
θ ,再通过下面的公式计算训练集误差和验证集误差,最终得到两者的曲线如下图。
J
t
r
a
i
n
(
θ
)
=
1
2
m
∑
i
=
1
m
[
h
θ
(
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
\begin{aligned} J_{train}(\theta) &=\frac{1}{2m}\sum_{i=1}^m \left[ h_{\theta}(x^{(i)}) - y^{(i)} \right]^2 \\ J_{cv}(\theta) &=\frac{1}{2m_{cv}}\sum_{i=1}^{m_{cv}} \left[ h_{\theta}(x_{cv}^{(i)}) - y_{cv}^{(i)} \right]^2 \end{aligned}
Jtrain(θ)Jcv(θ)=2m1i=1∑m[hθ(x(i))−y(i)]2=2mcv1i=1∑mcv[hθ(xcv(i))−ycv(i)]2
从图中可以看到,对于训练集曲线,当
λ
\lambda
λ 很小时,表明是一个过拟合的模型,其在训练集上的误差就会很小;当
λ
\lambda
λ 比较大时,通过优化会使
θ
≈
0
\theta \approx 0
θ≈0 ,最终得到一个误差较大的假设函数 。
对于验证集曲线,当 λ \lambda λ 较小和较大时,会因为假设函数的过拟合与欠拟合导致误差较大,只有选择刚刚好的 λ \lambda λ 才能使验证集误差最小。
5. 学习曲线
学习曲线是一个判断算法是否正常工作或对算法进行改进的一个很好的工具,可以通过学习曲线判断出模型是否出现了过拟合(高方差)或欠拟合(高偏差)。
学习曲线以训练集的大小
m
m
m 为横轴,以误差为纵轴,最终可以根据如下的训练和验证集误差画出曲线。
J
t
r
a
i
n
(
θ
)
=
1
2
m
∑
i
=
1
m
[
h
θ
(
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
\begin{aligned} J_{train}(\theta) &=\frac{1}{2m}\sum_{i=1}^m \left[ h_{\theta}(x^{(i)}) - y^{(i)} \right]^2 \\ J_{cv}(\theta) &=\frac{1}{2m_{cv}}\sum_{i=1}^{m_{cv}} \left[ h_{\theta}(x_{cv}^{(i)}) - y_{cv}^{(i)} \right]^2 \end{aligned}
Jtrain(θ)Jcv(θ)=2m1i=1∑m[hθ(x(i))−y(i)]2=2mcv1i=1∑mcv[hθ(xcv(i))−ycv(i)]2
5.1 正常模型的学习曲线
对于一个正确的模型:
- 对训练集来说,当训练集中的数目比较小时,假设函数可以很好的拟合,这时训练集误差会比较小。但是随着训练集不断增大,就会有越来越多的数据不能很好的拟合,所以误差会逐渐增大,如下蓝色曲线所示。
- 对验证集,当训练集中的数目比较少时,学习得到的假设函数的泛化性能会很差,因此会造成误差较大;但是随着训练集的不断增大,使得泛化性能逐步变强,最终使验证集误差逐渐变小,如下红色曲线所示。
5.2 欠拟合(高偏差)模型的学习曲线
对于一个欠拟合的模型,
- 当训练集数据较小时,模型可以很好的拟合数据,但是随着数据量的不断增大,会有越来越多的数据不能被拟合到,导致误差会不断增大,得到下图蓝色的曲线。
- 对于验证集,当训练集的数据比较少时,得到的模型的泛化能力很弱,所以会产生很高的误差,但是随着训练集数据的增多,也会学到更多的数据特征,使验证误差逐渐减小,得到如下红色的曲线。
在欠拟合的模型中,随着训练集中数据量的增多,最终训练集和验证集误差会收敛到相同的点,这是因为对欠拟合的模型来说,其学习到的样本是有限的,所以随着训练集的增多,会达到模型的极限,这时对训练集的学习与对验证集的判断会得到相同的结果,因此其误差会趋向于相同的值。并且最终的误差会是一个比较大的值。
从曲线也可以看出,如果模型是一个欠拟合的,那么增加训练集的数据集对整个模型是没有很大的帮助的,因为已经到达了模型的上限,所以最终都会使模型存在很高的误差。
5.3 过拟合(高方差)模型的学习曲线
对于一个过拟合的模型,
- 当训练集较小时,可以完全的拟合数据,但是当数据集增大时,即使是一个过拟合的模型,也会存在某些数据点没有被拟合到,所以训练误差会逐渐增大,如下蓝色曲线所示。
- 对于验证集,当训练集的数量较小时,假设函数完全拟合了训练集,对验证集的泛化能力几乎为 0,所以误差会较大。随着训练集数据的增多,会有更多的验证集被拟合到,但是被拟合的验证集也只是一小部分,所以最终验证集的误差会维持在一个较高的值,并且该值会比训练集误差大,如下红色曲线所示。
对于一个过拟合的模型,我们可以发现随着训练样本的增多,验证集的误差会逐渐减小,这也说明了通过增大样本数量可以让过拟合的模型有更好的泛化能力。这是因为提供更多的样本就会包含更多的特征,让过拟合的模型走向欠拟合,所以会使得泛化能力增强。
6. 模型的改进方式
通过以上的讨论,我们就可以根据上面的各种指标来选择对应的处理方式,如第一小节所说的处理方式,分别对应如下的情况:
- 用更多的训练样本训练模型 → \quad \rightarrow \quad → 适用于过拟合的情况
- 选择更少 → \quad \rightarrow \quad → 适用于过拟合的情况
- 更多的特征 → \quad \rightarrow \quad → 适用于欠拟合的情况
- 添加多项式特征,如( x 1 2 , x 2 2 , x 1 , x 2 , ⋯ x_1^2,x_2^2,x_1,x_2,\cdots x12,x22,x1,x2,⋯) → \quad \rightarrow \quad → 适用于欠拟合的情况
- 增大正则项中的 λ \lambda λ → \quad \rightarrow \quad → 适用于欠拟合的情况
- 减少正则项中的 λ \lambda λ → \quad \rightarrow \quad → 适用于过拟合的情况
对于神经网络,通常我们选择比较简单的网络,即其中包含比较少的隐藏层和神经单元,这样的模型具有计算复杂度较低等特点,但是也会出现欠拟合的情况,如下图所示:
相反,对于比较复杂的神经网络,即包含较多的隐藏层和神经元,这样的模型会包含更多的参数,且其计算复杂度会比较大,而且更容易出现过拟合。网络结构越复杂,其学习能力越强,当出现过拟合时,可以通过正则化来解决过拟合的问题,并且加入正则项的复杂的网络通常比一个简单的网络有更好的效果。
对于神经网络层数的选择,我们也可以使用上面的方式,将数据集分为训练集、验证集和测试集,在验证集验证不同层数的网络的验证集误差,从而选择出最合适的层数。