【李飞飞】半天2k赞火爆推特!李飞飞高徒发布33条神经网络训练秘技

同学,现在有一份33条神经网络训练秘笈,摆在你面前 。
AI大佬 (简称AK),刚刚发布了一篇长长长长博客,苦口婆心地列举了33条技巧和注意事项,全面避免大家踩坑,推特已有2,300多赞 。
AK在斯坦福读博的时候,是飞飞实验室的成员 , 毕业去了,然后又成了特斯拉的AI负责人,直到如今 。
他的博客虽然一年一更,但一字一句皆是皆是多年心血凝结而成,每次更新必有重大回响 。
有生之年 , 我们把内文翻译如下:
训练模型的“处方”
总的来说,的技巧就是:不要心急 (文章结尾会道出原因) ,从简单到复杂逐步完善你的神经网络 。
1、先别着急写代码
训练神经网络前,别管代码 , 先从预处理数据集开始 。我们先花几个小时的时间,了解数据的分布并找出其中的规律 。
有一次在整理数据时发现了重复的样本 , 还有一次发现了图像和标签中的错误 。所以先看一眼数据能避免我们走很多弯路 。
由于神经网络实际上是数据集的压缩版本,因此您将能够查看网络(错误)预测并了解它们的来源 。如果你的网络给你的预测看起来与你在数据中看到的内容不一致 , 那么就会有所收获 。
一旦从数据中发现规律 , 可以编写一些代码对他们进行搜索、过滤、排序 。把数据可视化能帮助我们发现异常值,而异常值总能揭示数据的质量或预处理中的一些错误 。
2、设置端到端的训练评估框架
处理完数据集,接下来就能开始训练模型了吗?并不能!下一步是建立一个完整的训练+评估框架 。
在这个阶段 , 我们选择一个简单又不至于搞砸的模型,比如线性分类器、CNN,可视化损失 。获得准确度等衡量模型的标准,用模型进行预测 。
这个阶段的技巧有:
使用固定的随机种子,来保证运行代码两次都获得相同的结果 , 消除差异因素 。
在此阶段不要有任何幻想,不要扩增数据 。扩增数据后面会用到,但是在这里不要使用 , 现在引入只会导致错误 。
在绘制测试集损失时,对整个测试集进行评估,不要只绘制批次测试损失图像 , 然后用对它们进行平滑处理 。
验证函数是否从正确的损失值开始 。例如,如果正确初始化最后一层,则应在初始化时测量-log(1/) 。
正确初始化最后一层的权重 。如果回归一些平均值为50的值,则将最终偏差初始化为50 。如果有一个比例为1:10的不平衡数据集 , 请设置对数的偏差,使网络预测概率在初始化时为0.1 。正确设置这些可以加速模型的收敛 。
监控除人为可解释和可检查的损失之外的指标 。尽可能评估人的准确性并与之进行比较 。或者对测试数据进行两次注释,并且对于每个示例 , 将一个注释视为预测,将第二个注释视为事实 。
最简单的方法是将所有输入设置为零,看看模型是否学会从输入中提取任何信息 。
增加了模型的容量并验证我们可以达到的最低损失 。
尝试稍微增加数据容量 。
将原始张量的数据和标签可视化,可以节省了调试次数 , 并揭示了数据预处理和数据扩增中的问题 。
在训练过程中对固定测试批次上的模型预测进行可视化 。
一个方法是将第i个样本的损失设置为1.0,运行反向传播一直到输入,并确保仅在第i个样本上有非零的梯度 。
3、过拟合

【李飞飞】半天2k赞火爆推特!李飞飞高徒发布33条神经网络训练秘技

