神经网络调参:食谱级指南

本文翻译自:A Recipe for Training Neural Networks

重要的发现:

  1. 神经网络训练是一种有缺陷的抽象:调包并不像使用其他API(如https)那样简单。
  2. 网络训练经常在不知不觉中失败:大部分时候并没有明显的报错,但是你有可能在数据增强的时候忘记对标签做相应的操作,或者想做梯度裁剪但是不小心做了loss裁剪,或者不当的正则化,初始化,学习率等等 。所有这些都可能会导致你的网络看上去在正常训练,但结果一塌糊涂。根据作者的经验,与深度学习的成功最密切相关的品质是耐心和对细节的关注

神经网络训练食谱正文

基于以上两点发现,作者提出了神经网络训练时的检查步骤,基本原则是增量式的添加代码,充分验证并尽最大努力确保不引入bug。(此处有点像叔本华建议的认知过程,即从小应该多接触传记类的纪实书籍,避免小说类等虚构的故事,从而逐渐获得对这世界的真实的认知)如果用训练神经网络来比喻你写代码的过程,那么就应该是使用非常小的学习率,并在每一次迭代后都在整个测试集上进行验证。

具体的检查步骤如下:

1. 与数据融为一体

训练神经网络的第一步不必接触任何神经网络代码,应该从彻底检查数据开始。包括花大量时间浏览数据,检测坏样本、样本和标签不匹配、样本不均衡等问题。

此外,由于神经网络实际上是数据集的压缩版本,你能够获得网络的(错误)预测结果并分析得到这种结果的原因(bad case 分析)。如果网络给出的预测与你在数据中看到的不一致,可能就存在问题。

一旦你有了定性的感觉,可以写一些简单的代码来搜索/过滤/排序你能想到的任何东西(例如标签类型、标注大小、标注数量等)并可视化它们的分布、异常值或者离群值,这样几乎总能发现数据质量或预处理方面的一些错误。

2. 搭建端到端训练-测试骨架,并得到baseline结果

检查完数据之后就可以直接上一些高级的模型了吗,如ASPP, FPN?NO, 如果这样的话你就走上了遭罪之路(hhhh, 原文:That is the road to suffering.)。此时,应该用一个你有把握不出错的小模型(如一个简单convNet, 或者在特定任务上公认的baseline model)搭建一个端到端的训练测试框架,并确保loss,模型输出等一切正常。此外还可以做一些带有明确预期输出的消融实验。

此阶段的tricks有:

  • 固定随机种子:帮助你获得可复现的结果并帮助你保持理智hhh
  • 简化:此阶段应disable任何fancy的模块,如数据增强
  • 丰富测试指标:测试时增加一些有意义的指标
  • 验证初始时的loss:网络初始化时的loss是可以推测出来的
  • 适当初始化:正确地初始化网络最后一层的权重(根据输出的分布或者范围)
  • human baseline: 监控除loss之外的人类可解释和可检查的指标(如acc, example)
  • 和输入无关的baseline: 将输入置为全零,然后训练一个baseline,看模型是否学到了和输入无关的知识
  • 对一个batch的数据过拟合:验证模型有拟合简单数据的能力(loss最终收敛到0),如果不能的话就说明有bug。
  • 验证训练损失是否会随着模型参数增加而下降:因为此前只用了小模型,在整个数据集上训练应该会欠拟合,理论上此时增加模型参数量会使性能提升,如果不符合以上预期说明有bug。
  • 在送入网络之前可视化数据:确保送入网络的东西符合你的预期,这一步会让你发现在数据预处理或者数据增强过程中的bug。
  • 在训练过程中动态可视化预测结果:特定的一批数据的预测结果在训练过程中是如何变化的会让你对训练过程有一个直观的感觉,如训练不稳定或者学习率可能太大或太小。
  • 利用反向传播确定依赖关系:有时tensor中的一些操作如broadcast,会让不同batch之间信息混合,此时可以通过将loss手动设置为只和input-i有关,然后反向传播,计算出来的梯度应该只和input-i有关,其他无关路径上的梯度应该都为零。可以用类似的方法确保有依赖关系的网络的依赖关系都符合预期。
  • 从特殊到一般:大家经常会在尝试从零开始直接写一个通用的功能时出bug,作者推荐的做法是,先写一个非常明确的功能,确保他不出错,然后再进行泛化,并保证和之前的版本得到同样的结果。比如在向量化代码的时候,可以先写一个完全循环的版本,然后通过每次去除一个循环的方式来逐步向量化(慢就是快 ---查理·芒格)

