ronghuaiyang · 5月22日

如何高效的做机器学习项目

作者:Radek Osmulski

编译:ronghuaiyang

首发:AI公园公众号

导读

这篇文章比较早,但是内容很好,从实践中来到实践中去。确实是作者的经验之谈。

我刚完成一个项目,其中有80%我觉得自己几乎没有完成。我投入了大量的时间,最后完全失败了。

我知道或不知道的数学,我写代码的能力 —— 所有这些都是次要的。我处理这个项目的方式是失败的。

我现在相信,构建机器学习是一门艺术,或者说是一门手艺,而我常常狂读的那些数学大部头的书似乎都没有提到这一点。

我做了一点心路探索,回到了fast.ai的MOOC课程Jeremy Howard在Practical Deep Learning for Coders提到的内容,然后这篇文章就诞生了。

10s法则

我们坐在电脑前做事情。在宇宙中留下印记。降低预测的损失或减少模型的运行时间。

这里的关键词是做。这包括移动代码,重命名变量,可视化(数据),砸键盘。

但是,当它执行计算时,两分钟盯着电脑屏幕发呆,这样我们就可以一遍又一遍地运行它们,只是稍微修改一下参数,这是行不通的。

这也让我们面对了机器学习工作的最大祸根 —— 额外浏览器标签的诅咒。很容易按ctrl+t,很容易忘记我们在做什么。

这个解决方案可能听起来很荒谬,但它确实有效。当你处理一个问题时,永远不要让计算超过10秒。

但是我如何调整参数呢?关于这个问题,我怎样才能学到有意义的东西呢?

所需要做的就是以一种能够创建代表性样本的方式来取数据的一个子集。这可以用于任何领域,并且在大多数情况下只需要随机选择一定比例的样本即可。

一旦你取了一个数据子集,工作就变得具有交互性了。你进入了一种不受干扰的注意力流动状态。你不断地做实验,找出什么有效,什么无效。你的手指从不离开键盘。

时间延长了,你做的工作时间并不等于你本来要做的工作时间,如果你让自己分心的话,甚至连5小时的工作都做不到。

如何构造你的代码来简化这个工作流程?让切换到在完整数据集上运行变得非常简单。

image.png

当你即将写完代码,取消单元格注释并运行全部代码。

做一个时间垃圾邮件制造者(Be a time spammer)

这是对以上内容的补充。但它也远不止这些。

根据你如何构造代码,可以获得数量级的性能收益。如果你做了这样或那样的改变,如果能知道它一个东西运行了多长时间,将运行多长时间,这是很好的。然后你可以试着找出为什么会有这种不同,它会让你立刻成为一个更好的程序员。

image.png

最重要的是,这与“绝不跑超过10秒”的承诺相辅相成。

自测试

一旦你在数据处理pipeline中犯了一个错误而未被注意到,就几乎不可能恢复。在很大程度上,这也适用于模型构建(特别是如果你开发自己的组件,例如层,等等)。

关键是在进行过程中检查数据。在转换之前和之后查看它。总结一下。如果你知道在合并之后应该没有NAs,请检查是否确实没有。

测试一切。

从长远来看,保持头脑清醒的唯一方法就是在短期内变得多疑。

冲向成功

当你处理一个问题时,你应该关注的第二件事是什么?(我马上就会说第一件事情)创建一个模型,端到端的数据操作pipeline,这都比随机要好。

它可以而且应该是你能想到的最简单的模型。通常这意味着一个线性组合。但是你要开始对这个问题有感觉。你想要开始形成一个可能的基线。

假设你花了3天时间构建了一个超级复杂的模型,但它完全不能工作,或者不能像你想象的那样远程工作。你到底干了什么?

你现在什么都不知道。你不知道在处理数据时是否犯了错误,也不知道数据是否是垃圾。你不知道你的模型是否有问题。希望你能够在没有可以依赖的组件的情况下解决这个问题。

此外,建立一个简单的模型可以让你鸟瞰整个情况。可能是数据缺失了?也许类别不平衡?也许数据没有正确地标注?

在开始处理更复杂的模型之前,最好掌握这些信息。否则,你将冒着构建一些非常复杂的东西的风险,这些东西可能在某些时候上非常好,但同时又完全不适合当前的问题。

不要调参,调结构

"哦,如果我只添加一个线性层,我相信模型会变得更好"

“也许再多增加0.00000001的dropout会有所帮助,看起来我们的训练集有点过拟合了。”

特别是在早期,调优超参数绝对是适得其反的。然而,这么做的诱惑力实在太大了。

它几乎不需要工作,但很有趣。你会看到电脑屏幕上的数字在变化,你会觉得自己在学习,在进步。

这是海市蜃楼。更糟糕的是,你可能会过拟合你的验证集。每次你运行模型并根据验证损失进行更改时,你都会对模型的泛化能力造成损失。

你的时间最好投资于探索架构。你会学到更多。突然间,集成成为可能。

解放你的鼠标

你打算用多长时间?即使我一不小心富裕到了不用再工作一天的地步,我仍然每天使用电脑。

如果你打网球,你要练习每一个动作。你甚至可以花钱请人告诉你如何在一个特定的镜头中定位你的手腕!

但实际上,你只能打这么多小时的网球。为什么不同样注意你如何使用电脑呢?

使用鼠标是不自然的。它是缓慢的。它需要复杂而精确的动作。你只能从任何上下文进行有限的操作。

使用键盘让你自由。说实话,我不知道为什么会有这么大的不同。但它确实。

image.png

一个不用鼠标在电脑上工作的人。

最后但并非最不重要

除非你有一个良好的验证集,否则你所做的一切都没有任何意义。请允许我向你介绍这方面的最终资源。一篇无懈可击并以实践为基础的文章。(下一篇)

—END—

英文原文:https://medium.com/hackernoon...
推荐阅读


关注图像处理,自然语言处理,机器学习等人工智能领域,请点击关注AI公园专栏
欢迎关注微信公众号
AI公园 公众号二维码.jfif
2 阅读 230
推荐阅读
0 条评论
关注数
97
文章数
58
关注图像处理,NLP,机器学习等人工智能领域
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
Arm中国学堂公众号
关注Arm中国学堂
实时获取免费 Arm 教学资源信息
Arm中国招聘公众号
关注Arm中国招聘
实时获取 Arm 中国职位信息