问题导读 1.本文提出几种方法在机器学习模型运行时保持高效? 2.为什么减少实验? 我认为这是一个非常好的问题,回答这个问题能显示组织水平和工作上的成熟度。 我曾对此问题进行过 简短的回复,但在这篇文章里,我会详述我的方法,并教你从几个角度思考这个问题,缩减消耗时间,甚至彻底避免时间的浪费。
减少实验 思考为什么要运行模型。你肯定会执行一种探索性数据分析的形式。 你努力去了解问题,以期让结果达到某种精确程度,可能是为了一篇报告需要的结果,也可能是希望模型具有可操作性。 实验可以让你更了解这个问题。当然,你也需要十分清楚该从每个实验中学到什么。 如果连一个清楚明白的问题都还没有,想想究竟是否需要进行实验。 尊重多次实验得出的结论,并尽可能将其融入你对问题的理解。这可能是日记或技术报告之类的半正式的工作结果。
提高速度 现代编程的“编译-运行-修复”模式效率很高,可当即得出结果,于是你可以持续不断测试想法,修正路线。 这个过程并非一直如此高效。工程师就惯用纸笔手工设计模块,检查逻辑。如果在编程中加入数学运算,他们也很有可能使用这一进程。 单元测试是个很有用的工具,它可以自动重复运行检查过程。而对于测试设计来说,速度尤为重要。反馈速度越快,调整路线修正错误也就越快。 下面教你如何获得想要的速度 你想要快速得到的反复验证的结果,这样你才能继续提出后续问题。但这不是说要设计效果欠佳的实验,而是要设计足够宏观或具体到只够验证一个问题的实验。 提高实验速度最简单的方法是使用数据的简化样本。这个技术简单到经常会被忽略掉。 往往你正在寻找的效果是可从数据中预测到的,无论是数据本身的性质,如异常值,还是数据模型的准确性。
调整实验 有些实验本身就很慢,如调整超参数。事实上,当追求的是最佳准确度时,调整会变成一种享受。 要彻底避免手工调整任何参数,这是一个陷阱!我的建议是使用如随机或网格搜索的搜索方法,有条不紊地调整实验。 采集结果并选取实验得出的最优参数。 如果希望获得更好的结果,设计后续实验时可在参数空间内减少超数据库,改为使用梯度(或准梯度)为基础的搜索算法。
在停机时间实验 不要在高效运算时间进行实验。如果白天工作时间完成了工作,不要直接关机,可以在这段时间集中处理一些大型任务,比方说运行模型。 在不工作时安排实验。夜里、午餐时间以及整个周末都是很好的选择。 停机时间运行实验意味着你需要提前安排。如果你能批处理实验,事情会容易得多。 花点时间来将五到十个实验分为一批,准备运行模型,最后在停机时间按顺序运行或并行运行实验。 可能还需要解耦问题和实验结果的规则。好处则是能在最快的速度获得对问题最深度的认识。 异地实验 某些实验可能会持续数天或数周,根本无法在工作站运行。 长期运行的实验可以充分利用云计算服务器(如EC2等)或本地计算服务器。无论其本地环境如何,这些计算服务器都不是实时使用的。你给出问题,得到答案。 将问题列好,有序地解决,再纳入不断增长的知识库中可以更有效地利用计算服务器。 例如,可以设置每天(或每晚)一个实验。我常常想在新项目上使用这种模式。这可以帮助维持好的势头。 当想法没那么多时,可以在问题列表中加入考虑不完备的优化实验,以调整运转良好时得到的参数。
运行实验时做计划 有时候,不得不在实时工作站上运行实验。测试进行时,工作站必须停止工作。原因可能是一些不能耽搁的实时性要求。 发生这种情况时,要记住你的项目和想法并没有停止,停下的只有工作站。 拿出文本编辑器或纸笔(纸笔是首选,这样就不用妨碍实验运行)。利用这段时间深入思考项目。制作列表,如: - 列出想要进行的实验,并确定其优先顺序
- 列出问题、预期答案,设置必需的和可能影响结果的每个实验
- 列出假设和可以破解这些假设的实验,并确定其优先顺序
- 列出想要编写单元测试的代码分区,并确定其优先顺序
- 列出问题的替代观点和框架。
勇于创新,考虑测试项目长期的信念。 我喜欢在一天结束时做创造性的工作,睡觉时让潜意识处理这些问题。我也喜欢夜间在工作站上运行实验,让它和潜意识作伴。
总结
这篇文章介绍了一些机器学习模型运行时保持高效的方法。以下是可用方法的总结: - 用实验可以帮助你理解多少问题来确定每个实验的必需性。
- 设计运行更快的实验,使用数据样本提高实验速度。
- 不要手动调整超参数,设计自动化实验来回答模型校准问题。
- 停机时间进行实验,如夜里、午休时间和周末。
- 批处理实验,这样就可以按照队列安排执行。
- 授权工作站以外的计算服务器运行实验,以提高效率。
- 如果必须运行封闭实时实验,利用这段时间来深入思考问题、设计未来实验以及挑战基础假设。
|