1. 获取更多的训练数据
  2. 减小网络容量
  3. 添加权重正则化
  4. 添加dropout

获取更多的训练数据

很显然,训练数据越多,泛化能力自然也越好,这个是最优的方法。但是事实上很多情况下我们无法获取更多的数据。因此就需要其他的一些不是通过增加训练数据来降低过拟合的方法。


减小网络容量

这是防止过拟合的最简单的方法。

在深度学习中,模型中的可学习参数的个数称为模型的容量。参数越多,模型就拥有越大的记忆容量。减小网络容量,即减少参数的个数,即对层数和每层的单元个数进行处理。


添加权重正则化

即L1,L2正则化。对于两者的详细介绍我之前已经整理过。

根据奥卡姆剃刀原理:

如果一件事情有两种解释,那么最可能正确的解释就是最简单的那个,即假设更少的那个。

这个原理也适用神经网络学到的模型:

我们有很多组权重,即很多模型,来解决这个问题。在这里面,简单模型(参数更少的模型)比复杂模型更不容易过拟合。

我们通过强制让模型权重只能取较小值来降低过拟合,实现方法是:

向网络损失函数中添加与较大权重值相关的成本

L1:添加的成本与权重系数的绝对值成正比

L2:添加的成本与权重系数的平方成正比

代码实例:



from keras import regularizers

model=models.Sequential()
model.add(layers.Dense(16,kernel_regularizer=regularizers.l2(0.001),
                            activation='relu',input_shape=(10000,)))
model.add(layers.Dense(16,kernel_regularizer=regularizers.l2(0.001),
                            activation='relu'))
model.add(layers.Dense(1,activation='sigmoid'))



l2(0.001)的意思是该层权重矩阵的每个系数都会使网络总损失增加0.001*weight_coefficient_value。

由于惩罚项只在训练时添加,所以网络的训练损失会比测试损失大很多。



regularizers.l1(0.001)#L1正则化
regularizers.l1_l2(l1=0.001,l2=0.001)#L1和L2同时




添加dropout正则化

对某一层用dropout,就是在训练过程中随机将该层的部分输出值舍弃(变0),dropout比率就是那些被舍弃的即被设为0的特征所占的比例。

据我的理解,dropout之所以能降低过拟合,其核心思想是通过引入噪音(在层的输出值),从而可以增强模型的泛化能力。

打破不显著的偶然模式

如果没有噪音的话,网络会记住这些偶然模式。从而导致过拟合。

就像我在美团的机器学习书中看到的:在训练集中引入噪声数据能起到提升模型健壮性的作用。 道理是一样的。

还是要上代码实例:



model=models.Sequential()
model.add(layers.Dense(16,activation='relu',input_shape=(10000,)))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(16,activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1,activation='sigmoid'))