一个多层神经网络-训练篇(part2)
一个多层神经网络-训练篇(part2)
背景知识要求
Python基础
Pandas库基础
Matplotlib库基础
sklearn库基础
机器学习-神经网络基础知识
摘要
本文使用上文的多层神经网络模型对链家的房源数据进行训练,对比单层神经网络模型,展示多层神经网络型的优越性。
正文
单层神经网络存在局限性
前文三篇文章是关于单层神经网络的:
第一篇——一个简单的3层神经网络模型part1,https://blog.****.net/qq_39206674/article/details/90204383
第二篇——一个简单的3层神经网络模型part2,https://blog.****.net/qq_39206674/article/details/90302038
第三篇——一个简单的3层神经网络模型part3(使用Sklearn MLPClassifier)——3层神经网络完结篇
由于在数据预处理方面存在问题,并且单层神经网络模型的数据拟合能力存在上限,导致模型在训练集上的精度在0.9左右,测试集的精度在0.75左右,即模型在数据集上的表现,存在高偏差(high bias)和高方差(high variance)问题。
多层神经网络
一些基本经验
模型训练前期我总结了一些基本经验,其实这些经验在很多机器学习的书中有介绍,我只是想亲自验证一下这些经验的正确性,此处只把验证的结论罗列一下:
- 根据实际测试效果对比,本模型的梯度更新使用adam的效率约为使用momentum的5-10倍,为使用gd(grad descent)的50-100倍。
- 隐藏层为2层时使用he和random初始化权重在梯度收敛方面区别不大,当隐藏层大于等于3层时,he初始化的梯度收敛效果明显比random初始化好。
- 不使用early-stopping和L2正则化时,会出现较严重的过拟合(训练集精度100%,验证集才70%多)。
- 不使用学习率衰减时,模型训练会代价函数收敛会很慢,当找到合适的学习率和学习率衰减率时,模型训练会快的多(10倍以上提速)。
- 相比于无正则化的模型,在有L2正则化模型上寻找一组最佳超参数会更佳艰难,因为正则化增加了训练的难度。
- 本文训练模型遵循奥卡姆剃刀原则,让训练误差小于1%的前提下,尽量简化深度神经网络模型。
多神经网络模型
使用上文的多层神经网络的模型,模型链接 https://blog.****.net/qq_39206674/article/details/91344499
超参数设置
初始化默认使用he初始化,
梯度下降默认使用adam:
beta=0.9,
beta1=0.9,
beta2=0.999,
epsilon=1e-8,
本文主要调整其他超参数:网络层数,每层的神经元数,学习率,学习率衰减率,L2正则化的lambda,early-stopping损失函数cost阈值。
三隐藏层(10,8,4)VS三隐藏层(20,16,8)
超参数1:
超参数2:
超参数1对应的结果:
超参数2对应的结果:
结论1:
- 三隐藏层分别为10,8,6个神经元时,模型过于简单,存在高偏差(训练精度仅为0.894)和高方差(验证集精度为0.753)。
- 三隐藏层分别为20,16,8个神经元时,模型结构过于复杂,虽然解决了高偏差(训练集精度达0.995),但是仍然存在高仿差(验证集上泛化不好)。
- 需要在尽量小的影响偏差的情况下,使用L2正则化和early-stopping解决高方差问题。
三隐藏层(20,16,8)的模型上使用 L2 reguar + early-stopping
当加入L2正则化和early-stopping,参数如下时:
训练结果如下:
结论2:
- 根据单一指标原则,模型泛化方面,只关心F1指标。
- 在现有的神经网络结构(20,16,8)下尝试:lambda为0.5 0.7 0.9 1.2 1.5 5种情况,结果是验证集的F1指标始终不超过0.81。但是训练集的F1很容易达到0.99,这说明当前模型没有完全遵循奥卡姆剃刀原理,即模型的结构风险较大,导致泛化效果不够好,需要继续简化模型。
三隐藏层(20,16,8)简化为 三隐藏层(16,12,6)
当加入L2正则化和early-stopping,参数如下时:
训练结果如下:
三隐藏层(16,12,6)比 三隐藏层(20,16,8):
- 训练F1下降0.7%
- 验证F1提高2%
继续调整不同的lambda和early_stopping的损失门限,发现F1很难超过0.83,这可能是因为:
- 还没有找到最完美的模型结构和最完美的超参数。
- 当前数据集的质量有待提升。
- 需要更大的数据集进行训练。
总结
本文使用上文的多层神经网络模型对链家的房源数据进行训练,解决了单层神经网络中高偏差的问题(训练精度达0.99)
通过使用正则化、改变模型结构,early-stopping等方法提高了模型的泛化能力,验证集F1提高到0.83(前文单层模型F1平均在0.7左右)
但是,可能因为一下原因,模型的验证集F1没能达到0.95以上:
- 还没有找到最完美的模型结构和最完美的超参数。
- 当前数据集的质量有待提升。
- 需要更大的数据集进行训练。
下一篇文章,我将在两个方面尝试继续提升模型的验证集F1结果,一方面使用sklearn库中的MLP模型快速训练,便于找到更优的超参数组合;另一方面,对数据集进一步分析,尝试提高数据集的特征质量,从而改善模型的泛化水平。
参考
1.Andrew Ng 深度学习
2.一个多层神经网络-模型篇(part1) https://blog.****.net/qq_39206674/article/details/91344499
3.奥卡姆剃刀原理是指,在科学研究任务中,应该优先使用较为简单的公式或者原理,而不是复杂的。应用到机器学习任务中,可以通过减小模型的复杂度来降低过拟合的风险,即模型在能够较好拟合训练集(经验风险)的前提下,尽量减小模型的复杂度(结构风险)。