1. 什么是过拟合?
过拟合(Overfitting):模型过于复杂(所包含的参数过多),以致于模型对训练集的拟合很好,但对未知数据预测很差的现象(泛化能力差)。
过拟合可以通过观测训练集和验证集的loss变化判断:随着epoch或step的增加,训练集
loss不断下降,而验证集loss先下降后抬升。
2. 常见过拟合解决办法有哪些?
(1)增加训练数据量
①采集更多的数据;
②数据增广(image augmentation):对已有数据做一系列随机改变,来产生相似但又不同的训练样本,从而扩大训练数据集的规模。这里不讲数据增广,有兴趣的可以查看tf.keras.preprocessing.image.ImageDataGenerator这个api。(2)减少模型复杂度
①减少隐层
②减少神经元个数(3)添加正则项
tf.keras.regularizers.l2
用到的参数:
l:惩罚项,默认为0.01。(4)提前终止(Early Stopping)
训练的过程中,记录到目前为止最好的验证集结果,当连续10个Epoch(或者更多次)没有超越最佳结果时,则可以认为精度不再提高。导入模块:
tf.keras.callbacks.EarlyStopping
用到的参数:
monitor:监控的数据,一般为'val_loss'。
min_delta:定义模型改善的最小量,只有大于min_delta才会认为模型有改善,默认为0。
patience:有多少个epoch,模型没有改善,训练就会停止,默认为0。
restore_best_weights:是否使用监控数据最好的模型参数,如果是False,使用的是训练最后一步的模型参数,默认False。(5)Dropout
训练阶段:每个step以一定的概率p让神经元停止工作。
预测阶段:所有神经元都是工作的,但所有权值需要乘上(1-p)。
导入模块:tf.keras.layers.Dropout
用到的参数:
rate:神经元失效的概率,取值0~1的浮点数。
seed:随机种子,取正整数。
name:输入字符串,给该层设置一个名称。3. Dropout详解
(1) Dropout为何有效?
Hinton的解释:Dropout相当于对原来网络进行修剪,得到参数规模较小的网络,这样的网络
不容易发生过拟合现象,最后对训练过程中所有的小网络进行集成(回归任务:相当于求平均,
分类任务:相当于少数服从多数),从而减小泛化误差,思想类似于集成学习。
(2)Dropout的缺点:
达到同样的精度需要更长的训练时间。通常p初始值取0.5,原因:p=0.5时所有小网络出现的概率相同,不会对某些网络有偏向。
(3)为什么预测阶段所有权值需要乘上(1-p)?
例:10匹马拉一个10吨的车。
第一次(训练时):只有4匹马出力(有p=0.6概率被dropout),每匹要出力拉2.5吨;
第二次(测试时):10匹马都被要求出力,这次每匹马要出力拉2.5×(1-0.6)=1吨
注:主流的深度学习框架(tensorflow、pytorch、mxnet等)都会自动处理这一步,所以不需要自己操作。