一个多层神经网络-训练篇(part2)

背景知识要求

Python基础
Pandas库基础
Matplotlib库基础
sklearn库基础
机器学习-神经网络基础知识

摘要

本文使用上文的多层神经网络模型对链家的房源数据进行训练,对比单层神经网络模型,展示多层神经网络型的优越性。

正文

单层神经网络存在局限性

前文三篇文章是关于单层神经网络的:
第一篇——一个简单的3层神经网络模型part1,https://blog.csdn.net/qq_39206674/article/details/90204383
第二篇——一个简单的3层神经网络模型part2,https://blog.csdn.net/qq_39206674/article/details/90302038
第三篇——一个简单的3层神经网络模型part3(使用Sklearn MLPClassifier)——3层神经网络完结篇
由于在数据预处理方面存在问题,并且单层神经网络模型的数据拟合能力存在上限,导致模型在训练集上的精度在0.9左右,测试集的精度在0.75左右,即模型在数据集上的表现,存在高偏差(high bias)和高方差(high variance)问题。

多层神经网络

一些基本经验

模型训练前期我总结了一些基本经验,其实这些经验在很多机器学习的书中有介绍,我只是想亲自验证一下这些经验的正确性,此处只把验证的结论罗列一下:

  1. 根据实际测试效果对比,本模型的梯度更新使用adam的效率约为使用momentum的5-10倍,为使用gd(grad descent)的50-100倍。
  2. 隐藏层为2层时使用he和random初始化权重在梯度收敛方面区别不大,当隐藏层大于等于3层时,he初始化的梯度收敛效果明显比random初始化好。
  3. 不使用early-stopping和L2正则化时,会出现较严重的过拟合(训练集精度100%,验证集才70%多)。
  4. 不使用学习率衰减时,模型训练会代价函数收敛会很慢,当找到合适的学习率和学习率衰减率时,模型训练会快的多(10倍以上提速)。
  5. 相比于无正则化的模型,在有L2正则化模型上寻找一组最佳超参数会更佳艰难,因为正则化增加了训练的难度。
  6. 本文训练模型遵循奥卡姆剃刀原则,让训练误差小于1%的前提下,尽量简化深度神经网络模型。
多神经网络模型

使用上文的多层神经网络的模型,模型链接 https://blog.csdn.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.csdn.net/qq_39206674/article/details/91344499
3.奥卡姆剃刀原理是指,在科学研究任务中,应该优先使用较为简单的公式或者原理,而不是复杂的。应用到机器学习任务中,可以通过减小模型的复杂度来降低过拟合的风险,即模型在能够较好拟合训练集(经验风险)的前提下,尽量减小模型的复杂度(结构风险)。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值