一.相关概念
机器学习的根本问题是优化和泛化之间的对立。
优化(optimization):调节模型以在训练数据上得到最佳性能
泛化(generalization):训练好的模型在前所未见的数据上的性能好坏
训练开始时,优化和泛化是相关的:训练数据上的损失越小,测试数据上的损失也越小。
这时的模型是欠拟合(underfit),即仍有改进的空间,网络还没有对训练数据中所有相关模
式建模。
但在训练数据上迭代一定次数之后,泛化不再提高,验证指标先是不变,然后开始变差,
即模型开始过拟合。这时模型开始学习仅和训练数据有关的模式,但这种模式对新数据来说是
错误的或无关紧要的。
二.解决方法
1.增加数据
最优的解决方法是获取更多的训练数据。模型的训练数据越多,泛化能力自然也越好。
2.正则化
很多时候我们并没有办法来获取更多的训练数据。
次优解决方法是调节模型允许存储的信息量,或对模型允许存储的信息加以约束。
如果一个网络只能记住几个模式,那么优化过程会迫使模型集中学习最重要的模式,这样更可能得到良好的泛化。
三.常见的正则化方法
1.减小网络大小
减少模型中可学习参数的个数(在神经网络中,这由层数和每层的单元个数决定)
如果参数太多,模型学习到的只是训练数据间的映射关系
如果参数太少,模型记忆资源不足,会欠拟合
因此,需要评估一系列不同的网络架构(在验证集上评估,而不是在测试集上),以便为数据找到最佳的模型大小。
要找到合适的模型大小,一般的工作流程是开始时选择相对较少的层和参数,然后逐渐增加层的大小或添加层,直到这种增加对验证损失的影响变得很小。
2.权重正则化
强制让模型权重只能取更小的值,限制模型复杂度。
实现方法:向神经网络损失函数中添加与较大权重值相关的成本。
成本有两种形式:
L1:添加的成本与权重系数的绝对值(L1范数)成正比
L2:添加的成本与权重系数的平方(L2范数)成正比。(也叫权重衰减)。
from tensorflow.keras import regularizers model=keras.models.Sequential() model.add(keras.layers.Dense(16,kernel_regularizer=regularizers.l2(0.001),activation="relu",input_shape=(1000,))) model.add(keras.layers.Dense(16,kernel_regularizer=regularizers.l2(0.001),activation="relu")) model.add(keras.layers.Dense(1),activation="sigmoid")
3.添加dropout正则化
对于某一层使用dropout,就是在训练过程中随机将该层的一些输出特征舍弃(置为0)
dropout比率:被设为0的特征所占的比例,通常在0.2~0.5
测试时没有单元被舍弃,但该层的输出值需要按dropout比率缩小。因为这时候会比训练时有更多的单元被激活,需要加以平衡。(也可以在训练时成比例放大,测试时不变)。
model=keras.models.Sequential()
model.add(keras.layers.Dense(16,activation='relu',input_shape=(1000,)))
model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(16,activation='relu'))
model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(1),activation='sigmoid')