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

本文主要是介绍【李飞飞】半天2k赞火爆推特!李飞飞高徒发布33条神经网络训练秘技,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


640?wx_fmt=png

同学,现在有一份33条神经网络训练秘笈,摆在你面前。

AI大佬Andrej Karpathy (简称AK) ,刚刚发布了一篇长长长长博客,苦口婆心地列举了33条技巧和注意事项,全面避免大家踩坑,推特已有2,300多赞。

640?wx_fmt=png

AK在斯坦福读博的时候,是飞飞实验室的成员,毕业去了OpenAI,然后又成了特斯拉的AI负责人,直到如今。

他的博客虽然一年一更,但一字一句皆是皆是多年心血凝结而成,每次更新必有重大回响。

有生之年,我们把内文翻译如下:


训练模型的“处方”


总的来说,Andrej Karpathy的技巧就是:不要心急 (文章结尾会道出原因) ,从简单到复杂逐步完善你的神经网络。

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、正则化

理想的话,我们现在有一个大模型,在训练集上拟合好了。

现在,该正则化了。舍弃一点训练集上的准确率,可以换取验证集上的准确率。

这里有一些技巧:

  • 获取更多数据

至今大家最偏爱的正则化方法,就是添加一些真实训练数据。

不要在一个小数据集花太大功夫,试图搞出大事情来。有精力去多收集点数据,这是唯一一个确保性能单调提升的方法。

  • 数据扩增

把数据集做大,除了继续收集数据之外,就是扩增了。旋转,翻转,拉伸,做扩增的时候可以野性一点。

  • 有创意的扩增

还有什么办法扩增数据集?比如域随机化 (Domain Randomization) ,模拟 (Simulation) ,巧妙的混合 (Hybrids) ,比如把数据插进场景里去。甚至可以用上GAN。

  • 预训练

当然,就算你手握充足的数据,直接用预训练模型也没坏处。

  • 跟监督学习死磕

不要对无监督预训练太过兴奋了。至少在视觉领域,无监督到现在也没有非常强大的成果。虽然,NLP领域有了BERT,有了会讲故事的GPT-2,但我们看到的效果很大程度上还是经过了人工挑选。

  • 输入低维一点

把那些可能包含虚假信号的特征去掉,因为这些东西很可能造成过拟合,尤其是数据集不大的时候。

同理,如果低层细节不是那么重要的话,就输入小一点的图片,捕捉高层信息就好了。

模型小一点

许多情况下,都可以给网络加上领域知识限制 (Domain Knowledge Constraints) ,来把模型变小。

比如,以前很流行在ImageNet的骨架上放全连接层,但现在这种操作已经被平均池化取代了,大大减少了参数。

  • 减小批尺寸

对批量归一化 (Batch Normalization) 这项操作来说,小批量可能带来更好的正则化效果 (Regularization) 。

  • Dropout

给卷积网络用dropout2d。不过使用需谨慎,因为这种操作似乎跟批量归一化不太合得来。

  • 权重衰减

增加权重衰减 (Weight Decay) 的惩罚力度。

  • 早停法

不用一直一直训练,可以观察验证集的损失,在快要过拟合的时候,及时喊停。

  • 也试试大点的模型

注意,这条紧接上条 (且仅接上条) 。

我发现,大模型很容易过拟合,几乎是必然,但早停的话,模型可以表现很好。

最后的最后,如果想要更加确信,自己训练出的网络,是个不错的分类器,就把第一层的权重可视化一下,看看边缘 (Edges) 美不美。

如果第一层的过滤器看起来像噪音,就需要再搞一搞了。同理,激活 (Activations) 有时候也会看出瑕疵来,那样就要研究一下哪里出了问题。

5、调参

读到这里,你的AI应该已经开始探索广阔天地了。这里,有几件事需要注意。

  • 随机网格搜索

在同时调整多个超参数的情况下,网格搜索听起来是很诱人,可以把各种设定都包含进来。

