周六那篇《我的OpenAI之路》还挺受大家欢迎的。这是Greg的另一篇博客,讲述了他是如何动手学机器学习的。千里之行始于足下,再大的大佬也是从菜鸟开始。更令人感叹的是,曾经的亲密伙伴ILYA Sutskever,如今可能成了敌人。
在OpenAI的前三年里,我梦想成为一名机器学习专家,但在实现这一目标上几乎没有取得任何进展。在过去的九个月里,我终于成功过渡到了一名机器学习从业者。这是一条艰难但非不可能的道路,我认为大多数编程能力强、了解(或愿意学习)数学的人也能做到。有许多在线课程可以自学技术层面的内容,而我最大的障碍其实是心理屏障——接受自己重新成为初学者的现实。
初期
OpenAI的一个创始原则是我们同等重视研究和工程——我们的目标是构建能解决之前不可能任务的工作系统,因此我们需要两者。(实际上,我们的团队由25%主要使用软件技能的人、25%主要使用机器学习技能的人,以及50%进行两者结合的工作。)所以从OpenAI成立的第一天起,我的软件技能就一直很有需求,我一直在拖延学习我想要的机器学习技能。
在帮助构建OpenAI Gym之后,我被召去工作于Universe。随着Universe项目的结束,我们决定开始研究Dota——我们需要有人在任何机器学习开始之前,将游戏转变为一个强化学习环境。
Dota
将如此复杂的游戏转化为一个没有源代码访问权限的研究环境是一项了不起的工作,每当我克服一个新障碍时,团队的兴奋都让我深深地感到认可。我搞清楚了如何突破游戏的Lua沙盒,LD_PRELOAD进一个Go GRPC服务器以程序化控制游戏,逐步将整个游戏状态转储到Protobuf中,并构建了一个Python库和抽象层,以便将来兼容我们可能想使用的许多不同的多智能体配置。
但我感觉自己像是半盲。在Stripe,虽然我倾向于基础设施解决方案,但由于我对产品代码了如指掌,我可以在栈的任何地方进行更改。在Dota中,我被限制在只能通过软件的视角来看所有问题,这有时意味着我试图解决一些通过稍微不同的机器学习方法就可以避免的难题。
我希望能像我的队友Jakub Pachocki和Szymon Sidor那样,他们提出了推动我们Dota机器人的核心突破。他们质疑了OpenAI内部的常识,即强化学习算法不可扩展。他们编写了一个名为Rapid的分布式强化学习框架,并且大约每两周就指数级扩展它,我们从未遇到过障碍。我希望能够像他们那样做出结合软件和机器学习技能的关键贡献。
到了2017年7月,我看起来可能有机会。软件基础设施稳定了,我开始了一个机器学习项目。我的目标是使用行为克隆从人类训练数据中教导一个神经网络。但我没有准备好会感到自己像一个初学者。
我不断被一些小的工作流细节所困扰,这些细节让我不确定自己是否在取得进展,例如不确定给定实验使用了哪些代码,或者意识到我需要比较上周的一个结果,而我没有妥善存档。更糟的是,我不断发现一些小错误,这些错误一直在破坏我的结果。
我对自己的工作不自信,但更糟糕的是,其他人却很信任我。人们会提到从人类数据中进行行为克隆有多么困难。我总是确保通过指出我是个新手来纠正他们,这可能更多地说明了我的能力,而不是问题本身。
当我的代码被用在机器人上时,一切都短暂地感觉值得了,因为Jie Tang将其作为creep blocking的起点,然后他用强化学习进行了微调。但很快Jie就找到了不使用我的代码而获得更好结果的方法,而我对自己的努力却一无所获。
我再也没有在Dota项目上尝试过机器学习。
暂停
在2018年的国际赛中我们输掉了两场比赛后,大多数观察家认为我们的方法已经达到极限。但我们从我们的指标知道,我们正处于成功的边缘,主要需要的是更多的训练。这意味着对我的时间要求有所放缓,在2018年11月,我感觉我有机会用三个月的时间冒一次险。
我学得最好的方式是有具体的东西要构建。我决定尝试构建一个聊天机器人。我开始自学我们为Fellows计划开发的课程大纲,只选择与NLP相关的模块。例如,我编写并训练了一个基于LSTM的语言模型,然后是一个基于Transformer的模型。我还阅读了信息论等主题,并阅读了许多论文,仔细研究每一行,直到我完全吸收它。
进展缓慢,但这次我有所预期。我没有体验到心流状态。这让我想起了我刚开始编程时的感觉,我不断地想到我花了多少年才达到掌握的感觉。老实说,我不确信自己是否会真正擅长机器学习。但我继续前进,因为……嗯,老实说,因为我不想只理解我的项目的一部分。我想清楚地看到整个画面。
我的个人生活也是让我继续前进的一个重要因素。我开始了一段关系,我的伴侣让我感觉即使我失败了也没关系。我们在一起的第一个假期季,我一直在机器学习的墙上敲打,但不管我错过了多少计划好的活动,她都和我在一起。
一个重要的概念性进步是克服了我在Dota时过于胆怯的障碍:对别人的机器学习代码进行实质性的更改。我在我找到的聊天数据集上微调了GPT-1,并添加了我自己简单的采样代码。但当我尝试生成更长的信息时,它变得痛苦地缓慢,我的挫败感压倒了我的恐惧,我实现了GPU缓存——这个改变触及了整个模型。
我尝试了几次,由于它们超出了我能在头脑中保持的复杂性,我放弃了我的更改。几天后,当我让它工作时,我意识到我学到了一些我以前认为不可能的东西:我现在了解整个模型是如何组合在一起的,直到像代码库如何优雅处理TensorFlow变量作用域这样的小风格细节。
重新装备
经过三个月的自学,我觉得自己准备好了从事一个实际项目。这也是我第一次感觉可以从OpenAI的许多专家中受益,当Jakub和我的联合创始人Ilya Sutskever同意指导我时,我感到很高兴。
我们开始获得非常激动人心的结果,Jakub和Szymon全职加入了项目。每当我看到他们在我开始的机器学习代码库中的提交时,我都感到自豪。
我开始感到能干,尽管我还没有达到精通。我看到这一点反映在我能够激励自己专注于进行机器学习工作的时间上——我现在的编码时间大约是我历史上的75%。
但这是第一次,我感觉自己在轨道上。起初,我被看似无穷无尽的新机器学习概念所淹没。在最初的六个月内,我意识到我可以在不断学习完全新的原语的情况下取得进展。我仍然需要获得更多经验,例如初始化网络或设置学习率计划,但现在的工作感觉是增量的,而不是潜在的不可能。
从我们的Fellows和Scholars项目中,我知道拥有线性代数和概率基础扎实的软件工程师可以通过几个月的自学成为机器学习工程师。但不知何故,我说服自己我是个例外,不能学习。但我错了——即使身处OpenAI的中心,我也无法过渡,因为我不愿意再次成为一个初学者。
你可能也不是例外。如果你想成为一个深度学习从业者,你可以。你需要给自己空间和时间去失败。如果你从足够多的失败中学习,你会成功——而且可能需要的时间比你预期的要少得多。
在某个时刻,被现有专家包围确实变得很重要。这是我非常幸运的一方面。如果你是一个伟大的软件工程师,达到了那个点,请记住有一种方法可以让你像我一样被同样的人包围——申请加入OpenAI!