当前位置: 首页 > 科技观察

半天2k赞,李飞飞高途发布33个神经网络训练秘笈

时间:2023-03-16 21:42:28 科技观察

本文经AI新媒体量子比特(公众号ID:QbitAI)授权转载,转载请联系出处。同学们,现在摆在你们面前的是33个神经网络训练技巧。AI大佬AndrejKarpathy(简称AK)刚刚发表了一篇又长又长的博客,煞费苦心地列出了33条避免大家踩坑的小技巧和注意事项,并获得了2300多个赞。AK在斯坦福读博士的时候,是飞飞实验室的成员,毕业到OpenAI,然后成为特斯拉AI的负责人,一直到现在。他的博客虽然一年更新一次,但字字句句都是多年磨练而成,每次更新必有重大反响。在我们的一生中,我们将文本翻译如下:训练模型的“处方”总的来说,AndrejKarpathy的技巧是:不要心急(原因会在文末解释),逐步完善你的神经网络从简单到复杂。1.训练神经网络之前不要着急写代码,不要着急写代码,先从预处理后的数据集开始。我们先花几个小时,了解数据的分布并找到其中的模式。有一次,Andrej在清理数据时发现了重复的样本,还有一次,他发现了图像和标签中的错误。所以先看数据可以让我们少走很多弯路。由于神经网络实际上是数据集的压缩版本,您将能够查看网络的(错误)预测并了解它们的来源。如果您的网络给您的预测似乎与您在数据中看到的不匹配,那么您将有所收获。一旦在数据中找到模式,就可以编写一些代码来搜索、过滤和排序它们。可视化数据可以帮助我们发现异常值,这些异常值总是可以揭示数据的质量或预处理中的一些错误。2.建立一个端到端的训练和评估框架处理完数据集之后,接下来是不是可以开始训练模型了?才不是!下一步是构建一个完整的训练+评估框架。在这个阶段,我们选择一个简单而不凌乱的模型,比如线性分类器、CNN,并将损失可视化。获得衡量模型的标准,例如准确性,并使用模型进行预测。这个阶段的技巧是:·FixedRandomSeed使用一个固定的随机种子来确保你在运行代码时两次得到相同的结果,消除方差因素。·简单在这个阶段不要有任何幻想,不要扩充数据。增广数据后面会用到,但是这里不要用,现在引入只会出错。在评估中添加有效数字绘制测试集损失时,评估整个测试集,不要只绘制成批的测试损失图像,然后使用Tensorboard对其进行平滑处理。在初始阶段验证损失函数验证函数以正确的损失值开始。例如,如果你正确地初始化了一个层,你应该在softmax初始化时测量-log(1/n_classes)。初始化正确地初始化了层的权重。如果回归某个平均值为50的值,则将最终偏差初始化为50。如果您有一个比例为1:10的不平衡数据集,请设置对数偏差,以便网络在初始化时预测概率为0.1。正确设置这些可以加快模型的收敛速度。人类基线监控指标,而不是人类可解释和可检查的损失。尽可能评估并与人类准确性进行比较。或者对测试数据进行两次注释,对于每个示例,将一个注释视为预测,将第二个注释视为事实。设置独立于输入的基线的最简单方法是将所有输入设置为零,然后查看模型是否学会从输入中提取任何信息。·过度拟合批次会增加模型的容量并验证我们可以实现的损失。验证减少训练损失以尝试稍微增加数据容量。·训练模型前的数据可视化可视化原始张量数据和标签可以节省调试时间并揭示数据预处理和数据扩充中的问题。可视化预测动态在训练期间可视化固定测试批次的模型预测。使用反向传播来获取依赖关系:一种方法是将第i个样本的损失设置为1.0,一直运行反向传播到输入,并确保仅在第i个样本上存在非零梯度。·泛化一个特殊情况:编写一个非常具体的函数,让它运行,然后确保在该过程的后面得到相同的结果。3.过拟合首先我们要有一个足够大的模型可以过拟合以减少训练集上的损失,然后适当调整以放弃一些训练集损失并提高验证集上的损失)。这个阶段的技巧是:·模型选择为了获得良好的训练损失,我们需要为数据选择合适的架构。不要总是一步一个脚印地想。对于图像分类,只需复制粘贴ResNet-50,我们可以在稍后的过程中做一些自定义的事情。Adam方法在baseline设置的早期使用学习率为3e-4的Adam是安全的。根据经验,Adam对超参数更宽容,包括糟糕的学习率。·一次只复杂化一个。如果有多个信号输入到分类器,建议一个一个输入,然后增加复杂度,以保证预期的性能逐渐提高,而不是全部放在一个大脑里。例如,尝试先插入较小的图像,然后再按比例放大。不要相信学习率衰减默认值。如果您不小心,代码可能会过早地将学习率降低到零,从而导致模型无法收敛。我们完全禁用学习率衰减以防止这种情况发生。4.如果正则化是理想的,我们现在有一个已经在训练集上拟合的大模型。现在,是时候规范化了。训练集上的一点点准确性可以换取验证集上的准确性。以下是一些提示:获取更多数据到目前为止,最流行的正则化方法是添加一些真实的训练数据。不要在小数据集上努力工作,试图让大事发生。有精力去收集更多的数据,这是保证单调性能提升的一种方式。·数据扩充使数据集更大。除了继续收集数据,就是放大。疯狂地旋转、翻转、拉伸和放大。·CreativeAugmentation还有什么可以增强数据集?比如域随机化(DomainRandomization)、模拟(Simulation)、巧妙混合(Hybrids),比如向场景中插入数据。甚至可以使用GAN。·预训练当然,即使你有足够的数据,直接使用预训练模型也没有坏处。不要对无监督预训练过于兴奋。至少在视野方面,unsupervised目前为止还没有非常强的效果。虽然NLP领域有BERT,也有GPT-2可以讲故事,但我们看到的效果很大程度上是人为选择的。·输入一个较低的维度来去除可能包含错误信号的特征,因为这些东西很可能会导致过拟合,尤其是当数据集不大的时候。同理,如果底层细节不是那么重要,输入较小的图片,捕获高层信息即可。·模型更小在很多情况下,可以在网络中加入领域知识约束(DomainKnowledgeConstraints)来使模型更小。比如之前很流行在ImageNet骨架上放一个全连接层,但是现在这个操作已经被averagepooling代替了,大大减少了参数。·减小batchsize对于批量归一化(BatchNormalization)操作,小批量可能带来更好的正则化效果(Regularization)。·Dropout对卷积网络使用dropout2d。但是,它应该谨慎使用,因为这个操作似乎与批归一化不兼容。·重量衰减增加了重量衰减的惩罚。·earlystopping方法不需要一直训练,可以观察验证集的损失,在快要过拟合的时候及时停止。·也可以尝试更大的模型请注意,此行位于顶部栏之后(并且仅位于顶部栏)。我发现大型模型容易过度拟合,几乎可以肯定,但是通过提前停止,模型可以表现得很好。如果你想更有信心你训练的网络是一个很好的分类器,你可以可视化权重并查看边缘是否漂亮。如果过滤器看起来像噪音,是时候再试一次了。同理,Activations有时也能看出破绽,所以有必要去排查哪里出了问题。5.调整看完这篇,你的AI应该已经开始探索广阔的世界了。在这里,有几点需要注意。随机网格搜索在同时调整多个超参数的情况下,网格搜索听起来很诱人,允许包含各种各样的设置。但请记住,随机搜索更好。直觉上,这是因为网络通常对其中一些参数更敏感,而对其他参数不太敏感。如果参数a有用而参数b没有作用,你应该更彻底地采样a,而不是仅仅在几个固定点采样多次。·超参数优化世界上有很多很多漂亮的贝叶斯超参数优化工具箱,很多小伙伴也给了这些工具好评。但我个人的经验是,State-of-the-Art是实习生(错误地)做出来的。6.Howelsetosqueeze**当你找到有用的架构和有用的超参数后,仍然有一些技术可以帮助你在现有模型上获得更好的结果并挤出潜力:模型拟合将几个模型组合在一起至少保证无论是什么任务,准确率都提高了2%。如果您负担不起过多的计算能力,请使用Distill将模型组合成神经网络。让它训练。通常,人类一旦看到损失趋于平稳就会停止训练。但是我觉得还是在黑暗中训练比较好,不知道要多久。有一次,我不小心把一个模特留在了那里,整个寒假都在训练。当我回来时,它变成了最先进的。还有一件事是一样的。前两天有个“杀程序员”说:AWS的钱不是花在你用了多少,而是花在你忘了关电脑。同学们,如果你有过这样的经历,恭喜你,你也有培养State-of-the-Art的潜力。原文链接:http://karpathy.github.io/2019/04/25/recipe/