阅读更多

0顶
0踩

互联网
以下建议是针对神经网络初学者的,这些建议都来自于我在行业应用和斯坦福大学里为神经网络初学者提供建议所获得的经验。本质上讲,神经网络要比大多数程序难以调试,因为大多数神经网络bug不会导致类型错误或运行时错误。只会导致不良的收敛。特别是你刚入门,碰到这些问题会非常令人沮丧!但经验丰富的神经网络训练者能够系统地克服这些困难,尽管有许多看似模棱两可的错误信息:
引用
性能错误:你的神经网络没有训练好(Performance Error: your neural net did not train well.)。

对于门外汉来说,这条错误信息令人畏惧。但是对经验丰富的人来说,这是一个巨大的错误。它意味着样板代码不能正常工作,是时候深入代码调试了!

如何处理NaN
到目前为止,我的学生提出的最常见的一个问题就是,“我为什么会得到NaN错误。”有时,这问题有复杂的原因。但多数情况下,NaN错误在前100次迭代中出现,原因很简单:你的学习率过高了。当学习率非常高的时候,就会在前100次迭代的时候出现NaN错误。用因子为3来降低学习率,直到前100次迭代不再出现NaN错误。这么做一旦有效,你就有了一个非常好的学习率作为开端。根据我的经验,最好的学习率是你得到NaN错误的范围的一到十分之一。

如果你在100次迭代之后碰到了NaN错误,又有两种常见原因。

1.如果你使用的是RNN,确保你使用了梯度下降,并对梯度使用L2正则化。RNN似乎在训练早期会产生梯度,10%或更少的批次有学习峰值,此时的梯度幅值是相当高的。没有对梯度削减,这些峰值会产生NaN。
2.如果写的是自定义的网络层,那么很有可能因为除以0而引发NaN。另一个众所周知会产生Nan错误的层是Softmax层。Softmax计算包括分子分母的exp(x)操作,它可以用无穷大除以无穷大,会产生NaN。确保你使用了稳定的Softmax实现。

神经网络学习不到任何东西怎么办
一旦你没有了NaN错误,那么你的神经网络就可以在上千次迭代中平稳运行,而且不会在前几百次迭代后减少训练损失。当你第一次构建代码库的时候,最好别使用2000次迭代。这并不是因为所有的网络可以从低于2000次迭代开始学习。相反,从开头开始编码网络很可能出现bug,在达到高迭代次数之前,你会想要过早进行调试。现在的目的是一次又一次地缩小问题范围,直到你得到了一个在2000次迭代以下训练出来的网络。幸运地是,有两种方式来降低复杂性。

1.将训练集大小减小到10个实例。在几百次的迭代中,在这10个实例上,神经网络通常会出现过度拟合的情况。许多编码错误不会导致过拟合的出现。如果你的网络在10个实例的训练集上没有出现过度拟合,那么确保你使用的数据挂上了正确的标签。将批次大小减小到1来检查批次计算错误。在代码中添加打印语句确保输出与你期望的一致。通常情况下,你可以通过上面介绍的纯粹蛮力来找出错误。一旦网络可以在10个实例上训练,你可以试着让它在100个实例上训练。如果这种方式运行正常,但效果不是很好,你可以试试下面的方法。

2.解决你感兴趣的最简单的问题。如果你想翻译句子,首先可以建立一个针对特定语言的语言模型。如果你完成了,那么试着在给出3个词语的情况下预测翻译出来的第一个词。如果你想检测图像中的物体,那么在训练回归网络之前,你可以对图像中物体数目进行分类。在网络能够解决的棘手问题和使用最少的时间让代码得到合适的数据之间需要权衡。这个时候就要发挥你的创造能力了。

将神经网络运用于其他新场景的技巧是合理使用上面介绍的两个步骤。这是一种协调机制,并且效果不错。首先,你表明这个神经网络至少可以记住几个例子。然后这个神经网络可以泛化到更简单问题的验证集中。你慢慢在取得稳步进展时提升难度。这并没有高手第一次使用的Karpathy风格那么有趣,但至少它起作用。有时候你会碰到棘手的问题,你会发现它在2000次迭代中不会继续学习了。那很棒!但它的迭代次数很少会是这个问题之前复杂度下迭代次数的10倍。如果你发现是这种情况,尝试搜索中等水平的复杂度。