但是要记住,随机搜索才是最好的。

直觉上说,这是因为网络通常对其中一些参数比较敏感,对其他参数不那么敏感。

如果参数a是有用的,参数b起不了什么作用,就应该对a取样更彻底一些,不要只在几个固定点上多次取样。

  • 超参数优化

世界上,有许多许多靓丽的贝叶斯超参数优化工具箱,很多小伙伴也给了这些工具好评。

但我个人的经验是,State-of-the-Art都是用实习生做出来的 (误) 。

6、还能怎么压榨**

当你已经找到了好用的架构和好用的超参数,还是有一些技巧,可以在帮你现有模型上获得更好的结果,榨干最后一丝潜能:

  • 模型合体

把几个模型结合在一起,至少可以保证提升2%的准确度,不管是什么任务。

如果,你买不起太多的算力,就用蒸馏 (Distill) 把模型们集合成一个神经网络。

  • 放那让它训练吧

通常,人类一看到损失趋于平稳,就停止训练了。

但我感觉,还是训练得昏天黑地,不知道多久了,比较好。

有一次,我意外把一个模型留在那训练了一整个寒假。

我回来的时候,它就成了State-of-the-Art。


One More Thing


无独有偶,前两天有只“阵亡的程序猿”说:

AWS的钱,不是花在你用了多少,而是花在你忘了关电脑。

640?wx_fmt=png

同学,如果你也曾经有这样的经历,那么恭喜,你也有训练出State-of-the-Art的潜力。

原文链接:

http://karpathy.github.io/2019/04/25/recipe/



致转行AI的在校大学生的一封信


【AI自学】 完备的 AI 学习路线,最详细的资源整理!


转行AI需要看的一些文章


转行学AI,具体细分方向如何选,来自一线工程师的感悟


用法律武器,痛击腾讯侵权行为!!!湾区人工智能可以改善知识产权现状吗?


【送书PDF】Python编程从入门到实践


Python从入门到精通,深度学习与机器学习资料大礼包!


【免费】某机构最新3980元机器学习/大数据课程高速下载,限量200份



640?wx_fmt=png



640?wx_fmt=png


 觉得不错, 请随意转发,麻烦点个在看!



这篇关于【李飞飞】半天2k赞火爆推特!李飞飞高徒发布33条神经网络训练秘技的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/589923

相关文章

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree

Linux Mint Xia 22.1重磅发布: 重要更新一览

《LinuxMintXia22.1重磅发布:重要更新一览》Beta版LinuxMint“Xia”22.1发布,新版本基于Ubuntu24.04,内核版本为Linux6.8,这... linux Mint 22.1「Xia」正式发布啦!这次更新带来了诸多优化和改进,进一步巩固了 Mint 在 Linux 桌面

多模块的springboot项目发布指定模块的脚本方式

《多模块的springboot项目发布指定模块的脚本方式》该文章主要介绍了如何在多模块的SpringBoot项目中发布指定模块的脚本,作者原先的脚本会清理并编译所有模块,导致发布时间过长,通过简化脚本... 目录多模块的springboot项目发布指定模块的脚本1、不计成本地全部发布2、指定模块发布总结多模

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令 在日常的工作中由于各种原因,会出现这样一种情况,某些项目并没有打包至mvnrepository。如果采用原始直接打包放到lib目录的方式进行处理,便对项目的管理带来一些不必要的麻烦。例如版本升级后需要重新打包并,替换原有jar包等等一些额外的工作量和麻烦。为了避免这些不必要的麻烦,通常我们

禅道Docker安装包发布

禅道Docker安装包发布 大家好, 禅道Docker安装包发布。 一、下载地址 禅道开源版:   /dl/zentao/docker/docker_zentao.zip  备用下载地址:https://download.csdn.net/download/u013490585/16271485 数据库用户名: root,默认密码: 123456。运行时,可以设置 MYSQL_ROOT_P