zoukankan      html  css  js  c++  java
  • 防止神经网络过拟合的常用的四种方法

    防止神经网络过拟合的常用的四种方法

    一、总结

    一句话总结:

    1、获取更多的训练数据:很显然,训练数据越多,泛化能力自然也越好,这个是最优的方法。
    2、减小网络容量:使用小型网络,会迫使网络学习数据中最关键的部分
    3、添加权重正则化:即L1,L2正则化。如果一件事情有两种解释,那么最可能正确的解释就是最简单的那个,即假设更少的那个。
    4、dropout:dropout之所以能降低过拟合,其核心思想是通过引入噪音(在层的输出值),从而可以增强模型的泛化能力。

    二、防止神经网络过拟合的常用的四种方法

    转自或参考:防止神经网络过拟合的常用的四种方法
    https://zhuanlan.zhihu.com/p/78792533

    1. 获取更多的训练数据
    2. 减小网络容量
    3. 添加权重正则化
    4. 添加dropout

    1、获取更多的训练数据

    很显然,训练数据越多,泛化能力自然也越好,这个是最优的方法。但是事实上很多情况下我们无法获取更多的数据。因此就需要其他的一些不是通过增加训练数据来降低过拟合的方法。

    2、减小网络容量

    这是防止过拟合的最简单的方法。

    在深度学习中,模型中的可学习参数的个数称为模型的容量。参数越多,模型就拥有越大的记忆容量。减小网络容量,即减少参数的个数,即对层数和每层的单元个数进行处理。

    使用小型网络,会迫使网络学习数据中最关键的部分

    3、添加权重正则化

    即L1,L2正则化。

    根据奥卡姆剃刀原理:

    如果一件事情有两种解释,那么最可能正确的解释就是最简单的那个,即假设更少的那个。

    这个原理也适用神经网络学到的模型:

    我们有很多组权重,即很多模型,来解决这个问题。在这里面,简单模型(参数更少的模型)比复杂模型更不容易过拟合。

    我们通过强制让模型权重只能取较小值来降低过拟合,实现方法是:

    向网络损失函数中添加与较大权重值相关的成本

    L1:添加的成本与权重系数的绝对值成正比

    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。

    由于惩罚项只在训练时添加,所以网络的训练损失会比测试损失大很多。

    regularizers.l1(0.001)#L1正则化
    regularizers.l1_l2(l1=0.001,l2=0.001)#L1和L2同时

    4、添加dropout正则化

    对某一层用dropout,就是在训练过程中随机将该层的部分输出值舍弃(变0),dropout比率就是那些被舍弃的即被设为0的特征所占的比例。

    据我的理解,dropout之所以能降低过拟合,其核心思想是通过引入噪音(在层的输出值),从而可以增强模型的泛化能力。

    打破不显著的偶然模式

    如果没有噪音的话,网络会记住这些偶然模式。从而导致过拟合。

    就像我在美团的机器学习书中看到的:在训练集中引入噪声数据能起到提升模型健壮性的作用。 道理是一样的。

    还是要上代码实例:

    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'))
     
     
    我的旨在学过的东西不再忘记(主要使用艾宾浩斯遗忘曲线算法及其它智能学习复习算法)的偏公益性质的完全免费的编程视频学习网站: fanrenyi.com;有各种前端、后端、算法、大数据、人工智能等课程。
    博主25岁,前端后端算法大数据人工智能都有兴趣。
    大家有啥都可以加博主联系方式(qq404006308,微信fan404006308)互相交流。工作、生活、心境,可以互相启迪。
    聊技术,交朋友,修心境,qq404006308,微信fan404006308
    26岁,真心找女朋友,非诚勿扰,微信fan404006308,qq404006308
    人工智能群:939687837

    作者相关推荐

  • 相关阅读:
    0xc000000f: Error attempting to read the boot configuration data
    结合使用 Oracle Database 11g 和 Python
    精通 Oracle+Python,第 9 部分:Jython 和 IronPython — 在 Python 中使用 JDBC 和 ODP.NET
    精通 Oracle+Python,第 8 部分:适合 Oracle DBA 使用的 Python
    精通 Oracle+Python,第 6 部分:Python 支持 XML
    精通 Oracle+Python,第 7 部分:面向服务的 Python 架构
    精通 Oracle+Python,第 5 部分:存储过程、Python 编程
    精通 Oracle+Python,第 4 部分:事务和大型对象
    精通 Oracle+Python,第 3 部分:数据解析
    精通 Oracle+Python,第 2 部分:处理时间和日期
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/13394022.html
Copyright © 2011-2022 走看看