调整超参数
现在你的网络可以学习东西了,你可能会得意忘形。你还可能发现你训练的网络并不能够解决大多数复杂的问题。超参数调整就是解决问题的关键。有些人直接下载一个CNN的包然后在他们的数据集上运行,然后告诉你说使用超参数调整并没有带来什么不同。这是因为它们使用已经存在的架构来解决已经存在的问题。如果你要解决的问题需要新的架构呢,通过超参数调整来得到良好的设置就是必须的了。你最好确保针对你要解决的问题阅读了超参数教程,不过我还是会在下面列出一些基本思想。

  • 可视化是关键。不要怕在训练过程中花时间编写自定义可视化工具。如果你的可视化方法效果不行,那么考虑换另一种方法。
  • 权重初始化很重要。一般情况下,较大的初始化权重是个不错的选择,但是太大又会导致NaN。因此权重的初始化需要与学习率一同调整。
  • 确保权重看起来“健康”。要了解这是什么意思,我建议在IPython的notebook中查看现有网络的权重值。花些时间来观察在诸如ImageNet或Penn Tree Bank这些标准的数据集上训练的成熟的网络中成分的权重的直方图应该是什么样的。
  • 神经网络的w.r.t.输入不是不变的,特别是在使用SGD而不是其他方法训练的时候,因为SGD不是尺度不变的方法。花时间用与扩展其他方面的方式来扩展输入数据和输出标签。
  • 在训练过程中降低学习速率几乎总会给你带来提升。最好的衰减策略通常是:在k次迭代后,每n次迭代就用学习率除以1.5,k>n。
  • 使用超参数配置文件,虽然把超参数放到代码中也行,但是如果你想试试不同的值那么会比较麻烦。我把参数放在一个JSON文件中,使用一条命令导入,参见https://github.com/Russell91/tensorbox,确切的格式不重要。不要轻易重构代码,因为重新加载超参数比较麻烦!重构会引入bug,它们将会延长训练周期,并且可以在你得到一个你喜欢的网络前避免。
  • 如果你负担得起,随机化你的超参数搜索。随机搜索能生成你意想不到的超参数组合,并且一旦你了解某个超参数会产生的影响,随机搜索减少你许多工作。

