我们的Octavian暑期研究员Ashwath Salimath今天问他应该着重于巩固他的机器学习技能:
我想掌握TensorFlow中的核心ML算法,并能够将研究论文快速转换为编写良好的代码。 在接下来的3到6个月内该怎么办?
这引发了一个有趣的讨论,我希望这里的摘要对其他人有用。
为了扎实地开发(然后可能扩展到研究)机器学习算法,我建议花点时间做以下事情:

从头开始编写各种模型
为了真正了解某事物的工作原理,无所不包(这就是为什么许多计算机科学课程仍在教授组装和硬件的原因)。 从头开始编写模型将帮助您欣赏所采用的每个设计决策和库函数。 它还有助于记忆该模型的工作方式。
此外,调试模型会迫使您了解它正在(/没有)在做什么,为什么这样做,它的局限性是什么以及如何解决常见问题。
建议选择一个重要的数据问题(例如MNIST或Iris除外),以便您遇到更多与现实世界相关的挑战(例如,班级不平衡,噪音,难处理性,不同的准确性指标,数据清理和处理中)。
如果您真的想学习(并经历一些痛苦!),请选择缺少教程/公共解决方案的问题。 这些都不容易捷径,并且会提高您的能力。
为了使您变得灵活并且可以采用多种策略,我建议您熟悉所有主要的ML架构:
- 致密层/回归
- 卷积神经网络
- 递归神经网络
- 强化神经网络
- 嵌入(例如,协作过滤,搜索)
- 奖励:神经图灵机
构建模块化的,可测试的,断言/类型化的代码
机器学习库倾向于鼓励单一的,难以阅读的,难以测试的代码。 抵抗这种冲动!
通过编写更多的防弹代码,您将能够更快地编写工作模型。
您想要使代码对他人友好,可能会起作用,并且会给出易于理解的错误,而不是令人讨厌的零精度。
- 利用许多讲述故事的小功能来构建模型
- 包括尽可能多的静态和运行时检查(例如,包括张量是您认为的形状,断言掩码确实是正确格式的断言)
- 包括子模块的单元测试(例如,您的内存读取模块是否正确检索值?语言标记化是否可靠地对值进行解码?)
- 使用经过良好测试的库函数,而不是尽可能使用自己的库函数(例如,探索库的实用程序!)
尝试多种工具和平台
现在有很多很棒的工具和平台可以加快您的工作速度。 例如:
- 尝试使用TensorBoard的所有不同选项卡(在计算嵌入时,投影选项卡非常方便!尝试为其生成自己的标签字典)
- 尝试在云中进行培训(例如,使用FloydHub,Cloud ML,SageMaker)
- 尝试其他机器学习库(例如PyTorch与TensorFlow,请查看Keras的Model类)

阅读/实施研究论文中的想法
首先,养成阅读研究论文的习惯是一种很好的方法:
- 善于阅读数学和前沿计算机科学
- 聆听新想法
- 寻找项目灵感
Twitter当前是发现新论文的好地方。 以下是一些有关句柄的想法。
接下来,尝试实现论文中的内容。 即使实施整个研究系统令人生畏,也可以在工作中采用一些较小的想法。 例如,我一直在努力寻找能够成功训练嵌入模型的学习率,而PercentDelta的5行实现解决了我的问题。
建立分布式培训系统
许多现实世界中的问题/数据集太大,无法在十分钟之内在笔记本电脑上运行。 分布式系统是一个完全独立的野兽(并且可能比深度学习模型更难调试!)
尽管构建企业规模的分布式培训系统是一项巨大的努力,但更友好的规模项目很容易实现:
- 尝试将分布式队列用于训练/预测数据(例如,Kafka,Rabbit MQ,Firebase)
- 尝试使用多台计算机/实例进行培训(例如Kubernetes集群,AWS实例,您朋友的笔记本电脑)
我个人开始进行分布式培训,以帮助进行遗传算法/神经图灵机实验。
在受限设备上运行模型
通常,现实世界中的部署资源有限(例如,它必须在浏览器中运行,或者必须为用户快速计算答案)。
请尝试以下方法之一:
- 获得您训练有素的手机预测模型
- 在浏览器中获得训练有素的预测模型
- 使在手机/旧计算机上训练模型成为可能

写关于你学到的东西
写作和教学迫使您在知识上的差距上发光。 它们既是有价值的技能,又是奖励和乐趣。
您可以尝试以下几种常见格式:
- 实验报告您做了什么,结果如何
- 简短的技术质量检查(例如,如何解决常见的陷阱,解决错误)
- 教程
- 复杂概念的解释
- 新发现的介绍
练习发现有趣的问题
发现良好的研究标题/问题本身就是一项技能。 您要查找的是:
- 新颖的(尚未解决/完成)
- 对其他人有趣
- 您可能会拥有的时间,技能和资源
很难找到满足所有这些条件的东西(通常,提高技能和资源非常有帮助)。 但是,对于每个项目,您都可以反思其进展情况,然后磨练自己的技能。
最后…
玩得开心! 愉悦和激情会驱使您度过所有这一切,特别是如果您在自己的空闲时间里做的话。 查找让您兴奋的活动,问题和技术架构,并追随兔子洞!