这两天,DeepMind 研究工程师小哥 Aleksa Gordić的个人经验贴在 Twitter 上火了一把。不到半天时间,点赞达 431。重点是,这位小哥啥机器学习(ML)学科背景都没有,但在接触 ML 仅 3 年后,顺利入职 DeepMind。
他强调自己不是一个有“计算天赋”的人,全靠对机器学习的热情,在不耽误正职的前提下,疯狂摄入 ML 知识,同时保持对知识的自我消化和向外输出,最终成功上岸。
他在评论中表示,这篇博文对许多 DeepMinder 找工作都很有帮助。让我们一起来看看这位非科班 AI 小哥,具体做了哪些努力和准备。
非科班出身
本科阶段,小哥学习的是电子工程专业,和计算机科学方面的课程交集不大。2016 年底,本科快毕业时,他惊觉自己想转到软件行业。和硬件行业相比,他认为软件行业更加开放,有各种黑客马拉松和数据马拉松,还拥有更为可观的薪资待遇。
说干就干。次年初,小哥开始自学 Android,并于暑期在 Telocate (一家德国小型创业公司)实习,担任 Android 开发。也在这时候,小哥和曾在 MSFT、Facebook、Jane Street 等公司实习过的软件工程师朋友聊天。
对他的一些朋友们来说,算法和结构数据已经是第二天性般的存在;而对小哥来说,大型科技公司并不太在意他在 EE 方面的技能和知识积累,算法和数据结构才是硬通货。
一番交流下来,小哥意识到自己和“软件工程师”之间的鸿沟。对于时年 23 岁的他来说,一个 16 岁且缺乏大量基础工程知识的孩子都遥遥领先。
△ 小哥幽默地告诉朋友自己落后了(实际那时候他非常绝望),朋友鼓励他慢慢来
这种糟心的滋味,促使小哥下定决心飞速追赶。实习结束,本科毕业后的他虽然申请了电子工程硕士学位,但依然对大型科技公司的工作机会心向往之。
为此,小哥动手制定了一份软件工程学习计划,还旁听了本科算法课程。小哥一边开启他的疯狂学习之旅,一边申请大型科技公司岗位。
过程并非一帆风顺,经历 2017 年年底的 Facebook 面试、2018 年 3 月和 5 月的两次微软面试,小哥都未能成功入职。好在 2018 年 2 月时小哥通过为期 3 天的入学考试,顺利申上微软 ML 暑期培训班。
△ 微软 ML 暑期培训班的录取通知
微软 ML 培训班里,他所在组最终项目被评为内部最佳项目。8 月上旬,小哥远赴巴西实习。三天后,小哥接到了意想不到的电话,微软告诉他,他被举办暑期培训班的团队“HoloLens 团队”录用了!
没有犹豫,小哥接下了 offer,离开巴西,在 9 月顺利入职微软,担任软件工程师。至此,小哥开始了自己的 SE 以及 ML 职业生涯。
不得不提的是,自从参加了暑期培训班,“要去 DeepMind”这个挑战就在小哥潜意识里扎了根。入职 DeepMind 对当时的他来说仿佛天方夜谭:他在培训班接触的 DeepMinder 都毕业于牛津和剑桥。
但转念一想,对于曾经的他来说,微软同样遥不可及,挑战 DeepMind 又何尝不可呢?2018 年至 2019 年在职微软期间,小哥尽力学习 SE,阅读很多 Scott Meyers 撰写的 C++ 等编程书籍;工作之余,则学习 ML。
2018 年年底之前,小哥学完了 Coursera 上吴恩达的所有课程,还参加了内部的 ML 黑客马拉松、ML 培训班,并开始阅读相关研究论文。
随着学习进程的加深,小哥对 ML 领域越来越得心应手。2019 年初,小哥第一次分享了关于 ML 的博文。
2019 年底,小哥调岗到机器学习工程师,被派参加 ICCV2019 大会。
△ ICCV2019 大会上,小哥在微软展台演示 HoloLens 2
机器学习课程
从 ICCV2019 回来,小哥被要求利用 PyTorch 从零开始实现一篇论文。那时候,他对 PyTorch 一无所知。好在通过完成这个任务,小哥再一次飞速成长。
其它方面的学习进程,小哥制定了一个学习框架。经过大致规划,一个“一年内学习 AI 各个子领域”+“每 3 个月学习一个子领域”的计划诞生了。
万事开头难。所学习的第一个 AI 子领域,神经风格迁移(NST),耗费时间超过了 3 个月。借此,小哥对学习计划进行了优化,即在每 3 个月学习一个子领域的学习周期大框架下,穿插微学习周期。
微学习周期有两种类型:
1、输入模式:大量摄入信息。这一模式的目标是通过博客、视频等对子领域的结构有一个深度理解,或是通过研究论文、书籍对某个主题深入了解。
2、输出模式:分享所学知识。制作 YouTube 视频、建立 GitHub 项目或撰写博文、更新 Linkedln、分享相关内容到 Twitter 和 Discord。
主业当然不能落下。在如何平衡工作和学习这个问题上,小哥展现了自己的强大意志力。
他一直保持着一种近乎“疯狂”的节奏:起床后,写 2 小时代码,然后散会儿步;散步归来,投入微软工作;工作结束,小憩 30 分钟;睡前再工作 2-3 小时。
小哥把这部分的经验总结为 3 点,分别是强大的毅力,正确的心态,以及小憩是金。
授人以渔,小哥详细介绍了他学习 NST、GAN 等 ML 详细知识的方法论。
keep learning
阅读书籍和前沿论文是最直接获取 ML 相关知识的途径。
学习神经风格迁移(NST)、DeepDream、生成式对抗网络(GAN)、NLP & Transformers、强化学习(RL)等知识的过程中,小哥都阅读了大量的前沿和小众论文,其中,Transformers 相关论文为小哥用 PyTorch 做出一个流行的 GAT 提供了部分灵感。
△Graph ML
因对初学者友好,这一 GAT 大受欢迎,并成为剑桥大学 GNN 讲座的推荐内容。
除了沿着学习“主线”前进,早在 2020 年初,小哥就意识到自己在数学方面有所欠缺。因此,他花时间阅读了《Learning How to Learn》《Python Data Science Handbook》《Deep Learning》等,来加速他的学习进度。
与此同时,对相关知识进行学习和巩固是非常有必要的。补充 CNN 及其优化知识,实现 vanilla GAN、cGAN(条件 GAN)和 DCGAN 模型…… 旧知识的查漏补缺和新知识的不断加瓦,不断夯实小哥的知识库。这是他学习 GAN 后,所训练的 DCGAN 模型输出的图片:
△ 由男人演变为女人(角度和肤色也会改变)
在这个过程中,根据知识要点的难易程度,结合实际情况,小哥还会改进和完善学习策划。比如调整学习时长。因为倍感有趣,小哥花费在 NST 领域的学习时间,就比原定计划的 3 个月要长。
或者进行提炼总结。而在学习 GAN 时,他开始在每篇学习大框架下的末尾写一篇博文,来总结所学到的知识。
抑或选择先熟悉、后陌生的学习流程。RL 是 DeepMind 取得突破性发展的领域,它不仅与其它 ML 子领域有所不同,其间亟待了解的论文和项目更是不可计数,如如 AlphaGo、DQN、OpenAI 机械手等。
面对这个难题,小哥从自己最感兴趣的部分 —— 计算机视觉(CV)—— 切入,而后再朝不那么熟悉的课题进发。
在做这些的时候,小哥没有闭门造车,而是与 Graph ML 领域最优秀的研究人员之一、DeepMind 研究员 Petar Veličković等人定期聊天,或是博文读者等进行交流,受益匪浅。
消化后的向外输出
小哥提到,他在微软 300 多名同事面前做了一次演讲,这对他来说是一次跳出舒适圈的操作。
△ 在 300 + 微软同事面前演讲
跳出舒适圈的尝试还有很多。保持知识输入之后,他也在消化知识,并向外输出。他开启了自己的 YouTube 频道,做了 NST、GNN 等多个系列的视频,与网友分享他的 ML 学习之旅,在帮助自己深入思考的同时,也帮助别人。
看这张图,它是使用小哥编写的代码合成的 NST 图像,你可以使用他的的 GitHub 项目创建它。
关于 BERT 和 GPT 系列模型的知识也在小哥的学习范围内,Transformer 可以帮助了解它们。他从零开始阅读 NLP & transformers 相关论文。因为会英语和德语,他又创建了一个英德机翻系统。小哥主要用 OneNote 记录着学习旅程。
△ 摘自小哥的 OneNote
工作和学习双线推进,微软这边,小哥从事着各种 SE 和 ML 项目,如开发了 HoloLens 2 上眼动追踪子系统的一个眼镜检测算法,使用视频编码为各种 VR / MR 设备添加注视点渲染功能等。
DeepMind 向他敞开大门
2021 年 4 月,经由 Petar 的介绍,小哥结识了一位猎头。在浏览了小哥的 YouTube 视频、GitHub 代码库和 LinkedIn 后,小哥获得猎头推荐,顺利接到了 DeepMind 的面试通知。
写到这里,小哥强调了人际关系对于找工作重要性,应该和志同道合的人建立高质量的联系。
△ 小哥申请 DeepMind 的简历,但他在博文中对这份简历提出了优化建议
DeepMind 共有两个团队:
1、核心研发团队。偏向于纯粹的研究,项目例子是 AlphaFold、AlphaGo 等。在这个团队中,研究工程师从事的其它项目可能涉及与研究科学家合作实现某些研究思路。
2、应用团队。所做的一些项目包括数据中心节能项目、改进 Google 应用商店的推荐系统、WaveNet、Android 节能。
小哥申请的岗位是研究工程师。能入职 DeepMind 意味着这个人要有扎实过硬的相关知识储备。
因为没有发表过任何论文,如果没有之前的项目和工作经验,小哥不见得能有这次 DeepMind 的面试机会。他告诉大家,再优秀的人也有可能被科技巨头公司拒绝,所以不用给自己太大压力。
小哥分享了一些自己准备的面试技巧。
1、认真研究每一位面试官。了解他们的职业背景,有可能的话看看他们的论文(至少阅读被援引次数最多的那一篇),这样有利于提出相关问题。
2、了解透简历中提及的每一个项目。以便于你能和面试官深入探讨他们。
3、模拟面试。
围绕 DeepMind 的调性,小哥还认真研究了一番 AGI,阅读了相关前沿论文。
面 DeepMind 研究工程师这个岗,一共有首次沟通、访谈、测验、编程考核、领导面等步骤。准备这些建议早做打算,因为小哥没来得及抱完佛脚,面试日就到来了。
第六面中,小哥被遗憾 pass 了。好在技术过硬,他又被安排参加了一次孵化 / 应用部门的面试。又一次充足准备后,offer 到手。
值得欣慰的是,后来的这次面试让小哥意识到,孵化团队的工作更适合他。
在 7 月 30 日的 Twitter 评论区中,小哥将整个分享博文做了精简的概括,帮助读者快速抓取有效信息点。
当然,原始博文中,小哥还还附加了很多他积累的 ML 相关课程链接,以及当前 ML(如 GNN)的最新研究进展,感兴趣的话,不妨进原文深度阅读一下。
参考链接:
[1]https://twitter.com/gordic_aleksa/status/1553644361224683520
[2]https://gordicaleksa.medium.com/how-i-got-a-job-at-deepmind-as-a-research-engineer-without-a-machine-learning-degree-1a45f2a781de