文章插图
首先我们得有一个足够大的模型,它可以过拟合,减少训练集上的损失,然后适当地调整它 , 放弃一些训练集损失,改善在验证集上的损失) 。
这一阶段的技巧有:
为了获得较好的训练损失,我们需要为数据选择合适的架构 。不要总想着一步到位 。如果要做图像分类 , 只需复制粘贴-50 , 我们可以在稍后的过程中做一些自定义的事 。
在设定基线的早期阶段,使用学习率为3e-4的Adam。根据经验,亚当对超参数更加宽容 , 包括不良的学习率 。
如果多个信号输入分类器 , 建议逐个输入,然后增加复杂性,确保预期的性能逐步提升,而不要一股脑儿全放进去 。比如,尝试先插入较小的图像,然后再将它们放大 。
如果不小心,代码可能会过早地将学习率减少到零,导致模型无法收敛 。我们完全禁用学习率衰减避免这种状况的发生 。
4、正则化
理想的话,我们现在有一个大模型,在训练集上拟合好了 。
现在,该正则化了 。舍弃一点训练集上的准确率,可以换取验证集上的准确率 。
这里有一些技巧:
至今大家最偏爱的正则化方法,就是添加一些真实训练数据 。
不要在一个小数据集花太大功夫,试图搞出大事情来 。有精力去多收集点数据,这是唯一一个确保性能单调提升的方法 。
把数据集做大,除了继续收集数据之外,就是扩增了 。旋转,翻转 , 拉伸,做扩增的时候可以野性一点 。
还有什么办法扩增数据集?比如域随机化 ( )  , 模拟 () ,巧妙的混合 (),比如把数据插进场景里去 。甚至可以用上GAN 。
当然,就算你手握充足的数据 , 直接用预训练模型也没坏处 。
不要对无监督预训练太过兴奋了 。至少在视觉领域,无监督到现在也没有非常强大的成果 。虽然,NLP领域有了BERT , 有了会讲故事的GPT-2 , 但我们看到的效果很大程度上还是经过了人工挑选 。
把那些可能包含虚假信号的特征去掉,因为这些东西很可能造成过拟合,尤其是数据集不大的时候 。
同理 , 如果低层细节不是那么重要的话,就输入小一点的图片,捕捉高层信息就好了 。
模型小一点
许多情况下,都可以给网络加上领域知识限制 (),来把模型变小 。
比如,以前很流行在的骨架上放全连接层,但现在这种操作已经被平均池化取代了 , 大大减少了参数 。
对批量归一化 (Batch ) 这项操作来说,小批量可能带来更好的正则化效果 ()。
给卷积网络用 。不过使用需谨慎,因为这种操作似乎跟批量归一化不太合得来 。
增加权重衰减 ( Decay) 的惩罚力度 。
不用一直一直训练 , 可以观察验证集的损失,在快要过拟合的时候,及时喊停 。
注意,这条紧接上条 (且仅接上条)。
我发现,大模型很容易过拟合,几乎是必然 , 但早停的话,模型可以表现很好 。
最后的最后,如果想要更加确信,自己训练出的网络,是个不错的分类器,就把第一层的权重可视化一下 , 看看边缘 (Edges) 美不美 。
如果第一层的过滤器看起来像噪音,就需要再搞一搞了 。同理,激活 () 有时候也会看出瑕疵来,那样就要研究一下哪里出了问题 。
【【李飞飞】半天2k赞火爆推特!李飞飞高徒发布33条神经网络训练秘技】5、调参
读到这里,你的AI应该已经开始探索广阔天地了 。这里,有几件事需要注意 。
【李飞飞】半天2k赞火爆推特!李飞飞高徒发布33条神经网络训练秘技

文章插图
在同时调整多个超参数的情况下,网格搜索听起来是很诱人,可以把各种设定都包含进来 。
但是要记住,随机搜索才是最好的 。
直觉上说,这是因为网络通常对其中一些参数比较敏感,对其他参数不那么敏感 。
如果参数a是有用的,参数b起不了什么作用,就应该对a取样更彻底一些 , 不要只在几个固定点上多次取样 。
世界上 , 有许多许多靓丽的贝叶斯超参数优化工具箱,很多小伙伴也给了这些工具好评 。
但我个人的经验是,State-of-the-Art都是用实习生做出来的 (误)。
6、还能怎么压榨**
当你已经找到了好用的架构和好用的超参数,还是有一些技巧,可以在帮你现有模型上获得更好的结果,榨干最后一丝潜能:
把几个模型结合在一起,至少可以保证提升2%的准确度 , 不管是什么任务 。
如果,你买不起太多的算力,就用蒸馏 () 把模型们集合成一个神经网络 。
通常,人类一看到损失趋于平稳,就停止训练了 。
但我感觉,还是训练得昏天黑地 , 不知道多久了,比较好 。
有一次,我意外把一个模型留在那训练了一整个寒假 。
我回来的时候,它就成了State-of-the-Art 。
One More Thing
无独有偶,前两天有只“阵亡的程序猿”说:
AWS的钱,不是花在你用了多少,而是花在你忘了关电脑 。
同学,如果你也曾经有这样的经历,那么恭喜,你也有训练出State-of-the-Art的潜力 。
原文链接:
致转行AI的在校大学生的一封信
【AI自学】 完备的 AI 学习路线,最详细的资源整理!
转行AI需要看的一些文章
转行学AI,具体细分方向如何?。醋砸幌吖こ淌Φ母形?
用法律武器 , 痛击腾讯侵权行为?。。⊥迩斯ぶ悄芸梢愿纳浦恫ㄏ肿绰穑?
【送书PDF】编程从入门到实践
从入门到精通,深度学习与机器学习资料大礼包!
【免费】某机构最新3980元机器学习/大数据课程高速下载,限量200份
觉得不错, 请随意转发,麻烦点个在看!