原文链接:
https://towardsdatascience.com/12-things-i-learned-during-my-first-year-as-a-machine-learning-engineer-2991573a9195
1. 机器学习始终与数据有关
很多时候,机器学习工程师会专注于构建更好的模型,而不是改进构建它的数据。尽管构建更大的模型并使用更强的计算能力可以提供令人兴奋的短期结果;但是只在意眼前,你最终会在长期目标上栽跟头。
首次接触一个项目时,请花费大量「不正常」的时间去熟悉数据。我这里说的「不正常」,通常是你预估时间的三倍。但从长远来看,这将节省你的时间。
这并不意味着你不应该从细节着手,因为对于任何新数据集,你首先应该明确的目标是成为这方面的「专家」。检查分布、找到不同类型的特征、异常值在哪儿、为什么它们是异常值……如果你无法讲出当前使用的数据信息,那又怎么让模型更好的处理这些数据呢?
探索性数据分析生命周期的示例,更多关于探索性数据分析的详细介绍(https://towardsdatascience.com/a-gentle-introduction-to-exploratory-data-analysis-f11d843b8184)
2. 沟通问题比技术问题困难
我遇到的大多数主要障碍都不是技术性的,而是沟通问题。当然也总是存在技术挑战,不过我认为这是工程师自身理应解决的难题。
永远不要低估内部和外部沟通的重要性,没有什么比解决「错误」的技术挑战更糟的了。这个「错误」是怎么发生的呢?
从外部来看,这并不是客户所追求的与机器学习提供的东西不匹配,而是们可以提供的东西与客户需求不匹配;而在内部,因为很多人都有多项工作内容,所以很难确保每个人都能将整个项目很好的整合起来。
外部问题如何解决?答案就是:下到基层。你的客户是否了解你可以提供的服务?你了解你的客户的问题吗?他们是否了解机器学习可以提供什么以及它不能提供什么?怎样更有效的传达你的想法?
而对于内部问题,根据尝试解决问题的软件工具数量,你就能大概判断出内部通信有多难:Asana,Jira,Trello,Slack,Basecamp,Monday,Microsoft Teams。我找到的最有效的方法之一是在一天结束时,每个人在相关项目频道中进行简单的工作内容更新。更新内容包括:3-4 个工作重点、我做了什么、为什么,以及根据以上内容我接下来要做什么。这个方法完美吗?并不,但似乎很有效。它给了我一个机会来反思我做了什么和我想从大家那里得到的建议与意见。
无论你是多么优秀的工程师,你维护产品的能力和获得新业务的能力都与你沟通技巧以及这些沟通所带给你的益处息息相关。
3. 通常来讲,稳定性优于最先进的技术
现在有一个自然语言问题:将文本分类到不同的类别,目标是让用户将一段文本发送到服务并将其自动分类为两个类别之一;如果模型对当前问题把握不准,那么将文本传递给人类进行分类;每天的负载约为 1000-3000 个请求,标准规模大小。
尽管 BERT(https://github.com/google-research/bert )这一年一直很火,但如果在这个任务中我们不用谷歌的大规模计算,而采用 BERT 训练模型来做的话,我们需要的东西需要改动很多内容,而且这还是在投入生产之前需要进行的工作。
相反,我们使用了另一种方法 ULMFiT,尽管它不是最先进的,但仍然能够产生期望的结果,并且使用起来更容易。
作者语录:「Shipping something which works provides far more value than sitting on something you』re trying to push to perfection.」
4. 机器学习中的两个鸿沟
将机器学习运用到实践中存在两个鸿沟。一个是从课程工作到项目工作的鸿沟,另一个是从笔记本中的模型到生产模型(模型部署)之间的鸿沟。
互联网搜索机器学习课程会返回大量的内容结果,我用了很多来完成自己的 AI 硕士学位(https://hackernoon.com/my-self-created-ai-masters-degree-ddc7aae92d0e  )。
但即使在学完了许多最好的课程后,当我开始担任机器学习工程师时,我的技能仍然是建立在课程的结构化主干上;但在实际工作中,项目并非按照课程那样安排得井井有条。
我缺乏一些具体的知识,而这些知识并不能从课程中得到。例如:如何质疑数据?需要探索什么数据?需要利用什么数据?
那么如何修正这个问题呢?我很幸运能够成为澳大利亚最优秀的人才,但我也愿意学习并愿意做错。错误当然不是目标;但为了正确,你必须弄清楚什么是错的。如果你正在通过一门课程学习机器学习,那么继续学习这门课程,但你需要通过在自己的项目上工作,把你正在学习的东西放到实践中,用特定的知识武装你自己。
作者语录:「Specific knowledge: skills which can』t be taught in a course but can be learned.」
至于如何进行部署,在这点上我仍然做得不够好,但我注意到了一种趋势,即机器学习工程和软件工程正在融合。通过像 Seldon,Kubeflow 和 Kubernetes 这样的服务,很快机器学习将成为堆栈的另一部分。在 Jupyter 笔记本中构建模型是一回事,但是如何让数千甚至数百万人使用该模型呢?根据最近在 Cloud Native 活动上的讨论情况来看,似乎大公司以外的人都不知道如何做到这一点。
5. 20%的时间
我们有一个规则——20%的时间。这意味着我们 20%的时间都会花在学习上。这里指的学习非常广泛,只要是机器学习相关的都属于学习范畴,并且我们身边能够找到有很多这样的知识。
事实证明,这不仅仅是宝贵的,BERT 的 ULMFiT 使用时间也是 20%。20%的时间同时意味其余 80%将用于核心项目,即80%将用于核心产品(机器学习专业领域),20%用于与核心产品相关的新事物。
它并不总是需要分得这样清楚,但这样的分配是一个很好的目标。如果你的业务优势在于现在所做的最好,那么未来的业务则取决于你继续做最擅长的事情,也就是不断学习所得。
6. 阅读十分之一的论文,并采用更少数量的论文
这是一个粗略的数字。但探索任何数据集或现象,你很快就会发现这个规律随处可见。这是 Zipf 定律(https://en.wikipedia.org/wiki/Zipf%27s_law  )或 Price 定律(https://en.wikipedia.org/wiki/Price%27s_model  )其中之一,换句话说,在每年数以千计的提交中,可能会有 10 篇开创性的论文;而在这 10 篇开创性的论文中,有 5 篇可能来自同一所研究所或个人。
你无法跟上每一个新的突破,但可以在获得基本原则的坚实基础下应用它们。这些基础经受住了时间的考验,新突破也是基于这些基本原则实现了突破。
接下来是探索与开发问题。
7. 成为你自己最大的质疑者
探索与开发问题是尝试新事物和重新应用已经发挥作用事物之间的两难选择,但是你可以通过成为自己最大的质疑者来处理探索与开发问题。
探索——通常来讲,运行已经使用的模型并获得高精度数字是一件很容易的事情,然后我们会将其作为新基准报告给团队。但是如果你得到了一个更好的结果,记得返回检查你的工作,并再次让你的团队这样做。因为你是一名工程师兼科学家,时刻需要严谨。
开发——20%的时间花费在开发上是有帮助的,但如果你是在核心产品上花费 70%,在这个产品的二次开发上再花费 20%,而在 moonshots(可能短期之间不会起作用的事情)上花费 10%,这样 70/20/10 的时间分配可能会更好。尽管我从来没有在工作中刻意这样安排,但这是我努力的方向。
8.「玩具问题」非常有效
特别是在为了帮助理解一个新概念、建立一些小事、数据集中的相关或者不相关一部分等问题上,将这些问题缩小到一个更小的「玩具问题」,是一个很有效的处理方法。
在一个小团队中,处理问题的诀窍是先让事情有效,然后再进行快速迭代。
9. 橡皮鸭
如果遇到问题,你坐下来盯着代码可能会解决问题,也有可能不会。相反,与同事探讨一下,假装他们是你的橡皮鸭,可能事情会很容易解决,比如:
「Ron,我正在尝试遍历这个数组并跟踪它的状态,同时循环访问另一个数组并跟踪状态,然后我想将这些状态组合成一个元组列表。」
「循环中的循环?你为什么不把它矢量化呢?」
「我能这样做吗?」
「让我们来看看。」
10. 从头开始构建的模型数量正在下降(或者至少你不需要开始重新构建)
这和机器学习工程与软件工程的融合有关。除非你的数据问题非常具体,否则许多主要问题非常相似,比如:分类、回归、时间序列预测、建议。
谷歌和微软的 AutoML 等服务正在为每个可以上传数据集并选择目标变量的人提供世界一流的机器学习。而在开发人员方面,你有像 fast.ai(https://github.com/fastai/fastai  )这样的库,它们可以在几行代码中提供最先进的模型,以及各种模型动画(一组预先构建的模型),如 PyTorch hub(https://pytorch.org/hub  )和 TensorFlow hub(https://www.tensorflow.org/hub  )提供相同的功能。
这意味着了解数据科学和机器学习的基本原理仍然是我们所需要做的,但是知道如何将它们应用到实际问题中则更有价值。
11. 数学还是代码?
对于我所处理的客户问题,我们都是代码优先。所有的机器学习和数据科学代码都是 Python。有时我会通过阅读论文并复现它来学习数学,但 99.9%的情况下,现有的框架都包含了数学。
这并不是说数学是不必要的,毕竟机器学习和深度学习都是应用数学的形式。掌握最小矩阵操作、一些线性代数和微积分,特别是链式法则(https://www.khanacademy.org/math/ap-calculus-ab/ab-differentiation-2-new/ab-3-1a/v/chain-rule-introduction  )足以成为一名工程开发者。
请一定要记住,我们的目标不是发明一种新的机器学习算法,而是向客户展示潜在的机器学习对他们的业务有(或没有)帮助。
12. 你去年所做的工作明年可能会无效
这是一定的,因为软件工程和机器学习工程的融合,这种情况正在变得越来越明显。
但这正是你进入这个行业的原因。框架将发生变化,图书馆将发生变化,什么会保持不变?基础统计数据、概率、数学,这些事情都没有过期日期。所以,最大的挑战仍然是:如何应用它们。

结语

作者还有更多的经验与建议分享,但如果你能够消化这 12 条,已经足够用很久了。
更多关于作者的信息,可以通过他的博客联系他(https://mrdbourke.com/  ),也可以订阅他的最新信息(https://mrdbourke.com/newsletter   )。

上次留言送书获奖老铁:饭饭

Python与算法社区
长按二维码,关注我的公众号
继续阅读
阅读原文