把机器学习当做一种技能
作为一名软件工程师,我们应该活到老学到老,时刻与不断发展的框架、标准和范式保持同步。同时,还要能活学活用,在工作中使用最合适的工具,以提高工作效率。随着机器学习在越来越多的应用程序中寻得了一席之地,它成为了广大工程师迫切希望掌握的一门课题。
机器学习比一个新的框架更难掌握。要成为一名高效的实践者,你需要深入理解该领域相关的理论,广泛了解这个行业的现状,以及具备以非确定性的方式构建问题的能力。
你可以在网上找到很多教程来教你如何在一个精心挑选过的数据集上训练一个现成的模型,并使之达到不错的准确性。事实上,具备更多的相关技能是成为一个高效机器学习工程师的关键。
以下是我们与50多个顶尖机器学习团队的一些对话,他们来自海湾地区和纽约,这次来到Insight公司是为了探求人工智能从业者需要共同面对的问题,并希望能够加快自己融入应用人工智能领域的步伐 。
为什么机器学习“并不仅仅是另一种工具”
部署机器学习解决方案不仅仅是用数据对任意一个模型进行训练。你还需要了解:
- 你所拥有的数据的类型、数据集在统计上如何分布,以及数据集存在怎样的偏差。
- 适用于特定数据集的统计模型,以及这些模型成功的概率。
- 模型优化的相关指标,以及模型输出的含义。
换句话说,要对模型进行集成、部署和调试,除了要具备工程上的能力之外,你还需要了解统计的基本原理、线性代数和优化理论。
要针对某个问题构建一个定制化的机器学习解决方案,需要考虑的东西涵盖了从数据的获取、标记和预处理到模型的构建、更新和服务,以及这个过程中的所有一切。
最后,我们认为,为标准Web应用程序构建一套REST API是一个可以提前完成的任务。另一方面,机器学习模型不总是能保证收敛或者产生可用的输出。学习如何审视和交付有影响力的机器学习产品的最佳方法是了解其理论基础是如何与数据分类学相关联的。
转行到应用AI之前最需要掌握的5个技能
1. 统计学
要深入理解机器学习,必须要有扎实的统计学基础知识,这涉及到几个方面:
- 度量模型是否成功的各种方法(精确度、召回率、ROC曲线下面积等)。损失函数和评估指标的选择是如何偏离模型的输出的。
- 如何理解过拟合和欠拟合,以及偏差/方差折衷。
- 你对模型的结果有什么样的信心。
2. 机器学习理论
在训练神经网络的时候,实际上发生了什么?是什么使得某些任务可行,而其他任务不可行?要弄清楚这些问题,最好的方法不是深入研究理论知识,而是试着通过图形和示例来了解机器学习。
需要理解的概念范围包括:不同的损失函数的工作原理是什么、为什么反向传播是有用的、计算图是什么。而对于如何建立一个功能模型,以及如何跟团队里的其他人员进行有效地交流,这些都需要深入地理解。下面我给出了一些参考资料:
- [谷歌的深度学习课程]对深度学习做了一般性地介绍。
- Fei-Fei Li的计算机视觉课程,以及Richard Socher的NLP课程,则提供了更为专业的介绍
- Goodfellow编写的深度学习书籍相当不错,可用于全面了解深度学习方面的基础知识。
另一个基本技能是阅读、理解和实施论文的能力。这个一开始做起来可能会感觉比较困难,所以最好的方法就是阅读附带代码的论文(例如,研究GitXiv上的论文),并试着去理解它是如何实现的。
3. 数据处理
如果你去问任何一个数据科学家他们的主要工作是什么,他们会告诉你,90%的工作是数据处理。这与应用AI同样重要,因为模型的成功与否与数据的质量(和数量)强相关。数据工作包含多个方面,但可归纳为下面几类:
- 数据采集(包括:找到好的数据源、准确度量数据的质量和分类、获取和推断标签)
- 数据预处理(缺失数据填补、特征工程、数据增强、数据规范化、交叉验证分割)
- 数据后处理(使模型的输出可用、清理工作、处理特殊情况和异常值)
熟悉数据处理工作最好的方法是获取一个数据集并试着使用它。有很多在线数据集,以及很多提供API的社交媒体和新闻媒体网站。基于上面提到的几个步骤,我们可以这样进行学习:
- 获取一个开源的数据集,并对其进行检查。它有多大(点和特征的数量)?数据如何分布?是否存在缺失值或异常值?
- 构建一个将原始数据转换为可用数据的转换流程。如何填补缺失值?如何正确处理异常值?如何规范化数据?能创造出更多的表现特征吗?
- 检查转换过的数据集。如果看起来一起正常,请继续下一章节!
4. 对模型进行调试或调优
调试机器学习算法(无法收敛,或者得到的结果不合理)与调试普通代码有着很大的区别。同时,要找出合适的架构和超参数则需要具备扎实的理论基础和完备的基础架构,以便对不同的配置进行彻底的测试。
由于目前机器学习领域发展迅猛,而调试模型的方法也在不断地发展。以下是从我们部署模型的讨论和经验中总结出来的“合理性检查”列表,这些条目也以某种方式反映了许多软件工程师熟悉的KISS原理。
从一个已经被证明可以使用类似数据集的简单模型开始,以尽快获得基线版本。经典的统计学习模型(线性回归、最近邻居等)或者简单的启发式算法或规则通常能帮你解决80%的问题,并且能更快地实现需求。刚开始的时候,要用最简单的方式来解决问题(请参阅谷歌的机器学习规则的前几点)。
如果你决定训练一个更复杂的模型以改进基线版本,那么可以用数据集的一个很小的子集来进行训练并达到过拟合。这能够确保这个模型至少还有学习的能力。不断地对模型进行迭代,直到对5%的数据量过拟合。
一旦开始用更多的数据进行训练,那么超参数就开始发挥更大的作用了。你需要理解这些参数涉及到的理论,这样才能找到合理的值。
请采用有针对性的方法对模型进行调优。简要地记录下你曾经使用的所有配置及其结果。在理想情况下,可以使用自动超参数搜索策略。最开始的时候,使用随机搜索就足够了。
你的开发能力越强,则这些步骤实现起来就越快,反之亦然。
5. 软件工程
许多的应用机器学习允许你充分发挥自己在软件工程方面的技能,虽然有时也会有一点小改变。这些技能包括:
- 测试流水线的各个方面(数据的预处理和增强、输入输出的整理、模型推理时间)。
- 基于模块化和可重用的原则来构建代码。
- 在训练过程中的不同点对模型进行备份(设置检查点)。
- 配置一个分布式的基础架构,这样能更加有效地进行训练、超参数搜索或者推演。
有关一名优秀的机器学习工程师所需掌握的软件技能,请查看我们的专题文章“从学术界转行到应用AI”。
工作中的小窍门
以上那些资源能帮你处理和解决实际的机器学习问题。但是,应用AI这个领域的变化非常快,因此,最好的学习方式是亲身实践,尝试构建一个端到端的方案来解决一个真正的问题。
行动项:
寻找一个可能会比较有趣的产品来构建。什么能使你的生活更有效率?什么工具可以改进使用数据完成某些工作的方法?什么是以数据驱动的方式来解决一个有趣的问题?
搜索与问题相关的数据集。对于大多数比较容易处理的问题来说,已经打过标记的数据也许就是你正在寻找的。如果你的问题没有对应的标记过的数据集,那么现在就来做这件事吧。你可以通过哪些方法来找到类似的数据,或者高效地标记数据,或者以其他方式来加速完成这个工作?
在动手之前,先看看你手头的数据是否在数量和质量上能满足当前任务的要求。在使用TensorFlow之前,最好先在网上找找其他人解决类似问题的方法。有哪些相关的博客帖子和论文能够加快完成工作?
寻找一些灵感,然后深入研究!虽然你探索得到的模式和范例可能后来会被证明是错误的,但这对你也有好处,因为它能让你更深入地了解问题的复杂性。
最后的建议
人工智能是一个令人兴奋、不断发展的领域。机器学习工程师对于获取相关知识的需求非常强烈,但这很容易被相关的新闻所淹没。我们建议你只跟踪少量的信息来源和新闻信札,以便能够将公关和抽象研究与该领域的创新分离。这里有一些资料也许对你有所帮助:
黑客新闻(Hacker News):黑客新闻是一个专注于计算机科学、数据科学和企业家精神的社会新闻网站。它由著名的创业孵化器Y Combinator运营。不要因为网站的名字而抛弃这个网站! “黑客”这个词的原始含义与网络罪犯无关,它指的是那些依靠自己高超的编程技能来提出完美解决方案的人。
引入AI(Import AI):Jack Clark负责的有关人工智能的新闻信札,它始终与该领域最先进最重要的发展保持同步。
Insight博客:我们保持着相当活跃的步伐。在AI博客 中的一些帖子谈论到了一些过去的项目,这些可以触发一些灵感来解决有趣的问题。我们还定期发送一些有关AI的内容到邮件列表。注册用户请访问这里。
文章原标题《Transitioning from Software Engineering to Artificial Intelligence》,作者:Emmanuel Ameisen,译者:夏天,审校:主题曲。
文章为简译,更为详细的你容,请查看原文