半天2k真好啊推特!李飞飞高徒发布33支神经网络训练秘技-量子比特
同学,现在摆在你面前的33个神经网络训练诀窍。
AI老爷子AndrejKarpathy(简称AK),刚发布了一个长博客,费尽心思列举了33个技巧和注意事项,全面避免大家踩坑,推特有2300多个赞赞。
AK斯坦福读博客的时候,是飞飞实验室的成员,毕业后去了OpenAI,然后成为特斯拉的AI负责人,直到现在。
他的博客每一年更新一次,但每一句都是多年的心灵凝结,每次更新都有很大反响。
在有生之年,我们把内文翻译如下。
训练模型配方
总的来说,AndrejKarpathy的技巧是,不要着急(在文章结尾说原因),从简单到复杂逐步完善你的神经网络。
1、不要着急写代码
在训练神经网络之前,不管代码如何,先从预处理数据集开始。我们先花几个小时了解数据的分布,找出其中的规律。
Andrej在数据整理过程中发现重复样本,有时发现图像或标签错误。所以先看数据,避免我们走很多弯路。
因为神经网络实际上是数据集的压缩版本,所以可以通过显示网络(错误)预测来理解源。如果你的网络给你的预测看起来和你在数据上看到的内容不一致,那就有收获了。
当你从数据中发现规则时,你可以编写一些代码来搜索、过滤和排序。可视化数据有助于发现异常值,但异常值总是会揭示数据质量和预处理中的一些错误。
2、端到端培训评估框架设置
处理完数据集后,下一步可以开始模型培训了吗。并不是!下一步是构建完整的培训+评估框架。
在此阶段,您将选择一个简单且不会失败的模型,例如线性分类器、CNN和可视化丢失。得到精度等测量模型的基准,用模型进行预测。
此阶段的技巧包括:。
固定随机种子
使用固定的随机种子,确保执行代码两次都得到相同的结果,从而消除差异因素。
简化
在这个阶段,不要放大数据。稍后将使用放大数据,但请勿在此使用。现在部署只会出错。
为评估添加有效数字
绘制测试集丢失时,请评估整个测试集,并使用Tensorboard进行平滑,而不只是绘制批量测试丢失图像。
在初始阶段验证损失函数
确保函数从正确的丢失值开始。例如,如果要正确初始化最终层,则在softmax初始化时必须测量-log(1/n_classes)
初始化
正确初始化最后一层的权重。如果回归平均值为50,则将最终偏差初始化为50。如果存在比率为1:10的不平衡数据集,则设置对数偏差,使网络预测概率在初始化时为0.1。正确设置它们可以促进模型收敛。
人类基线
监测可人为解释和可检查的损失以外的指标。尽量评估和比较人的准确性。或者,对测试数据进行两次注释,对于每个示例,将一个注释视为预测,将第二个注释视为事实。
设置独立于输入的基线
最简单的方法是将所有输入设置为零,看模型能否从输入中提取信息。
过盈batch
增加模型的容量,验证可实现的最小损失。
减少训练损失的验证
试着增加一点数据容量吧。
训练模型前的数据可视化
通过可视化原始张量的数据和标签,可以节省调试次数,揭示了数据预处理和数据放大中的问题。
可视化预测动态
在训练过程中可视化固定试验批次上的模型预测。
使用反向传播来获得依赖关系:
一种方法是将第i个采样的丢失设置为1.0,然后执行反向传播直到输入,以确保只有第i个采样具有非零梯度。
总结例外:为正在做的事情创建一个非常具体的函数,让它运行,然后确保以后得到相同的结果。
3、超合身
首先,我们必须有足够大的模型。它过于合身,可以减少训练集上的损失,然后适当调整,放弃一些训练集的损失,可以改善验证集上的损失)
此阶段的技巧包括:。
选择模型
为了获得更好的培训损失,必须为数据选择合适的体系结构。永远不要想着一步到位。要进行图像分类,只需复制并粘贴ResNet-50,以后就可以自定义了。
Adam方法安全
在设置基线的初始阶段,使用学习率为3e-4的Adam。经验表明,亚当对超参数更宽容,包括不良的学习率。
一次只复杂一个
如果有多个信号输入分类器,请逐个输入,然后增加复杂性,确保预期性能逐步提高,不要混为一谈。例如,插入一个小图像,然后放大。
不相信学习率衰减默认值
如果不小心,代码可能会使学习速度过快,导致模型无法收敛。我们会完全禁用学习率衰减,避免这种情况的发生。
4、规范化
理想情况下,我们现在有一个适合训练集的大模型。
现在应该正规化。可以稍微放弃训练集的精度,与验证集的精度进行交换。
这里有一些技巧。
获取更多数据
迄今为止大家最喜欢的正则化方法是添加一些实际的培训数据。
不要在小数据集上花太大力气,想做大事。有精力多收集数据,这是确保性能单调提高的唯一方法。
数据放大
要增加数据集,除了继续收集数据之外,还要进行扩展。旋转、反转、拉伸、放大时可以稍微野性一点。
创造性的放大
有增加数据集的方法吗。例如,域随机化、模拟、巧妙混合,例如将数据插入场景中。也可以使用GAN。
事前训练
当然,即使你有足够的数据,也可以直接使用预培训模式。
向导演学习
不要对无监督预备训练过于兴奋。至少在视觉领域,无监督至今仍未取得非常强劲的成就。NLP领域有BERT,有讲故事的GPT-2,但我们看到的效果很大程度上是人工选择的。
输入低维点
这些东西消除了可能包含假信号的特征,尤其是在数据集不大的情况下。
同样,如果低层细节不那么重要,则输入小图像来捕捉上层信息即可。
减小模型
在许多情况下,您可以通过在网络上添加区域知识限制来减少模型。
例如,以前流行在ImageNet骨架上放置全连接层,但现在该操作被平均池化取代,参数大大减少。
减小批大小
在“批规格化”操作中,小批处理可能会带来更好的规格化效果。
· Dropout
提供用于卷积网络的dropout2d。但是,此操作似乎与批处理规范化不太匹配,因此必须谨慎使用。
权重衰减
提高权重衰减的惩罚能力。
快速停止法
不需要一直训练,你可以观察到验证集的损失,如果你快要过了拟合,你可以立即停止。
也试一下大的模型
请注意,此栏接在顶部(并且仅连接到顶部)
我们发现,大模型很容易被拟合,几乎是必然的,但如果早点停下来,模型就会表现得很好。
最后的最后,如果你想更确信自己训练的网络是一个很好的分类器,那就可视化第一层的权重,看看边缘(Edges)是否好看。
如果第一级过滤器看起来像噪音,你需要再做一次。同样,激活也可能会出现瑕疵,但我们必须研究问题出在哪里。
5、调整
读到这里,你的AI应该已经开始探索广阔的天地了。这里有几点需要注意的事情。
随机网格搜索
当同时调整多个超参数时,网格搜索听起来很有吸引力,可以包含各种设置。
但是你要记住随机搜索是最好的。
直觉上,网络通常对一些参数敏感,因为它对其他参数不那么敏感。
如果参数a是有用的,并且参数b不起任何作用,那么应该更彻底地对a进行采样,不要只在几个固定点上进行多次采样。
超参数优化
世界上有许多美丽的贝叶斯超参数优化工具箱,许多小伙伴也在评价这些工具。
但是,以我个人的经验,State-of-the-Art是由实习生制作的(错误)
6、如何压榨
在找到易用的结构和易用的超参数时,还是有一些技巧,可以在现有的模型上得到更好的结果,缩小最后的潜能:
模型合并
结合几个模型,无论任务如何,都能保证至少2%的精度提高。
如果你买不起太多的计算能力,那就用蒸馏(Distill)把模型们集合到神经网络上吧。
让我训练吧
通常,人类看到损失趋于平稳,就会停止训练。
但是,我觉得,还是训练模糊,不知道多久,比较好。
有一次,我竟然在寒假期间留下模特训练。
当我回来的时候,它变成了State-of-the-Art。
One More Thing
偶然的是,前几天有一只“战死手续猿”。
同学,如果你也有这样的经历,恭喜你,你也有训练State-of-the-Art的潜力。
原文链接:
http://karpathy.github.io/2019/04/25/recipe/