Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 877|回复: 0

深度学习:欠拟合问题的几种解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-5-1 12:41:02 | 显示全部楼层 |阅读模式
    <section id="primary" class="content-area">
    	<main id="main" class="site-main">
    

    深度学习:欠拟合问题的几种解决方案

    <div class="entry-content">
    	<p>点击量:29849</p><p>我最近做深度学习在连续中文语音识别方向的应用的时候,根据一些论文和网上一些公开代码和模型结构,设计了一个神经网络的模型。但是在训练的时候,就首先遇到了很让人头疼的欠拟合问题。神经网络欠拟合的特征是,训练了很长时间,但是在训练集上,loss值仍然很大甚至与初始值没有太大区别,而且精确度也很低,几乎接近于0,在测试集上亦如此。且先不管模型结构配置的优劣,就欠拟合问题来说,需要从如下方面来着手。</p>
    

    就我目前所遇到的来说,神经网络的欠拟合大致分为两种情况,一种是神经网络的拟合能力不足,一种是网络配置的问题。先说说欠拟合的特征吧,即如何判断当前是不是欠拟合,以及到底是上述我说的哪一种情况。

    我们先用两张图来说明一下吧:

    如果我们训练神经网络的时候,在训练集上得到了这样的loss:

    以及这样的Accurancy:

    那么,欠拟合基本上是没得跑了。因为,一开始就有一个较大的loss,以及几乎为0的精度,然后不论怎么训练,比如训练了一整天,loss迟迟不下降,精度迟迟不上升,即神经网络总是不能很好地拟合训练数据,那么这就是欠拟合了。

     

    判断神经网络的拟合能力是否足够

    这时候,有一个小技巧,那就是,让神经网络在每次训练时,只迭代同样的数据,甚至每一个batch里面也是完全相同一模一样的数据,再来看看loss值和accurancy值的变化。如果发现,这时候,神经网络的Loss开始下降,accurancy也开始上升了,并且在训练了一段时间后神经网络能够正确地计算出所训练样本经过神经网络的输出值了,那么这种情况属于神经网络拟合能力不足。对于大量的数据样本,神经网络无法去拟合全部数据,只能拟合大量样本的整体特征,或者少数样本的具体特征。此时,需要做的很简单,只需要增加深度,也就是增加神经网络的层数就可以了。也可以增加神经网络的宽度,将每一层的神经单元数量增加,但是同等情况下,效果明显不如增加层数,而且要想达到较好的效果,需要增加的神经元数远超过增加一层增加的神经元数。深度深比宽度宽的模型更优这一点,是大家普遍认同的。

    那么如果loss和accurancy仍然如此呢?不论怎么增加神经网络的层数,用哪怕只有一条数据去训练拟合,神经网络就是“岿然不动”,loss的值“屹立不倒”,那么这就与神经网络的拟合能力无关了,就要考虑一下其他的因素了。这也是我遇到的那个问题的根源所在。

     

    寻找最优的权重初始化方案

    首先要说的就是权重的初始化方案。神经网络在训练之前,我们需要给其赋予一个初值,但是如何选择这个初始值,这是个问题。神经网络有大概如下的几种初始化方案:

    • 全零初始化 Zeros
    • 全1初始化 Ones
    • 初始化为固定值value  Constant
    • 随机正态分布初始化 RandomNormal
    • 随机均匀分布初始化 RandomUniform
    • 截尾高斯分布初始化 TruncatedNormal
    • VarianceScaling
    • 用随机正交矩阵初始化Orthogonal
    • 使用单位矩阵初始化 Identiy
    • LeCun均匀分布初始化方法 lecun_uniform
    • LeCun正态分布初始化方法 lecun_normal
    • Glorot正态分布初始化方法 glorot_normal
    • Glorot均匀分布初始化 glorot_uniform
    • He正态分布初始化 he_normal
    • LeCun均匀分布初始化 he_uniform

     

    参考资料:

    https://keras-cn.readthedocs.io/en/latest/other/initializations/

    https://keras.io/initializers/

     

    具体的初始化方案的原理本文不再赘述,这么多初始化方案,其实按照大类来分,主要就三种:均匀分布、正太分布和相同固定值。

    全0的初始化,一般只会被用于逻辑斯蒂回归之类的这种二分类问题上,最多是浅层的神经网络上。全为1或者某个其他相同的值的方案则很少见。因为这种初始化方案,会使得网络处于对称状态,导致的结果就是,每个神经元都具有相同的输出,然后在反向传播计算梯度时,会得到一个同一个梯度值,并且进行着同样的参数更新,这是我们不希望看到的。

    在我用的基于tensorflow的神经网络框架keras中,神经网络默认初始化全部被初始化为了glorot_uniform,也就是一种均值为0,以0为中心的对称区间均匀分布的随机数。在我的模型上,这种接近于0的均匀分布会导致什么问题呢?那就是梯度的消失,使得训练时的loss难以收敛,就出现了上面那两张图的情况。这种初始化方案,训练速度不仅仅慢,而且结果也不好。可以考虑一些其他的方案试一试,比如he_normal和xavier normal等。所以,初始化就跟黑科技一样,用对了,超参数都不用调,没用对,跑出来的结果跟模型有bug一样,不忍直视。

     

    使用适当的激活函数

    不仅仅是初始化,在神经网络的激活函数方面的选取,也不是随意的。比如,卷积神经网络中,卷积层的输出,需要使用的激活函数一般为ReLu,循环神经网络中的循环层使用的激活函数一般为tanh,或者ReLu,全连接层一般也是多用ReLu来激活,只有在神经网络的输出层,使用全连接层来分类的情况下,才会使用softmax这种激活函数。而在各种机器学习入门教程里面最常讲到的sigmoid函数,想都不要想它,它已经不适用于深度学习了,哪怕是作为其改进版的softmax函数,也仅仅是在输出层才使用。

     

    选择合适的优化器和学习速率

    神经网络训练的优化器也是需要考虑的一大因素。神经网络的优化器其实有很多种,每种都有其不同的特点,我们最耳熟能详的就是梯度下降法,对应着有批量梯度下降,随机梯度下降。这种优化方法其实不赖,尤其是在神经网络即将最终收敛的时候,使用一个合适的学习速率使得其最终下降到尽可能低的点上。但是随机梯度下降有着明显的缺点,尤其是跟Momentum、Adagrad、Adadelta等其他优化器对比之后。

     

    而且,这里我最推荐Adadelta,在一开始的效果很显著,只有在最终收敛之前可能不如SGD,可以选择这时候再换成SGD就行了。而且Adadelta不需要太多关注学习率,因为其训练的原理已经不怎么跟学习率有关了。

    不过,如果是SGD的话,在排除了以上情况之后,当神经网络仍欠拟合或者loss不再下降时,可以将学习率调小一些试试。

     

    一般来说,经过以上的组合拳式的优化调参,欠拟合问题基本上都能够得到解决,哪怕最后仍然准确率不高,但肯定是拟合了。欠拟合问题解决之后,接下来要解决的就是过拟合问题了。

    版权声明
    本博客的文章除特别说明外均为原创,本人版权所有。欢迎转载,转载请注明作者及来源链接,谢谢。
    本文地址: https://blog.ailemon.me/2018/04/09/deep-learning-the-ways-to-solve-underfitting/
    All articles are under Attribution-NonCommercial-ShareAlike 4.0
    打赏 赞(4)
    		    		<div class="tab-nav-item item-weixin current"><span>微信</span></div><div class="tab-nav-item item-alipay"><span>支付宝</span></div>
    				</div>
    				<div class="tab-conts">
    					<div class="tab-cont current"><div class="pic"><img src="https://src.ailemon.me/common/Wechat_QRCODE.png" alt="微信二维码图片"></div><p>用<span class="hl">微信</span>扫描二维码打赏</p></div><div class="tab-cont"><div class="pic"><img src="https://src.ailemon.me/common/Alipay_QRCODE.png" alt="支付宝二维码图片"></div><p>用<span class="hl">支付宝</span>扫描二维码打赏</p></div>
    				</div>
    		    </div>
    		    <a class="wb-ppo-close"><svg class="wb-icon wbsico-close"><use xlink:href="#wbsico-close"></use></svg></a>
    		    </div></div></div><div class="crp_related "><h3>Related Posts:</h3><ul><li><a href="https://blog.ailemon.me/2019/02/26/solution-to-loss-doesnt-drop-in-nn-train/" target="_blank"><span class="crp_title">如何解决神经网络训练时loss不下降的问题</span></a></li><li><a href="https://blog.ailemon.me/2017/02/17/how-to-collect-data-for-machine-learning/" target="_blank"><span class="crp_title">在数据为王的人工智能时代如何收集机器学习数据</span></a></li><li><a href="https://blog.ailemon.me/2017/02/22/overfitting-and-underfitting/" target="_blank"><span class="crp_title">机器学习:过拟合与欠拟合问题</span></a></li><li><a href="https://blog.ailemon.me/2018/08/02/map-routing-dijkstra-algorithm/" target="_blank"><span class="crp_title">地图路由问题算法——Dijkstra算法</span></a></li><li><a href="https://blog.ailemon.me/2017/02/10/machine-learningregression-statistic-model/" target="_blank"><span class="crp_title">机器学习:统计回归模型</span></a></li><li><a href="https://blog.ailemon.me/2017/05/08/physiognomys-new-clothes/" target="_blank"><span class="crp_title">【伪科学争议】谷歌研究员两万字批驳上交大用深度学习推断犯罪分子</span></a></li></ul><div class="crp_clear"></div></div>	</div><!-- .entry-content -->
    
    <footer class="entry-footer">
    	<span class="byline"><svg class="svg-icon" width="16" height="16" aria-hidden="true" role="img" focusable="false" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"></path><path d="M0 0h24v24H0z" fill="none"></path></svg><span class="screen-reader-text">发布者:</span><span class="author vcard"><a class="url fn n" href="https://blog.ailemon.me/author/ailemon/">AI柠檬博主</a></span></span><span class="posted-on"><svg class="svg-icon" width="16" height="16" aria-hidden="true" role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><defs><path id="a" d="M0 0h24v24H0V0z"></path></defs><clipPath id="b"><use xlink:href="#a" overflow="visible"></use></clipPath><path clip-path="url(#b)" d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2zm4.2 14.2L11 13V7h1.5v5.2l4.5 2.7-.8 1.3z"></path></svg><a href="https://blog.ailemon.me/2018/04/09/deep-learning-the-ways-to-solve-underfitting/" rel="bookmark"><time class="entry-date published updated" datetime="2018-04-09T00:01:12+08:00">2018-04-09</time></a></span><span class="cat-links"><svg class="svg-icon" width="16" height="16" aria-hidden="true" role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"></path><path d="M0 0h24v24H0z" fill="none"></path></svg><span class="screen-reader-text">发布于</span><a href="https://blog.ailemon.me/category/machine-learning/" rel="category tag">机器学习</a>、<a href="https://blog.ailemon.me/category/deep-learning/" rel="category tag">深度学习</a></span>	</footer><!-- .entry-footer -->
    
    <nav class="navigation post-navigation" role="navigation">
    	<h2 class="screen-reader-text">文章导航</h2>
    	<div class="nav-links"><div class="nav-previous"><a href="https://blog.ailemon.me/2018/03/27/parallel-computing-introduction-mpich-install-and-test/" rel="prev"><span class="meta-nav" aria-hidden="true">上一篇文章</span> <span class="screen-reader-text">上一篇文章:</span> <br><span class="post-title">并行计算入门:mpich的安装与测试</span></a></div><div class="nav-next"><a href="https://blog.ailemon.me/2018/04/30/using-c-and-python-by-mpi-to-parallel-compute-pi-value/" rel="next"><span class="meta-nav" aria-hidden="true">下一篇文章</span> <span class="screen-reader-text">下一篇文章:</span> <br><span class="post-title">使用C语言和Python基于MPI并行计算PI的值</span></a></div></div>
    </nav>
    

    加入对话

    2条评论

    电子邮件地址不会被公开。 必填项已用*标注

    3 + 5 =

    1. 王一 说:
      				<div class="comment-metadata">
      					<a href="https://blog.ailemon.me/2018/04/09/deep-learning-the-ways-to-solve-underfitting/#comment-228">
      													<time datetime="2019-10-15T20:11:42+08:00" title="2019-10-15 20:11">
      							2019-10-15 20:11							</time>
      					</a>
      										</div><!-- .comment-metadata -->
      
      								</footer><!-- .comment-meta -->
      
      			<div class="comment-content">
      				<p>你好,请问您说的这种情况要怎样解决呢?<br>
      

      “不论怎么增加神经网络的层数,用哪怕只有一条数据去训练拟合,神经网络就是“岿然不动”,loss的值“屹立不倒”,那么这就与神经网络的拟合能力无关了,就要考虑一下其他的因素了。这也是我遇到的那个问题的根源所在。”

      我用一条数据去训练网络,loss值一直不变,训练准确率也一直不变。


    		</article><!-- .comment-body -->
    
    		<div class="comment-reply"><a rel="nofollow" class="comment-reply-link" href="/2018/04/09/deep-learning-the-ways-to-solve-underfitting/?replytocom=228#respond" data-commentid="228" data-postid="396" data-belowelement="div-comment-228" data-respondelement="respond" aria-label="回复给王一">回复</a></div>		<ol class="children">
    	<li id="comment-229" class="comment byuser comment-author-ailemon bypostauthor odd alt depth-2">
    		<article id="div-comment-229" class="comment-body">
    			<footer class="comment-meta">
    				<div class="comment-author vcard">
    					<a href="https://blog.ailemon.me/" rel="external nofollow" class="url"><img alt="" src="https://secure.gravatar.com/avatar/82c426dda402e3d6bb7ef5766c98930f?s=60&amp;d=mm&amp;r=g" srcset="https://secure.gravatar.com/avatar/82c426dda402e3d6bb7ef5766c98930f?s=120&amp;d=mm&amp;r=g 2x" class="avatar avatar-60 photo" height="60" width="60"><span class="post-author-badge" aria-hidden="true"><svg class="svg-icon" width="24" height="24" aria-hidden="true" role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"></path><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"></path></svg></span><span class="post-author-badge" aria-hidden="true"><svg class="svg-icon" width="24" height="24" aria-hidden="true" role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"></path><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"></path></svg></span><b class="fn">AI柠檬博主</b><span class="screen-reader-text says">说:</span></a>					</div><!-- .comment-author -->
    
    				<div class="comment-metadata">
    					<a href="https://blog.ailemon.me/2018/04/09/deep-learning-the-ways-to-solve-underfitting/#comment-229">
    													<time datetime="2019-10-15T20:42:33+08:00" title="2019-10-15 20:42">
    							2019-10-15 20:42							</time>
    					</a>
    										</div><!-- .comment-metadata -->
    
    								</footer><!-- .comment-meta -->
    
    			<div class="comment-content">
    				<p>这可能是模型的初始化方案不好,该位置的梯度几乎为0,跟我一开始遇到的问题一样,博客中也写到了,就是初始化方案问题,尤其是用Keras框架而且用到卷积层的时候。keras默认的初始化方案不适用于卷积层,建议使用“he_normal”微软亚研何凯明大神提出的初始化方案。当然激活函数也是可能的问题之一,卷积层和全连接层尽量用relu,循环层就tanh,输出层就softmax,可以试试。</p>
    			</div><!-- .comment-content -->
    
    		</article><!-- .comment-body -->
    
    		<div class="comment-reply"><a rel="nofollow" class="comment-reply-link" href="/2018/04/09/deep-learning-the-ways-to-solve-underfitting/?replytocom=229#respond" data-commentid="229" data-postid="396" data-belowelement="div-comment-229" data-respondelement="respond" aria-label="回复给AI柠檬博主">回复</a></div>		</li><!-- #comment-## -->
    
    	</main><!-- #main -->
    </section><!-- #primary -->
    
    
    </div>
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-29 15:02 , Processed in 0.077242 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表