本文作者Greg Brockman是OpenAI的CTO,在OpenAI工作的头三年里,他一直梦想可以成长为一名机器学习专家,但是他的机器学习技术能力一直没有长进。在最近九个月里,他终于完成了向机器学习实践者的转变。这很难,但并非不可能,在他看来,大多数优秀的程序员都会一些(或愿意学习)数学,既然如此他们就也能做到这一点。现在已经有很多在线课程可以帮助大家自学技术方面的知识,Greg认为最大的障碍是思想上的障碍——重新让自己成为一个初学者。
在 2018 年假期期间学习机器学习
早期
OpenAI 的一个基本原则是重视研究和工程——我们的目标是构建能够解决以前不可能完成的任务的工作系统(我们团队中有 25%的人主要使用软件技能,还有 25%主要使用机器学习技能,剩下 50%混合使用这两种技能)。所以从入职 OpenAI 的第一天开始,我的软件技能就一直很受欢迎,这也致使我一直拖延学习机器学习技能。
在帮助完成了OpenAI Gym项目之后,我被安排负责Universe项目。之后,我们团队又开始致力于DOTA项目——在开始机器学习之前,我们需要有人将游戏场景变成一个机器强化学习环境。
DOTA
在没有源代码的情况下将如此复杂的游戏转换成一个研究环境是一项非常有挑战性的工作,每当我有所突破的时候,团队都会感到很兴奋。我知道如何打破游戏的 Lua 沙箱,在 GRPC 服务器上以编程的方式使用LD_PRELOAD控制游戏, 增量地将整个游戏状态转储到原 buf 中, 并为我们可能想要使用的许多不同的代理配置构建一个对未来兼容的 Python 库和抽象层。
但我感到当时有点盲目了。在Stripe时,尽管我更倾向于基础设施解决方案,但我可以在堆栈的任何地方进行更改,因为我非常熟悉产品代码。在 DOTA 项目中,我不得不从软件的角度来思考所有的问题,这意味着有时我会碰到一些困难的问题,而这些问题本可以通过稍微不同的机器学习来避免。
我想像我的同事 Jakub Pachocki 和 Szymon Sidor 那样,他们创造了驱动 DOTA 机器人的核心突破。他们并不认为 OpenAI 中的增强算法不能伸缩。为此他们编写了一个分布式强化学习框架,名为 Rapid,每两周左右就以指数形式进行扩展,运行的一直很顺畅。我希望能够做出一些关键的贡献,比如把软件和机器学习技能结合起来。
左边是 Szymon,右边是 Jakub
2017 年 7 月,我似乎有了机会。软件基础设施很稳定,我开始着手一个机器学习项目。 我的目标是利用行为克隆从人类训练数据中教授神经网络。但我并没有完全准备好,我感觉自己会像一个初学者。
我一直为一些小的工作流细节感到沮丧,这些细节让我不确定自己是否取得了进展,比如不确定某个给定的实验使用了哪些代码,或者意识到我需要将上周的结果与我没有正确存档的结果进行比较。更糟糕的是,我不断地发现一些小错误,这些错误一直在破坏我的结果。
我对自己的工作开始失去信心,但奇怪的是,别人对我很有信心。人们会安慰说从人类数据中克隆行为是多么多么困难。而我总会从自己身上找问题来说明是我自己的问题,这可能是我更愿意相信是我能力问题而非项目问题。
当我的代码被使用到机器人项目中时,我觉得一切困难都是值得的,Jie Tang 将我的代码用在蠕变阻塞上,然后通过强化学习对其进行微调。但是之后他找到了不用我的代码就能得到更好结果的方法,这也意味着我的努力没有带来任何成果。
之后我就再也没有在 DOTA 项目上尝试使用过机器学习。
超时
在 2018 年的国际比赛中,我们输掉了两场比赛,大多数人都认为我们已经竭尽所能。但从我们的度量标准中,我们知道我们离成功已经非常靠近了,最需要的是用更多的数据训练学习。这意味着,我们需要降低对时间的要求。2018 年 11 月,我觉得自己有了一个机会,可以用三个月的时间来赌一把。
队员们在国际比赛中输掉了第一场比赛后情绪高涨
当我的目标确定了之后,我往往能够做的更好。我决定试着做一个聊天机器人。我开始自学我们为学员制定的课程,只选择与 NLP 相关的模块。例如,我编写并训练了一个 LSTM 语言模型,然后是一个基于转换的模型。我还研读了信息论等主题的书,阅读了许多论文,每一行都细细研读,直到完全吸收。
其实进展过程很缓慢,这也是之前就预想到的。这让我想起了我刚开始编程时的感受,我一直在想,要花多少年的时间才能获得一种掌控感。老实说,我并不相信自己会擅长机器学习。但我一直在努力,因为……说实话,因为我不想被限制在只理解我项目的一部分,我想把全貌看清楚。
我的个人生活也是让我坚持下去的一个重要因素。我和一个人开始了一段感情,他让我觉得即使失败也没关系。我和她一起在解决机器学习的问题中度过了我们的第一个假期,但无论因为学习耽误了多少计划好的活动,她都能理解并陪着我。
一个重要的关键点是克服我不敢使用 DOTA 的障碍:对其他人的机器学习代码进行实质性的修改。我对找到的聊天数据集进行了GPT-1微调,并做了一些小修改,添加了我自己的原始采样代码。但当我试图生成更长的消息时,它变得非常慢,之前的恐惧也逐渐变成了沮丧, 我实现了 GPU 缓存——这一改变影响了整个模型。
我尝试了好多次,寻求各种帮助,因为它们超出了我头脑中所能容纳的复杂性。几天后,当它可以正常工作时,我才意识到我学到了一些以前我认为不可能的东西:我现在理解了整个模型是如何组合在一起的,包括一些小的风格细节,比如代码基如何优雅地处理 TensorFlow 变量范围。
改进
经过三个月的自学,我觉得自己已经准备好做一个真正的项目了。这也是我觉得我可以从 OpenAI 的许多专家那里受益的第一点,当 Jakub 和我的联合创始人 Ilya Sutskever 同意为我提供建议时,我很高兴。
Llya 在我们公司外唱卡拉 OK
我们开始得到非常令人兴奋的结果,Jakub 和 Szymon 全职加入了这个项目。每当我看到他们在我的机器学习代码库中做出 commit 时,我都感到很自豪。
我开始觉得自己具备机器学习能力了,虽然我还没有完全掌握。但这反映在了我能激励自己专注于机器学习工作的时间上——我现在的编程时间大约是我过去工作时间的 75%。
这是第一次,我觉得我正在步入正轨。起初,我被似乎无穷无尽的机器学习新概念淹没了。在最初的六个月里,我意识到我可以在不断学习全新的基础知识的情况下取得进步。我仍然需要在许多技能上获得更多的经验,比如初始化一个网络或设置一个学习进度计划,但现在的工作感觉是渐进的,而不是潜意识中认为不可能。
从我们的研究员和学者项目中,我知道拥有扎实的线性代数和概率基础的软件工程师只需几个月的自学就能成为机器学习工程师。但不知何故,我说服自己,让自己认为是一个例外,无法学习。但是我错了——即使是在 OpenAI 这样的公司,我也不能进行角色转换,因为我不愿意再次成为一个初学者。
你可能也不是一个例外。如果你想成为一个深度学习的实践者,你一定可以。你需要给自己失败的机会。如果你从失败中学到足够多的东西,你就会成功——而且成功所花的时间可能比你想象的要少得多。
在某种程度上来说,和优秀的专家一起工作对你会很有帮助。这是我非常幸运的一个地方。如果你是一个优秀的软件工程师,请记住,有一种方法可以让你跟优秀的人一起工作——来 OpenAI工作吧!
原文链接:
How I became a machine learning practitioner
评论