本月我学到的机器学习教训
本月我学到的机器学习教训
原文:
towardsdatascience.com/the-machine-learning-lessons-ive-learned-this-month/
编码、等待结果、解释结果、返回编码。此外,还有一些关于个人进度中间展示的内容。但是,事情大多相同并不意味着没有东西可以学习。恰恰相反!两到三年前,我开始养成一个习惯,每天记录我从机器学习工作中学到的教训。回顾这个月的部分课程,我发现有三个实用的教训脱颖而出:
-
对于新项目,要明智地选择库
-
使用剪贴板管理器保存你的剪辑
-
广泛阅读以深入阅读
在库和自编代码之间做出选择
机器学习项目通常以相同的问题开始:你应该自己构建一切,还是依赖现有的库?
在最根本的层面,这可能意味着在 PyTorch 或 TensorFlow 等框架之间做出选择。当 Towards Data Science 还托管在 Medium 上的时候,我强烈支持 TensorFlow。今天,我更倾向于 PyTorch。但本节并不是关于这样的框架级决策。
相反,我想专注于项目级的选择。
想象一下,你被分配了一个新的机器学习项目。要求是具体的:稀疏标记的数据、图像输入,以及一些架构限制。你应该怎么做?
一个好的起点是搜索 GitHub 上可能已经满足你大部分需求的项目。如果你找到一个完全匹配的,那太好了——使用它。如果你找不到类似的东西,那也很好——因为现在决策很明确了:你需要自己构建。
更具挑战性的情况是当你找到了一些东西,但它并不完全适合。你是修补现有的代码库直到它工作,还是从头开始实现自己的解决方案会更快?
没有唯一的正确答案,但我发现了一些有用的经验法则:
如果你需要对机器学习流程的每个方面进行精细控制→ 自己构建。
如果你只需要标准的训练流程→ 使用库。
如果你想要修改现有的方法→ 从已经拥有该方法的库开始。
如果你正在引入自己的方法→ 自己来做。
另一个值得考虑的因素是持久性。你自己写的代码是你完全控制的代码——没有突然的破坏性更改,没有隐藏在第三方仓库中的神秘错误。另一方面,库可以为你提供多年的累积测试和优化,这些是你单独难以复制的。艺术在于平衡现在的进步速度和未来的可维护性。
有时,我发现从库开始快速原型设计,然后在我知道哪些有效后自己重新实现关键部分,可以达到最佳平衡。这样,我可以在早期获得快速反馈,但仍然完全控制最重要的部分。根据我的经验,最好的库,至少对于研究密集型项目,是那些感觉像研究代码的库。
两个对比的例子是 Avalanche 和 Mammoth 库。Avalanche 功能更全面,一切都被很好地抽象化。另一方面,Mammoth 更像是一个扩展的研究项目,你仍然可以直接控制方法论部分。这样的库可以给你带来两者的最佳结合。
上述指南并不总是能解决自我 vs 库的困境,但它们确实让我更系统地处理这个问题。多年来,今年九月也是如此,它们帮我节省了几天犹豫不决的时间。
剪贴板管理器的益处
假设你正在命令行中控制一个机器学习项目。你这样启动一个运行:python3 run.py --param1 --param2
然后,另一个使用不同参数的。再一个。很快,你就要同时处理几个运行,并想比较结果。
常规的方法是将每个输出手动复制到一个中央位置:复制,粘贴;复制,粘贴;复制,粘贴。直到某个时候,你覆盖了错误的结果,不得不重新开始。
本月初,我遇到了这种情况。当我正在设置一个新项目(在决定自己动手做还是使用库;见上文)时,我还进行了一些代码测试。我想看看是否一切都能正常运行,没有任何错误。因此,我评估了几个参数设置,经常在运行之间更改一到两个参数。由于我的项目是一个机器学习项目——因此涉及训练机器学习模型——脚本运行需要一段时间,这意味着我必须等到我可以测试下一个参数。由于集群占用,启动单独的运行不是选项。
在测试两个参数设置之间,我专注于项目设置和修复错误。然后,一旦我看到一个参数已经成功测试,我就安排下一个参数测试,并继续项目设置。
如你所想,这种策略只适用于某个程度。在反复进行这种来回操作一段时间后,我失去了对已经测试过的参数组合的跟踪。因为这只是设置阶段,我还没有实施真正的测试和结果收集;这我通常稍后进行。幸运的是,我复制命令、粘贴并修改参数的习惯让我免于不得不运行测试两次。这,加上使用剪贴板管理器。
与仅存储最近的项目不同,这些工具会保存你复制过的所有内容的历史记录。在任何时候,你都可以回溯并选择所需的剪辑*。
剪贴板管理器的真正优势在于它们如何减少认知负担。你不必不断担心“我刚才是否覆盖了我的上一个副本?”或者“我刚才在哪里保存了那个片段?”,这样你就可以为实际任务腾出更多的精神带宽。这是那些看似不起眼但随时间积累的工具之一。
重要的是,这不仅仅关乎实验。当你准备演讲、起草论文或从多个来源收集图表时,情况也是如此。一旦你使用足够长时间的剪贴板管理器,你就会 wonder how you ever worked without one。
我可以证明这一点,从我自己的经验来看。在我的 Mac 机器上,我已经使用了多年的 Launchbar 剪贴板管理器(尽管它远不止这个!);在 Windows 上,我安装了免费的 Ditto 实用程序。它们经常在我剪贴了某些内容,然后删除了原始内容(我想从中剪贴内容)时帮助我。在所有时候,只需一个命令就可以访问最后的剪贴内容——为我提供了所需的信息。
阅读的深度与广度
同样的项目也让我想起了关于阅读论文的一些事情。设置它需要结合最近的方法论进展和表格数据。一如既往,有大量的可能相关的工作。问题是:我应该读什么,什么可以跳过?
这次,决定比预期的要容易。在过去的几个月里,我一直在定期阅读论文——不是密集的,而是稳步的,断断续续的。这给了我一个坚实的研究领域心理地图。更重要的是,我还阅读了相邻的工作,即不是完全来自我的领域的论文,但它们处理了非常相似的问题。
现在广泛阅读帮助我识别了跨领域之间的联系,并认识到哪些方法是真正相关的。我不会感到不知所措,我可以迅速决定哪些论文值得我的关注,哪些我可以安全地忽略。
但是,好处不仅限于效率(以及知识,阅读的主要目标)。跳出你的主要领域,往往能给你带来你原本不会遇到的想法。对我来说,来自相邻领域的洞察有时最终会塑造我自己的项目核心。换句话说,广度不仅仅是深度的基础,也是创造力的来源。
随着时间的推移,从接近领域阅读的实践会增强你的韧性。研究领域会迅速变化,今天流行的方法明天可能就会被遗忘。但如果你培养了广度,你就可以更容易地适应:你已经了解了相邻领域,你可以随着领域的发展而发展,而不是被它冲走。
- 不推荐,但在项目早期阶段通常是最快的方式。对于后期阶段,我建议集中记录结果。
**对于 Windows: Ditto;对于 Mac:Launchbar。

浙公网安备 33010602011771号