在此阶段结束时我们应该已经对数据有了很好的理解并且拥有了完整的训练-测试流水线,对于任意给定的模型我们都能获得一个可信并且可复现的结果。此外我们应该有了一些初步的实验结果,如输入无关的baseline,一些dumb baseline,对于人类的表现最好也有一个粗糙的认识。然后,我们就可以在接下来的两个阶段来迭代优化模型了。

具体方法是先设计一个有能力过拟合的大模型(让训练loss尽可能小,不管测试loss),然后加正则化(放弃一些训练loss来提升验证loss)。采用这种方法的原因是,如果我们用任何参数量的大模型都不能过拟合,那说明存在bug。

3. 过拟合

此阶段的tricks有:

  • 选择模型方面:Don't be a hero. 不要上来就像搭乐高积木一样堆叠一堆花里胡哨的模块,尤其是在项目早期要强力抵制这种诱惑,作者的建议是,找到最相关的文章,然后直接copy他们的取得不错结果的最简单的模型,如ResNet-50。
  • Adam is safe:优化器选Adam,这样可以在早期减少很多调参的麻烦。再次建议don’t be a hero and follow whatever the most related papers do.
  • 每次只让模型复杂一点:如果有很多要尝试的模块,每次只添加一个,并确保性能得到了提升。
  • 不要相信默认的学习率衰减策略:学习率衰减应该是在整个项目的最后期才做的事,并且不同的模型和数据或者训练策略之间的衰减策略是不互通的,所以早期就用固定学习率即可。

4. 正则化

此阶段的tricks有:

  • 增加数据量:最简单有效的给模型加正则化的方法就是扩充真实训练数据。
  • 数据增强:仅此与真实数据的就是半真实数据,尝试各种类型的数据增强(基于你对数据和任务的理解)
  • 创造性的数据增强:域随机化,模拟,混合数据,GAN等
  • 预训练:即使有足够的数据,用预训练的模型也绝对不亏。
  • 坚持监督学习:不要对无监督预训练过于兴奋,NLP中无监督可能更有用,可能的原因的是语言数据有更高的信噪比
  • 更小的输入维度:(针对识别任务)去除可能引入虚假信号的数据,任何额外的信息都会增加过拟合的可能性。同样的,如果底层细节不重要的话,尝试输入更低分辨率的图像。
  • 更小的模型:很多情况下可以用领域知识来约束模型,从而减少其参数量。如将imageNet中最后一层的全连接替换为avgpooling。
  • 更小的batch-size:因为batch normalization的存在,更小的batch size意味着更强的正则化。这是因为随机性更强。
  • drop out:谨慎使用,因为drop out在有batch norm的情况下表现并不好。
  • weight decay:
  • early stopping: 监控在验证集上的损失,在即将要过拟合的时候停止训练。
  • 尝试更大一点的模型:之所以在这里重提大模型是因为使用early stop后大模型的通常来说会比小模型更好。

最后,为了增加对训练好的模型的理解,可以可视化网络第一层的权重,确保得到了有意义的东西(如边缘检测核),如果可视化结果看起来像噪声,那就说明有问题。此外,网络的内部激活值有时也会暗示一些问题。

5. 调整

此时终于到了调参阶段,tricks:

  • 随机搜索而不是网格搜索:神经网络对不同参数的敏感度是不一样的,应该对更敏感的参数扩大搜索范围。
  • 关于超参数优化:有很多fancy的贝叶斯参数优化工具,但是作者的经验是sota的调参方法是用实习生 :) hhhhhhhhhhhhhh

