1.减小网络大小
防止过拟合的最简单的方法就是减小模型大小,即减少模型中可学习参数的个数,当学习参数过多时候,就相当于一个线性函数本来只需要两个参数(一个截距一个斜率)就可以表达出来(当然样本点是不会完全在直线上的,分布于直线两侧),但是这时候你给了5个参数,那么所表达出来的线就会穿过更多的点,这个时候曲线会变成四次曲线,模型的泛化力会显著下降。
2.添加权重正则化
一个问题的解释有两种样子,其中一个是简单的一种是复杂的,那么最可能的就是那种简单的解释。一种常见的降低过拟合的方法就是强制让模型权重只能取较小的值,从而限制模型的复杂度,这使得权重值的分布更加规则。
- L1 正则化( L1 regularization):添加的成本与权重系数的绝对值成正比
- L2 正则化( L2 regularization):添加的成本与权重系数的平方(权重的 L2 范数)成正比。神经网络的 L2 正则化也叫权重衰减( weight decay)。不要被不同的名称搞混,权重衰减与 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。注意,由于这个惩罚项只在训练时添加,所以这个网络的训练损失会
比测试损失大很多。
同时添加L1和L2正则化
regularizers.l1(0.001)
regularizers.l1_l2(l1=0.001, l2=0.001)
3.添加 dropout 正则化
对某一层使用 dropout,就是在训练过程中随机将该层的一些输出特征舍弃(设置为 0)
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'))
参考书籍:《python深度学习》