当前位置: 首页 > article >正文

机器学习—偏差或方差与神经网络

我们已经看到高偏差或高方差都是不好的,从某种意义上说,它们损害了算法的性能,神经网络如此成功的原因之一是因为神经网络加上大数据的想法,它给了我们一种新的方式解决高偏差和高方差。

如果将不同阶的多项式拟合到数据集,如果你在左边拟合一个像这样的线性模型,有一个非常简单的模型,可以有很高的偏差,而你要拟合一个复杂的模型,那么你可能会遭受高方差,在偏差和方差之间有一个权衡,在本例中,它是选择一个二阶多项式来帮助你权衡,并选择一个交叉验证误差最小的模型,所以在神经网络出现之前,必须平衡复杂性,也就是多项式的次数或正则化参数,使偏差和方差都不太高。如果你有一个太简单的模型,你对复杂模型有很高的偏差,必须在这两个不好的东西之间找到一个折衷,事实证明,神经网络提供了一条出路,必须用一些警告来权衡偏见和差异的困境。

事实证明,大型神经网络,当在小型到中型数据集上训练时,是低偏差机器。如果你把神经网络做得足够大,几乎总是能很好地适应你的训练,只要你的训练不是很大,这意味着,这给了我们一个新的食谱,根据需要尝试减少偏差或减少方差,不需要在它们两个之间权衡,所以分享一个并不总是适用的简单食谱,但如果它适用,对于使用神经网络获得精确的模型非常强大。首先在训练集上训练你的算法然后看它在训练场上表现好吗,所以测量Jtrain,看看它是否高,例如,相对于人的水平性能或某些基准性能水平,如果Jtrain和基准性能之间有巨大差距,那么你就有一个高偏差问题,高训练误差,减少偏差的一个方法是使用一个更大的神经网络,通过一个更大的神经网络,要么更多的隐藏层,要么每层更多的隐藏单元,然后可以继续通过这个循环,让神经网络越来越大,直到它在训练中表现出色,这意味着它在你的训练集上达到了一定程度的错误,与你希望达到的目标误差水平大致相当,可能是人类水平的表现,在训练中表现出色后,所以这个问题的答案是肯定的,然后会问,它在交叉验证集上做得好么,换句话说,它的方差大吗,如果答案是否定的,然后得出结论,算法有很高的方差,因为它确实想要训练集,在交叉验证机上不做,所以Jcv和Jtrain的巨大差距表示可能有一个高方差问题,如果你有一个高方差问题,尝试修复它的一个方法是获得更多的数据,所以得到更多的数据,然后回去重新训练模型,并仔细检查它在训练集上是否表现良好,如果没有更大的网络或者它是否需要交叉验证集,如果没有得到更多的数据,如果你能一直绕着这个圈,直到最终它在交叉验证集中表现良好,那可能就成功了,因为现在有了一个在交叉验证集上做得很好的模型。

当然也有限制,这个食谱的应用训练了一个更大的神经网络确实减少了偏差,但在某种程度上,它确实会变得计算昂贵,这就是为什么神经网络的兴起得到了极快计算机的兴起,尤其包括GPU或图形处理器单元,传统上用于加快计算机图形学速度的硬件,但事实证明,它对加快神经网络也非常有用,但即使硬件加速器超过了某个点,神经网络是如此之大,需要如此长的时间来训练。另一个限制是更多的数据。当你开发一个学习算法时,有时你会发现你有很高的偏差,在这种情况下,你会做一些事情,比如增加神经网络,但是在你增加神经网络之后,你可能会发现你有很高的方差,在这种情况下,你可以做其他事情,如收集更多数据,在不同的点上,你可能有高偏差或高方差。

当你训练神经网络时,会想 神经网络太大会不会产生高方差问题,事实证明,选择一个良好的大型神经网络,正则化通常会比较小,例如,如果你有一个像左侧这样小的神经网络,要切换到一个像右侧这样大的神经网络,你会认为过度装修的风险会显著增加,但事实证明,如果你适当地规则化这个更大的神经网络,那么这个神经网络通常至少会做的一样好或者比小一点的好,只要选择合适的正则化,所以说,另一种说法是,去一个更大的神经网络几乎没有坏处,只要你适当地规范,但有一个警告,当你训练一个更大的神经网络,他确实在计算上变得更加昂贵,所以它会非常短暂地减缓你的训练和推理过程,使神经网络正则化,如果神经网络的成本函数是平均损失,这就是你要做的,所以这里的损失可以平方错误或物流损失,所以神经网络的正则化项就像上边的公式所表示的那样,类似于线性回归和Logistic回归的正则化,通常不对神经网络中的参数b进行正则化,在TensorFlow中实现正则化的方式,这是一个实现非正式的代码,手写数字分类模型,像这样创建三个层,激活隐藏单位的数量,然后用这三个创建一个顺序模型,如果要添加正则化,只需添加这个额外的术语内核,kernel-regularizer=L2(0.01),这就是lambda的值,TensorFlow实际上允许你为不同的层选择不同的值,虽然为了简单起见,可以为所有权重选择相同的lambda值,在所有不同的层中,然后这将允许你在你的神经网络中实现正则化。

总结两个要点,拥有一个更大的神经网络几乎没有坏处,只要适当地规范,因为拥有一个更大的神经网络会减缓你的算法,但在很大程度上,它应该不会损害算法的性能,事实上,它甚至可以显著的帮助它,第二,只要你的训练不是太大,一个神经网络尤其是大型神经网络,往往是一个低偏置的机器,它非常适合非常复杂的功能


http://www.kler.cn/a/399989.html

相关文章:

  • 网络安全之国际主流网络安全架构模型
  • 高斯数据库Postgresql死锁和锁表解决方法
  • 支付域——新零售支付
  • 重构Action-cli前端脚手架
  • C语言剖析:srand()/rand()/time()
  • 【windows笔记】08-Windows中的各种快捷方式、符号链接、目录联接、硬链接的区别和使用方法
  • 基于 AI 智能名片 2 + 1 链动模式商城小程序的立体连接营销策略研究
  • 问:Spring MVC DispatcherServlet流程步骤梳理
  • go 学习网站,go例子 go demo go学习视频
  • 基于Canny边缘检测和轮廓检测
  • 版本控制【Git Bash】【Gitee】
  • Django5 2024全栈开发指南(一):框架简介、环境搭建与项目结构
  • 浅谈数据仓库的架构及其演变
  • C++中的观察者模式:通俗易懂的讲解与实现
  • 113页PPT制造业研发工艺协同及制造一体化
  • 四十、Python(pytest框架-下)
  • github进不去解决办法-误打误撞进去了
  • Redis GEO 功能解析
  • Spring Cloud Ribbon 实现“负载均衡”的详细配置说明
  • Stable Diffusion概要讲解
  • Jenkins的pipeline Script的 每个组件的详细讲解
  • LangChain学习--LangChain-chatchat代码研读
  • 2024年09月CCF-GESP编程能力等级认证Python编程二级真题解析
  • 爬虫——数据解析与提取
  • 高阶C语言之六:程序环境和预处理
  • 解决 IDEA 修改代码重启不生效的问题