6. 最后挤点果汁

当你获得了最好的网络结构和超参,还剩下最后一点trick来提升系统的性能。

  • 集成:模型集成能保证大概2%左右的性能提升,当然代价是测试时的速度,如果很在意测试时的速度和计算开销可以考虑使用知识蒸馏(此处推荐一篇:知识蒸馏 综述 Knowledge Distillation: A Survey
  • Leave it training:网络可以持续训练很长时间,有一次作者偶然间忘了停一个模型,等他寒假回来发现结果sota了(???????? :) 大力出奇迹是吧)

总结

当你读到这里你已经具备了所有成功必备因素:对技术、数据、任务有了深入理解,能让你对实验结果有充分信心的完整训练测试框架,逐步增加系统复杂性并在每一步都获得了预期的结果。因此,现在你已经做好了充分准备去阅读更多paper,尝试更多实验并得到你的SOTA!Good luck!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 菜菜神经网络全版本是一个基于人工智能技术开发的深度学习模型。它由多个神经元组成的层级网络,能够在大规模数据集上进行训练和优化,以实现各种任务的智能化解决方案。 菜菜神经网络全版本的核心是全连接层和卷积层。全连接层将输入数据与每个神经元连接以计算出输出结果,而卷积层通过一定的滤波器和池化操作来提取输入数据的特征。通过这些层的叠加和重复,菜菜神经网络全版本能够分析个体数据并从中学习并提取丰富的特征表示。 菜菜神经网络全版本的训练过程是通过梯度下降法来实现的。在每一次迭代中,网络会根据损失函数的反馈信号整权重和偏差,以使得预测结果与实际结果的误差不断减小。这样的迭代优化过程将使得菜菜神经网络逐渐学习到输入数据中的模式和规律,从而提高其性能和准确度。 菜菜神经网络全版本在各种任务中都具有广泛的应用。例如,在图像识别任务中,它可以通过学习卷积层的权重和偏差,来自动提取图像中的物体、边界和纹理等特征,并用于分类和检测。在自然语言处理任务中,菜菜神经网络全版本可以通过学习文本输入的语义和句法信息,来进行文本分类、机器翻译和自动问答等任务。 总的来说,菜菜神经网络全版本是一种高度复杂和强大的神经网络模型,具有广泛的应用前景。它可以通过大规模数据的学习和优化,自动进行特征提取和模式识别,从而实现各种智能化任务的自动化和准确化。 ### 回答2: 菜菜神经网络 Full Version是由OpenAI研发的一种智能计算系统。这个系统将神经网络应用于菜谱创作和菜肴推荐。菜菜神经网络通过大量的食谱数据和用户评价数据进行训练,以学习各种菜肴的制作方法、口味偏好和食材搭配。通过应用先进的自然语言处理和深度学习技术,菜菜可以生成符合用户需求的新菜谱,同时还能为用户提供个性化的菜肴推荐。 菜菜神经网络 Full Version在创作菜谱方面有很强的能力。它可以根据用户提供的食材和口味偏好,生成新的菜肴建议。菜菜能够综合考虑各种因素,如食材的搭配、烹饪方法和味品的使用,以提供用户独特且符合口味的菜肴方案。 此外,菜菜还能根据用户的健康需求和饮食限制,生成适合的营养菜谱。例如,对于需要低热量、低盐或素食的用户,菜菜可以提供相应的菜肴选择。 菜菜神经网络 Full Version不仅在创作菜谱方面有能力,还可以进行菜肴推荐。它会根据用户的喜好和历史评价,利用机器学习算法分析并预测用户可能喜欢的菜肴。通过学习用户的口味偏好和评价反馈,菜菜能够逐渐提升推荐的准确性,并准确理解用户的需求。 总之,菜菜神经网络 Full Version是一种强大的智能计算系统,能够为用户提供个性化的菜肴创作和推荐服务。无论是想要尝试新菜谱,还是寻找适合自己口味和需求的菜肴,菜菜都能够给出有效的建议和推荐。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值