防止过拟合的方法主要有:
- 正则化
- dropout
- 增加训练数据
- 提前停止训练过程
1. 正则化
正则化是在损失函数中加入一个额外项,使得在反向传播时能够达到权重衰减的目的。常见的正则化包括L1正则化和L2正则化,又称为L1 和L2范数
常规的损失函数: J(w,b)=1/m∑L(y^−y)
J
(
w
,
b
)
=
1
/
m
∑
L
(
y
^
−
y
)
加入L1范数: Jl(w,b)=J(w,b)+λm∑nxi=1wi)
J
l
(
w
,
b
)
=
J
(
w
,
b
)
+
λ
m
∑
i
=
1
n
x
w
i
)
加入L2范数: Jl(w,b)=J(w,b)+λ2m∑nxi=1(wi)
J
l
(
w
,
b
)
=
J
(
w
,
b
)
+
λ
2
m
∑
i
=
1
n
x
(
w
i
)
2. dropout
对网络中的每一层,设置消除概率,随机消除当中的某些网络节点,简化模型。比如下图,中间层虚线表示的神经元在传播时不传入参数,即把它当做不存在,只选择其中某一部分进行传递。
这个方法只用于训练模型,但是无法完成反向传播的调试,因为每次随机删除的节点不一样,因此不能计算J。
3. 增加训练数据
模型容易发生过拟合,有时是因为数据太少,拟合得到的结果学的过于详细,比如如果训练数据中给模型很多树叶,但这种树叶都是绿色的,那在测试的时候,如果输入一片黄色的树叶就会发生错误,让机器误以为树叶全是绿色的。此时,我们需要增加更多的训练数据,可以对数据进行旋转,变形,改变颜色等等。
4.提前终止训练
在训练过度前停止训练。通常在训练时,训练的损失函数值会越来越小,但在验证级中,损失函数会在减小到一定程度后增大,而这个时候我们设置的训练停止条件还没有达到,因此会继续学习,得到了结果就是训练的损失函数很小,但验证时的损失函数不是最小值,就像下图这样:选择在转折点处停止训练过程。
5.从偏差和方差觉得应该怎样调节参数
在训练模型时,我们都会根据偏差和方差进行调优,决定下一步做什么。
像上面这幅图表示的:
- 测试结果如果偏差高,则是欠拟合,应该用一个更大的神经网络进行训练或者认为的选择更为重要的特征进行训练;
- 否则判断,如果是方差高,则说明发生了过拟合,这个时候就可以用我上面提到的防止过拟合的方法进行训练
- 重复以上两个步骤,知道得到了一个比较满意的偏差和方差