在机器学习的日常工作中,许多流程都具有共通性。这通常包括编码、等待结果、解读结果,然后重新回到编码循环。此外,可能还会穿插一些阶段性的进度汇报。然而,即便大部分工作模式保持一致,也绝不意味着没有学习和成长的空间。恰恰相反!以往养成了一个习惯,会记录下从机器学习工作中获得的经验教训。回顾最近的一些心得,有三条特别实用的经验值得分享:
- 对于新项目,明智地选择代码库
- 使用剪贴板管理器保存你的剪辑内容
- 广泛阅读以深入理解
代码库与自主开发之间的选择
机器学习项目伊始,经常会面临一个核心问题:是应该从头开始构建所有功能,还是依赖现有的代码库?
在最基础的层面,这可能意味着在PyTorch或TensorFlow等框架之间做出选择。曾经,TensorFlow是更受推崇的选项,但如今,PyTorch在许多场景下获得了更广泛的青睐。不过,本节的讨论并非聚焦于这类框架层面的决策。
相反,本节更侧重于项目层面的具体选择。
假设现在需要启动一个全新的机器学习项目。需求非常具体:稀疏标记数据、图像输入,以及某些架构上的限制。在这种情况下,应该如何行动?
一个良好的起点是在GitHub上搜索可能已经满足大部分需求的项目。如果能找到一个完美匹配的项目,那再好不过——直接使用即可。如果未能找到任何近似的项目,这同样是件好事——因为决策变得清晰:需要自主从零开始构建。
更具挑战性的情况是,虽然找到了一些相关项目,但它们并不能完全满足需求。此时,是应该修补现有代码库以使其适应,还是从头实现一个全新的解决方案会更快?
这个问题没有唯一的标准答案,但以下几条经验法则已被证明非常有用:
如果需要对机器学习管道的每个方面进行精细控制 → 建议自主开发。
如果只需要一个标准的训练管道 → 优先考虑使用现有代码库。
如果希望修改现有方法 → 从包含该方法的代码库入手。
如果正在引入自己的原创方法 → 建议自主实现。
另一个值得考虑的因素是项目的长期维护性。自主编写的代码可以完全掌控——无需担心第三方仓库突然出现破坏性更新或隐藏的难以发现的错误。另一方面,代码库则能提供数年积累的测试和优化成果,这些是单独开发难以复制的。因此,关键在于平衡当前的开发速度与未来的可维护性。
有时,可以尝试先用代码库进行快速原型验证,一旦明确了有效方案,再自行重新实现其中关键部分,这种做法能达到最佳平衡。这样既能早期获得快速反馈,又能对最重要的部分保持完全的掌控权。经验表明,对于研究密集型项目,那些“感觉”像研究代码的库往往是最佳选择。
Avalanche和Mammoth库是两个对比鲜明的例子。Avalanche功能更为齐全,抽象程度很高。而Mammoth则更像是一个扩展的研究项目,允许直接控制方法学部分。后一类的库能提供两全其美的优势。
上述指导原则并非每次都能解决自主开发与代码库选择的困境,但它们提供了一种更为系统化的方法。多年来,这些原则在多次项目中(包括最近的一次),帮助节省了大量的犹豫不决时间。
剪贴板管理器的益处
假设正在通过命令行控制一个机器学习项目。可能会像这样启动一个运行:python3 run.py --param1 --param2
接着又用不同的参数启动另一次运行,然后是第三次。很快,就需要处理多个运行结果,并希望对它们进行比较。
最直接但效率不高的方法是手动将每个输出复制粘贴到一个中心位置:复制,粘贴;复制,粘贴;复制,粘贴。直到某个时刻,可能会不小心覆盖了错误的实验结果,不得不重新开始。
类似情景曾发生在月初。当时正在搭建一个新项目(在权衡了自主开发与使用代码库之后),并进行了一些代码测试,旨在确保所有模块能无误运行。于是,评估了多个参数设置,通常每次运行只改变一到两个参数。由于这是一个机器学习项目,涉及模型训练,脚本运行需要一定时间,这意味着每次测试完一个参数后都需要等待才能测试下一个。由于集群资源限制,无法同时启动多个独立的运行。
在测试两个参数设置的间隙,会专注于项目搭建和修复bug。然后,一旦某个参数测试成功,就会安排下一次参数测试,并继续项目搭建工作。
不难想象,这种策略只能在一定程度上奏效。经过一段时间的反复切换,很容易就会忘记已经测试过的参数组合。因为这只是搭建阶段,尚未实现真正的测试和结果收集机制(这通常会留到后期进行)。幸运的是,通过复制命令、粘贴并修改参数的习惯,结合使用剪贴板管理器,避免了重复测试。剪贴板管理器是关键。
这些工具不仅仅存储最近复制的一个项目,它们会保留所有复制内容的完整历史记录。在任何时候,都可以回顾并选择所需的剪辑内容*。
剪贴板管理器的真正强大之处在于它能有效降低认知负荷。无需持续担心“我刚才是不是覆盖了上次复制的内容?”或“我把那段代码片段保存到哪里了?”,从而将宝贵的脑力资源解放出来,专注于手头的实际任务。它属于那种不起眼但随着时间推移能显著提升效率的小工具**。
更重要的是,这不仅仅局限于实验场景。在准备演讲、撰写论文或从多个来源收集图表时,剪贴板管理器同样适用。一旦长期使用剪贴板管理器,就会不禁疑惑,过去没有它时是如何工作的。
从经验来看,在Mac设备上,使用Launchbar剪贴板管理器(尽管它功能远不止于此)已有多年;在Windows上则安装了免费的Ditto工具。这些工具经常在不小心删除原始内容(原本想从中剪辑一些信息)后提供了巨大帮助。在任何时候,最近的剪辑内容都能通过一个简单的命令随时获取,轻松提供了所需信息。
阅读的深度与广度
同一个项目也提醒了关于阅读论文的一些心得。项目的搭建要求将最新的方法学进展与表格数据相结合。像往常一样,存在大量潜在相关的研究工作。问题在于:哪些值得阅读,哪些可以跳过?
这一次,决策过程比预想的要容易。在过去的几个月里,一直保持着规律的论文阅读习惯——不求密集,但贵在持续。这使得对研究领域形成了一个坚实的思维导图。更重要的是,也阅读了相邻领域的工作,即那些并非完全属于当前领域,但解决着非常相似挑战的论文。
这种广泛阅读的习惯,现在帮助识别跨领域之间的联系,并辨别哪些方法是真正相关的。不再感到不知所措,而是能够迅速判断哪些论文值得关注,哪些可以安全地忽略。
然而,这种益处超越了效率(以及阅读的首要目标——知识获取)。跳出主要研究领域,常常能获得在其他情况下无法遇到的新思路。来自相邻领域的见解,有时甚至最终能塑造自身项目的核心。换句话说,广度不仅仅是深度的准备——它也是创造力的源泉。
随着时间的推移,阅读相关领域文献的实践还能培养韧性。研究领域变化迅速,今天流行的技术明天可能就被遗忘。但如果已经培养了阅读的广度,就能更容易地适应:已经了解了相邻领域,可以随领域一同前进,而不是被其潮流所裹挟。
- 不推荐,但在项目早期阶段往往是最快的方式。对于后期阶段,建议集中记录结果。
