这些年神经网络的发展越来越复杂,应用领域越来越广,性能也越来越好,但是训练方法还是依靠 BP 算法。也有一些对 BP 算法的改进算法,但是大体思路基本是一样的,只是对 BP 算法个别地方的一些小改进,比如变步长、自适应步长等。还有就是,由于训练数据存在噪声,训练神经网络时也并不是损失函数越小越好。当损失函数特别小时,可能会出现所谓的“过拟合”问题,导致神经网络在实际使用时性能严重下降。
我们把样本集分成训练集和测试集两个集合,训练集用于神经网络的训练,测试集用于测试神经网络的性能。如上图所示,纵坐标是错误率,横坐标是训练时的迭代轮次。红色曲线是在训练集上的错误率,蓝色曲线是测试集上的错误率。每经过一定的训练迭代轮次后,就测试一次训练集和测试集上的错误率。从图中可以发现,在训练的开始阶段,由于处于欠拟合状态,无论是训练集上的错误率还是测试集上的错误率,都随着训练的进行逐步下降。但是当训练迭代轮次达到 N 次后,测试集上的错误率反而逐步上升了,这就是出现了过拟合现象。测试集上的错误率相当于神经网络在实际使用中的表现,因此我们希望得到一个合适的拟合,使得测试集上的错误率最小,所以应该在迭代轮次达到 N 次时,就结束训练,以防止出现过拟合现象。
训练时并不是损失函数越小越好。
何时开始出现过拟合并不容易判断。一种简单的方法就是使用测试集,做出像上图那样的错误率曲线,找到 N 点,用在 N 点得到的参数值作为神经网络的参数值就可以了。
E
d
(
w
)
=
∑
k
=
1
M
(
t
k
d
−
o
k
d
)
2
E_d(w) = \sum^{M}_{k=1}{(t_{kd} - o_{kd})^2}
Ed(w)=k=1∑M(tkd−okd)2
在这个损失函数上增加一个正则化项
∥
w
∥
2
2
\begin{Vmatrix}w\\\end{Vmatrix}_2^2
w22 ,变成:
E
d
(
w
)
=
∑
k
=
1
M
(
t
k
d
−
o
k
d
)
2
+
∥
w
∥
2
2
E_d(w) = \sum^{M}_{k=1}{(t_{kd} - o_{kd})^2} + \begin{Vmatrix}w\\\end{Vmatrix}_2^2
Ed(w)=k=1∑M(tkd−okd)2+w22
其中
∥
w
∥
2
2
\begin{Vmatrix}w\\\end{Vmatrix}_2^2
w22 表示权重w的2-范数,
∥
w
∥
2
2
\begin{Vmatrix}w\\\end{Vmatrix}_2^2
w22 表示2-范数的平方。
w的2-范数就是每个权重
w
i
w_i
wi 平方后求和再开方,这里用的是2-范数的平方,所以就是权重的平方和了。如果用
w
i
(
i
=
1
,
2
,
.
.
.
,
N
)
w_i(i=1,2,...,N)
wi(i=1,2,...,N) 表示第i个权重,则:
∥
w
∥
2
2
=
w
1
2
+
w
2
2
+
⋯
+
w
N
2
\begin{Vmatrix}w\\\end{Vmatrix}_2^2 = w_1^2 + w_2^2 + \cdots + w_N^2
w22=w12+w22+⋯+wN2
以下图所示的曲线拟合为例说明,作为一般的情况,一个曲线拟合函数f(x)可以认为是如下形式:
f
(
x
)
=
w
0
+
w
1
x
+
w
2
x
2
+
⋯
+
w
n
x
n
f(x) = w_0 + w_1x + w_2x^2 + \cdots + w_nx^n
f(x)=w0+w1x+w2x2+⋯+wnxn
如果f(x)中包含的
x
n
x^n
xn 项越多,n越大,则f(x)越可以表示复杂的曲线,拟合能力就越强,也更容易造成过拟合。
比如在上图所示的3条曲线,绿色曲线是个直线,其形式为:
f
(
x
)
=
w
0
+
w
1
x
f(x) = w_0 + w_1x
f(x)=w0+w1x
只含有x项,只能表示直线,所以就表现为欠拟合。而对于其中的蓝色曲线,其形式为:
f
(
x
)
=
w
0
+
w
1
x
+
w
2
x
2
+
w
3
x
3
+
w
4
x
4
+
w
5
x
5
f(x) = w_0 + w_1x + w_2x^2 + w_3x^3 + w_4x^4 + w_5x^5
f(x)=w0+w1x+w2x2+w3x3+w4x4+w5x5 含有5个
x
n
x^n
xn 项,表达能力比较强,从而造成了过拟合。而对于其中的红色曲线,其形式为:
f
(
x
)
=
w
0
+
w
1
x
+
w
2
x
2
f(x) = w_0 + w_1x + w_2x^2
f(x)=w0+w1x+w2x2 含有2个
x
n
x^n
xn 项,对于这个问题来说,可能刚好合适,所以体现了比较好的拟合效果。但是在实际当中呢,我们很难知道应该有多少个
x
n
x^n
xn 项是合适的,有可能
x
n
x^n
xn 项是比较多的,通过在损失函数中加入正则化项,使得权重w尽可能地小,在一定程度上可以限制过拟合情况的发生。比如对于蓝色曲线:
f
(
x
)
=
w
0
+
w
1
x
+
w
2
x
2
+
w
3
x
3
+
w
4
x
4
+
w
5
x
5
f(x) = w_0 + w_1x + w_2x^2 + w_3x^3 + w_4x^4 + w_5x^5
f(x)=w0+w1x+w2x2+w3x3+w4x4+w5x5 虽然它含有5个
x
n
x^n
xn 项,但是如果我们最终得到的
w
3
w_3
w3 、
w
4
w_4
w4 、
w
5
w_5
w5 都比较小的话,那么也就与红色曲线:
f
(
x
)
=
w
0
+
w
1
x
+
w
2
x
2
f(x) = w_0 + w_1x + w_2x^2
f(x)=w0+w1x+w2x2 比较接近了。