zoukankan      html  css  js  c++  java
  • 偏差和方差及其解决办法

    训练神经网络时,我们会有一个训练集,一个测试集,人在这件事上几乎是不会出错的

    当训练集精度为99%,而测试集精度为90%时

    这时就是出现了过拟合,我们称他为方差较高

    当训练集精度为85%,测试集精度也为85%时

    这就是拟合的不好,我们称他为高偏差

    为了之后表达方便我称训练集精度为a,测试集精度为b

    高方差的解决办法:

      出现高方差时一般是,a,b先一起上升,然后到某一点之后 a继续上升b开始下降

       

      Early Stopping

      我常用的就是训练时,每训练100次输出一次训练集精度,每1k次保存一次模型

      一旦发现b开始下降了,就停止训练

      这里定义下什么叫做b开始下降

      不是说连续300次训练b都在下降就叫b开始下降了

      最好是连续1000 - 2000次训练b都在下降才能叫做b开始下降了

      因为b是会有波动的,偶尔几次下降是正常行为

      另外的解决办法是正则化

      因为神经网络过拟合的根本原因就是网络设计的过于复杂了

      正则化就是一种把网络简化的方法

      drop out 正则化:

        在训练神经网络时,按照一定的概率去更新节点

        其实网络会过拟合

        每一次学习时,这次让一部分节点学习,下次让另一部分节点学习

        这样每次学习就能学到不同的过拟合特征

        最后再用的时候,过拟合相互抵消,就解决了过拟合的问题

      L2正则化:

        将loss改为loss = loss + (a/2n)*(w1 * w1 + w2 * w2 + ....... + wm * wm)

        a为自己指定的系数,n为样本个数,w就是我们训练时的w

        这样的话,在做反向传播的时候dwi = dwi + (a/n) * wi

        wi = wi - learning_rate * dwi

        那么那个多出来的东西会使无论此时的wi是什么,我们都会试图让他变得更小

        让w趋近于0,就会弱化这个神经元对结果的影响,达到了减小神经网络复杂度的效果

    高偏差的解决办法:

       高偏差没什么好说的,就是神经网络太简单了呗

      这时候要么继续训练,要么加数据,要么就加节点,加层数

      最好不要加层数,因为3层的神经网络已经可以表示一切连续函数了

      没必要多加

  • 相关阅读:
    用java的眼光看js的oop
    SpringBoot YAML文件特殊类型配置
    【框架】一种通知到多线程框架
    【网络基础】数据包生命
    【网络编程】TCPIP-小笔记集合
    【网络编程】TCPIP-8-套接字的多种选项
    【网络编程】TCPIP-7-域名与网络地址
    【网络编程】TCPIP-6-TCP的半关闭
    Web应用安全防护-WAF
    漫画 | 这样的程序员男友,让我分分钟想剖腹自尽!
  • 原文地址:https://www.cnblogs.com/shensobaolibin/p/8946201.html
Copyright © 2011-2022 走看看