结论
调试神经网络比传统的程序更费劲,因为大部分错误发生在整个网络的单一维度上。然而,二分查找仍然是你的朋友。通过改变问题的难度和使用少量的训练样例的交替,你能快速解决最初的bug。超参数调整和长时间耐心等待可以解决余下的问题。
0
0
评论 共 1 条 请登录后发表评论
1 楼 cherishLC 2016-04-27 21:23
感谢分享,但明明是翻译的,给出原文链接会比较好吧http://russellsstewart.com/notes/0.html

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • JPA 多对多关联  中间表带有属性 两个外键作为中间表的联合主键时 直接操作中间表查询修改的方法

    因为中间表带有属性,采用的多对多映射方式 两个实体类都使用 @OneToMany( mappedBy="workDateTime")   需求:因为中间表使用两个外键作为联合主键 ,如果需要对中间表的属性进行修改, 1、一般做法 ...

  • hibernate5(14)注解映射[6]多对多中间表关联

    在我们的角色管理系统中,一个用户可以有多种角色,一种角色可以赋予多个用户,显然用户和角色...在上面两个实例中,都可对应于hibernate多对多映射关系的两种方式,在多对多映射中,我们往往使用中间表来建立关联关

  • MySQL一对多分页查询-主表关联表条件查询问题

    分页查询是后台项目中最常见的一种操作,在一对多(one to many)的关系表中,如何根据主表进行分页是一个较为棘手的问题,尤其是查询条件既包含主表又包含从表/关联表的。一般情况下,不是查询结果条数不正确,就是一...

  • mysql创建关联表的方法_MySQL多表创建关联及操作

    外键 现在有两张表“分类表”和“商品表”,为了表明商品属于哪个类别,通常情况下,我们...通过主表和从表的外键描述主外键的关系,呈现的就是一对多的关系。外键特点1.从表外键的值是对主键的引用。2.从表外键类型...

  • mysql 中间表命名_mysql关联表中间表主表三张表的使用

    想了想我还是觉得在写一篇关于多对多的文档吧,因为我...大家都知道数据库多对多关系都是需要三张表来完成的,一张主表,一张关联表,还有一张中间表。比如我们这里主表是学生表关联课程表。因为一个学生可以学多们...

  • 下面关于数据库中多表之间关联关系说法错误的是()

    下面关于数据库中多表之间关联关系说法错误的是(B) ...多对多关联关系会产生中间关系表,引入两张表的主键作为外键。 D.多对多关联关系的两个表的主键成可以为联合主键或使用新的字段作为主键。 ...

  • mysql 多表关联操作

    两张表关联删除:DELETE a,b FROM table1 a INNER JOIN table2 b ON a.id = b.aid WHERE a.id = '1' //或者也可以 DELETE a,b FROM table1 a,table2 b WHERE a.id = b.aid AND a.id = '1'三张表删除DELETE a,b,c ...

  • SpringData JPA多表关联操作

    目录1 关联映射操作1.1 多表之间的关系和操作多表的操作步骤1.1.1 @OneToMany:1.1.2 @ManyToOne1.1.3 @JoinColumn1.2 一对多的关联关系1.3 多对多的关联关系1.3.1 @ManyToMany1.3.2 @JoinTable1.3.3 @JoinColumn2 ...

  • jpa 定义中间表实体_JPA多对多级联删除中间表

    PS:禁止拷贝形式转载,转载请...解决思路正常多对多实体A使用多对多关联(@ManyToMany)关联B,JPA自动生成第三张中间表C,然后在需要删除实体并且级联删除中间表时,提前删除中间表C的关联数据。双向一对多实体A使用...

  • Django数据表关联(多对多)

    Django数据表关联(多对多)、正向查询和反向查询

  • gorm 多对多关系 以及 关联的操作

    gorm 多对多关系 以及 关联的操作前言多对多关系模型创建关联的操作不用预加载使用预加载查找关联添加关联删除关联替换关联清空关联 前言 关联的操作最重要的是many2many关系的维护 多对多关系模型创建 Many to Many...

  • 结合mybatis-plus 实现实体操作多表关联查询

    项目地址:github ...​ 实现简单的实体类操作多表, 首先你的项目是使用了mybatis-plus 才可以使用。 ​ 不做任何更改,也不会对项目产生任何影响,与手写XML 功能一样。 ​ 通过解析实体,调用通用的...

  • Spring Boot 整合——JPA 数据模型关联操作(一对一、一对多、多对多)

    表关联 上一篇介绍了JPA的简单使用,这一篇介绍JPA在表关联上的使用 一对一 配置参数 JPA对于数据实体一对一映射使用的是@OneToOne注解。 代码 User用户表 /** * 用户信息 * @author daify **/ @Data @Entity @...

  • JPA中多对多表关系的删除操作,如何删除放弃维护关联关系的一方和中间表的纪录

    数据库中的表 用户表:在配置实体类的时候放弃...需求:删除t_user表中的user_id 为1的用户,并删除相关的中间表纪录。 代码: @Test public void testRemove() { EntityManager manager = JPAUtil.createEn...

  • 利用视图进行多表关联

    可是我们就是要在一张表上关联10多个表,比如一张表中的很多字段都要关联码表,因为其有对应的翻译字段。那我们改怎么办呢? 只能将他分成俩次进行关联。 难不成我们要重新创建一个中间表就是为了关联一下么?...

  • gorm中多表关联的使用

    一、一对一的关系 1、这里举例说明常见的一对一的关系,比如员工和公司的关于,一个员工只能在一个公司就职 2、建议数据模型,默认外键的方式 ... // 默认的外键是当前的company_id指向company表中的id

  • jpa配置多对多关系(中间表)

    现在我们再tb_user或者tb_role中任意一个里面进行维护关系,多对对的情况下我们需要创建一个中间表来完成这个关系的映射,我们再tb_user中添加注解@ManyToMany然后再添加一个注解@JoinTable因为我们是要创建中间表...

  • Gorm一对多关系表操作与非固定结构表数据获取

    一对多表模型定义 不固定模型结构的表数据获取 小结 参考资料: 1. 简介 在一个实际工程中需要采集一些对象的属性信息,该工程涉及多个项目,每一个项目所采集的对象属性字段各不相同且无法提前预知,需要根据...

  • 基于vue的菜谱网站,前端采用vue,后端采用express,数据库采用mysql。.zip-毕设&课设&实训&大作业&竞赛&项目

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

  • 数据分析全流程指南:从基础知识到实战项目的Python&R生态应用

    内容概要:本文档提供了关于数据分析全面的知识介绍与实战资源链接。首先,在数据分析的基础教程部分讲述了使用Python以及R两种语言来进行实际的数据分析工作所需具备的各项基本技能。其次,进阶教程涵盖从机器学习到深度学习的概念及其Python具体应用场景。接着,在工具有效利用层面介绍了多种热门库与平台的作用特点。在项目实践中,列举了四个实战案例:Titanic幸存者预测、房价预测、社交媒体情感倾向分析以及市场顾客购买模式研究,每个项目都有详细的技术流程指引。另外列出多个外部网站资源供进一步提升学习。 适用人群:本文主要面向有志于从事数据挖掘工作的学生和技术爱好者,同时也可辅助在职人士自我能力进阶。无论是在学术科研还是实际业务需求环境中都值得研读。 使用场景及目标:学习者将能够获取到系统的理论知识体系,熟悉业界主流软件包的功能优势,掌握具体业务问题解决方案路径,提高自身的综合技术素质,从而为个人职业规划增添竞争力。 其他说明:文档里推荐了不少高质量参考资料和实用线上学习社区,能有效补充专业知识空白并促进社交协作交流。

Global site tag (gtag.js) - Google Analytics