他山之石:我是如何成为一名机器学习从业者的(OpenAI,Greg_Brockman)
文章来自微信公众号“科文路”,欢迎关注、互动。转发须注明出处。
Greg Brockman,OpenAI 联合创始人之一,2019 年 7 月 30 日,《How I became a machine learning practitioner》
在 OpenAI 的前三年,虽然我也梦想成为一名机器学习专家,但在实现这一目标方面进展甚微。在过去的九个月里,我终于转变为一名机器学习从业者。这很困难,但并非不可能,我认为大多数优秀程序员并且知道(或愿意学习)数学的人也可以做到。尽管可以通过很多在线课程自学那些技术,但事实证明,我最大的障碍是心理障碍——重新适应初学者的生活。
早些年
OpenAI 的创立原则是我们同等重视研究和工程——我们的目标是构建能够解决以前不可能完成的任务的工作系统,因此我们两者都需要。 (事实上,我们的团队中有 25% 的人主要使用软件技能,25% 的人主要使用机器学习技能,50% 的人混合使用这两种技能)因此,从 OpenAI 的第一天起,我的软件技能就一直很受欢迎,但我却一直在拖延学习我想要的机器学习技能。
在帮助构建 OpenAI Gym 后,我被邀请去 Universe 工作。随着 Universe 逐渐走向尾声,我们决定开始开发 Dote ——在任何机器学习工作开始之前,需要有人将游戏转变为强化学习环境。
Dota
将如此复杂的游戏转变为无需访问源代码的研究环境是一项了不起的工作。每次我克服一个新障碍时,团队的兴奋都深深打动我。我想出了如何突破游戏的 Lua 沙箱,在 Go GRPC 服务器中使用 LD_PRELOAD
以编程方式控制游戏,逐步将整个游戏状态转储到 Protobuf 中,并构建一个 Python 库和抽象,以便将来兼容许多不同的多代理(agent)我们可能想要使用的配置。
但我感觉自己一叶障目了。在 Stripe,虽然我更倾向于基础设施解决方案,但我可以在堆栈中的任何位置进行更改,因为我非常了解产品代码。在 Dota 中,我只能通过软件视角来看待所有问题,这有时意味着我试图解决一些难题,而这些难题可以通过稍微不同地进行机器学习来避免。
我想像我的队友 Jakub Pachocki 和 Szymon Sidor 一样,他们取得了为我们的 Dota 机器人提供动力的核心突破。他们质疑OpenAI内部的共识,即强化算法无法扩展。他们编写了一个名为 Rapid 的分布式强化学习框架,并每两周左右以指数方式扩展它,从未遇到过任何困难。我希望能够做出关键的贡献,比如将软件和机器学习技能结合起来。
2017 年 7 月,看起来我可能有机会了。软件基础设施很稳定,于是我开始从事机器学习项目。我的目标是使用行为克隆(Behavior Cloning) 根据人类训练数据来训练神经网络。但我并没有完全准备好去做一个初学者。
我一直对工作流程的小细节感到沮丧,这让我不确定自己是否取得了进展:例如不确定给定的实验使用了哪些代码,或者意识到我需要与上周未正确存档的结果进行比较。更糟糕的是,我不断发现一些小错误,这些错误一直在破坏我的结果。
我对自己的工作没有信心,但糟糕的是,其他人对我有信心。人们会提到从人类数据中克隆行为是多么困难。我总是通过指出我是新手来纠正他们,这可能更多地说明了是我个人能力的问题。
当我的代码进入机器人(bot)时,这一切都短暂地感觉值得,因为 Jie Tang 将其用作蠕变阻止(creep blocking)的起点,然后他通过强化学习进行了微调。但很快,Jie 就想出了如何在不使用我的代码的情况下获得更好的结果,而我的努力却没有什么可展示的。
我再也没有在 Dota 项目上尝试过机器学习。
暂停
2018 年我们在国际邀请赛上输掉两场比赛后,大多数观察家认为我们的方法已经达到了顶峰。但从我们的指标来看,我们知道我们正处于成功的边缘,而且最需要更多的训练。这意味着对我时间的要求有所缓和,2018 年 11 月,我觉得我有机会用三个月的时间搏一搏(注:停下来去学习)。
当我有具体的想法要构建时,我学习效果最好。我决定尝试构建一个聊天机器人。我开始自学我们为研究员计划开发的课程,只选择与 NLP 相关的模块。例如,我编写并训练了一个 LSTM 语言模型,然后又编写了一个基于 Transformer 的模型。我还阅读了信息论等主题,并阅读了许多论文,仔细研究每一行内容,直到完全吸收为止。
虽然进展缓慢,但这次我很有把握。我没有经历心流状态(注:一种精神状态,其特征在于完全沉浸在活动中并专心致志,使相应过程令人满足且令人愉悦)。我想起了我刚开始编程时的感受,我一直在想我花了多少年才达到一种精通的感觉。老实说,我并不相信自己能够擅长于机器学习。但我一直在努力,因为……好吧,老实说,因为我不想仅限于理解项目的一部分。我想清楚地看到整个画面。
我的个人生活也是让我继续前进的一个重要因素。我开始与一个让我觉得失败也没关系的人建立关系。我们一起度过了第一个假期,我一直在机器学习上碰壁,但她一直和我在一起,不管这意味着要跳过多少计划好的活动。
有重要的象征意义的一步是克服我在 Dota 中胆怯而不敢做的一个障碍:对别人的机器学习代码进行实质性更改。我在找到的聊天数据集上对 GPT-1 进行了微调,并做了一些小更改以添加我自己的简单采样代码。但当我试图生成更长的消息时,它变得非常缓慢,我的沮丧压倒了我的恐惧,我实现了 GPU 缓存——这一改变影响了整个模型。
我不得不尝试几次后放弃了我的更改,因为它们超出了我头脑中可以容纳的复杂性。几天后,当我让它开始工作时,我意识到我学到了一些我以前认为不可能的东西:我现在了解了整个模型是如何组合在一起的,甚至是小的风格细节,例如代码库如何优雅地处理 TensorFlow 变量范围。
重整旗鼓
经过三个月的自学,我觉得自己已经准备好从事实际的项目了。这也是我第一次觉得我可以从 OpenAI 的众多专家中受益,当 Jakub 和我的联合创始人 Ilya Sutskever 同意为我提供建议时,我感到很高兴。
我们开始获得非常令人兴奋的结果,Jakub 和 Szymon 全职加入了该项目。每当我在我启动的机器学习代码库中看到他们的提交时,我都会感到自豪。
我开始感到自己有能力,尽管我还没有达到精通的程度。我发现这反映在我可以激励自己专注于机器学习工作的时间上——我现在的编码时间约为以往的 75%。
但我第一次觉得自己走上了正轨。起初,我被看似无穷无尽的新机器学习概念所淹没。在前六个月内,我意识到我可以取得进步,而无需不断学习全新的原语。我仍然需要在许多技能方面获得更多经验,例如初始化网络或设置学习率计划,但现在这项工作感觉是渐进的,而不是可能不可能的。
从我们的研究员和学者项目中,我知道具有扎实的线性代数和概率基础的软件工程师只需几个月的自学就可以成为机器学习工程师。但不知何故,我说服自己我是个例外,我学不会。但我错了——但我错了——即使身处OpenAI的中心,我也无法完成过渡,因为我不愿意再次成为初学者。
你可能也不例外。如果你想成为一名深度学习从业者,可以的。你需要给自己失败的空间和时间。如果你从足够多的失败中吸取教训,你就会成功——而且所需的时间可能比你预期的要少得多。
在某些时候,让现有的专家包围自己确实变得很重要。这是我非常幸运的地方。如果您是一名优秀的软件工程师,达到了这一点,请记住,有一种方法可以让您周围都是像我一样的人 - 应聘 OpenAI!
~~
都看到这儿了,不如关注每日推送的“科文路”、互动起来~
至少点个赞再走吧~
他山之石:我是如何成为一名机器学习从业者的(OpenAI,Greg_Brockman)