杰里米·霍华德:fast.ai 深度学习课程与研究
Jeremy Howard: fast.ai Deep Learning Courses and Research
fast.ai 创始人谈让深度学习更易上手,以及课程设计、研究取向与教学理念。
旧金山大学有一间大办公室,能塞下三十个人。Jeremy Howard 每年在那里教两门课,教课期间,任何想坐在旁边看他做研究的学生都可以来。办公室里常年坐着二三十个没事干、只学深度学习的人。
有一次,有人说,有个叫 DAWNBench 的比赛挺有意思。Jeremy 去看了眼,距离截止只剩 10 天。他本来不想参加,可转念一想,比赛要做的事情,跟他课上教的东西几乎一模一样。于是他挑了四个学生,租了 8 块 AWS 上的 GPU。
几天后,CIFAR-10 的训练时间被压到 10 分钟左右,时间和成本两个榜都排第一。同场竞技的是 Google 和 Intel。
然后他们决定试试 ImageNet。
DAWNBench 是斯坦福办的一个比赛
规则很简单:把一个模型训练到指定的准确率,谁最快,谁花钱最少。
ImageNet 的赛道要求 93% 准确率,这个门槛比当时最常用的 ResNet-50 能打到的还高一点。Jeremy 他们的目标是 12 小时以内,最后做到了 10 小时。Google 提交了一个 5 小时的成绩,用的是 TPU pod,一大堆硬件。
他们没有放弃。他们想到一个很朴素的办法:为什么非要用 224 或 256 像素的大图训练?先用 64 乘 64 的小图把模型训好,再给它几个 epoch 去适应 224 的图。相当于先告诉一个人狗长什么样,给他看模糊的低清照片,等他认得了,再给他看高清的,他不需要重新学。
再后来,他们做了多机分布式版本,18 分钟跑完了 ImageNet,登顶。
几年前,他的朋友 Pete Warden 为了训练 ImageNet,把后院一间小房子改成了机房,花了一年时间做优化,才把时间从很久压到 10 天。
这个差距里,藏着 Jeremy Howard 做 fast.ai 的全部动机。
第一个程序,是在 Commodore 64 上找音阶
Jeremy 高中时写过第一个他记得住的程序。作业是研究一个问题:有没有比标准 12 音阶更好的音阶?
他拿出一台 Commodore 64,用 BASIC 写了个搜索程序,遍历各种音阶长度,看能不能找到谐波比例更准的那种。他希望找到一个音阶,让纯五度真的精确到三比二,而不是十二平均律里那个近似值。那是他第一次让机器替他做搜索。
他这辈子都在玩音乐。萨克斯、单簧管、钢琴、吉他、鼓,什么都碰。最喜欢的还是萨克斯,尤其是低音萨克斯,就是那种搬起来很费劲的。
这条路后来断了。手指的 RSI 问题让他不得不放下一堆需要用手的事情。他说,希望哪天身体好了能重新捡起来,语气里带着点遗憾。
音乐和编程在他身上是一体两面。他喜欢那种用脑子里的创造性部分同时驱动两边的感觉。
他最喜欢的编程环境,是一个没人怀念的产品
被问到最喜欢的编程环境,他给出一个让很多人意外的答案:早期的 Microsoft Access。
它算不上好的编程语言。Visual Basic for Applications 本身就挺糟糕。可那个环境是另一个层次的东西。你可以纯图形化地建表、建关系、写查询,把它们绑到表单上,设置事件处理器和计算逻辑,一整套东西是完整连通的。做那种小而有用、不需要大规模扩展的应用,他没见过比它更好的。
所以他的技术生涯里,语言从来不是目的。数据才是。他一直感兴趣的事情是:拿到一些数据,对它做点什么,再把它放回世界里去。他对数据管理的兴趣,比对语言本身的兴趣更早。
Access 之后,他最喜欢的是 Delphi。Object Pascal 写的,出自 Anders Heilsberg 之手。这个人先做了 Turbo Pascal,后来做 .NET,再做 TypeScript。
Delphi 好在哪?一门编译型的、跑得快的语言,用起来却像 Visual Basic 一样简单。他说,现在几乎找不到类似的东西了。如果你把 C# 或 Java 的虚拟机拿掉,换成一个能编出小体积二进制的编译器,大概就是那个方向。他甚至希望 Swift 能再走一遍这条路。
他自己心里最喜欢的语言,是 J。
第三条路:数组语言
编程语言大概分两条主线。一条从 Alonzo Church 的 lambda 演算延伸下来,到 Lisp、Scheme。一条是命令式、面向对象那条,一路到 C 和 C++。
还有第三条,很少有人提,叫数组导向语言。它的起点是 Ken Iverson 的一篇论文。这篇论文不是编程论文,是数学论文,标题叫《Notation as a Tool for Thought》。
Iverson 想做的是一件很纯粹的事:设计一套比传统数学记号更灵活、更有表达力、定义更严格的记号系统。他对传统数学记号的意见很大,说它糟糕透了。这套记号后来变成了一门语言,叫 APL,全称就是 A Programming Language。五十年代末,好名字随便拿。
Ken 和他儿子后来在 APL 的全部经验之上又造了一门新语言,就是 J。Jeremy 说,那是他见过的最有表达力、组合性最强、设计最漂亮的语言。
数组导向是什么意思?简单说,你基本不写循环。整个语言像 NumPy 广播机制的极端版本,一行代码干很多事,看起来非常像数学记号。因为一行能表达的东西太多,一屏代码通常就够了,整个程序能装进脑子里,也能清楚地讲给别人听。
APL 分出两支。J 是开源的,一小群狂热爱好者在里面玩。另一支叫 K,就没那么小众了,世界上最赚钱的一批对冲基金在用。整套 K 系统小到能装进 CPU 的三级缓存。他见过的所有数据处理速度基准,它都轻松获胜。
代价是每颗 CPU 十万美金级别的许可费用。
他说,这条语言分支,几乎所有维度都比大家日常用的那些强大得多,只是没人碰。
那现实中的他为什么用 Perl 和 Python?因为务实。他关心的是生产力,想把事情做完、把问题解决掉。Perl 在九十年代末很好用,他做邮件公司 FastMail 时,整套后端都是 Perl 写的,连监控系统和 Web 框架都是自己写的,因为那时候什么现成轮子都没有。
Perl 为什么输给了 Python?他说,Perl 其实已经赢过了,它曾经无处不在。后来 Larry Wall 不怎么投入了。一个从强领导起步的项目,一旦失去这个领导者,就没法继续成功。Python 几乎所有地方都不如 Perl 优雅,可它有数据科学的一堆库,于是他也就用了。他清楚这只叫「目前最好的选择」,也清楚它不够好。
为什么 Python 正在成为研究的瓶颈
他真正想要的语言,是可以被无限 hack 的。Swift 的设计目标就是这个,Chris Lattner 就是这么描述它的。他和他的学生能从最上层到最底层,每一层都能看、能改,没有什么神秘的东西藏在下面。
Python 恰好相反。因为它太慢,慢到某个层次以下全靠 C。到那一层,调试器的工作方式变了,性能分析器的工作方式变了,构建系统的工作方式也变了。他不觉得这叫可 hack。
这个缺陷有具体的代价。比如循环神经网络和自然语言处理,真正遍历词的那个循环,必须在 CUDA C 里写。也就是说,这个最重要的算法,最核心的 kernel,他们没有能力创新。研究人员只能被动接受它长什么样。
再比如卷积神经网络,深度学习里最常见的架构。几乎可以肯定大家应该用稀疏卷积,可实际只有大约两个人在用,因为要用它就得把整个 CUDA C 层重写一遍。没人愿意干这件事。
结果就是:因为语言的问题,有些方向没人研究,有些该实现的没人实现。他说责任不在谁身上,就是还没人做到那儿,而且很难。
难在哪?现在的 GPU 编程,不管你用什么语言,都得处理一万个线程之间的同步、网格块划分、warp 这些事。样板代码太多,想要做得好,你得是这方面的专家。优化一个算法可能要花一整年。
真正可能解决这个问题的,是一个叫 MLIR 的项目,还是 Chris Lattner 在带。思路是让人写领域特定语言来表达张量计算,再由编译器去优化。这层东西底下有个叫 Halide 的项目,做法很绝:一门 DSL 表达「我要算的是什么张量」,另一门 DSL 表达「我要你怎么安排编译、怎么分块、哪些部分并行」。Halide 团队证明了,用这套办法写的代码量能压到手工优化 GPU 代码的十分之一,性能还一样。
TILE、TVM、Tensor Comprehension 这些项目都在这个方向。它们的终点,是让 Swift 能直接写这些 DSL,写出来的东西像 J 和 APL 一样紧凑,然后往上是 Swift 的层,再往上是 SwiftUI。
那最后不还是得落到 CUDA 和 NVIDIA 上?目前是。可如果 AMD 哪天把软件做明白了,或者 GraphCore 这类张量计算设备起来,MLIR 的后端可以换。市场非常需要这种竞争,因为现在 NVIDIA 的企业级卡贵得离谱,原因就是没人把软件做对。
TPU 的处境更糟。Google 明确决定让 TPU 几乎不可编程,理由是里面 IP 太多,怕人看穿。内存不能直接编程,跑在上面的代码不能直接看,一切经过虚拟机。你只能把高层模块像积木一样插在一起,繁琐、别扭,而且完全没必要。
关于课程,关于谁学得会
fast.ai 的课在 course.fast.ai,全部免费。没有任何收入来源,纯粹是对社区的贡献。课程最近拿了 COGx 的最佳 AI 课程奖。
从零到把两门课学完,时间跨度从两个月到两年不等。一个很熟练的程序员,每门课七十个小时。也有人辞职学一整年,学完觉得自己挺行了。一年里他们还会去打 Kaggle、读 Ian Goodfellow 的书,做一堆别的事。
卡住大多数人的瓶颈是写代码,编程底子好的人上手最快。另一个容易栽的坑,恰恰是统计学背景很深的人,因为他们的直觉和深度学习几乎是反的。他们习惯了减少模型参数、盯着一个个系数看。他的观察是,编程强、完全不懂统计的人,通常状态最好。
教了这么多年,他从教学里学到的东西不比学生少。看到那么多不同背景的领域专家做出成绩,让他确信了一件他本来只是愿意相信的事:任何人都能学会。
这世上有很多势利的说法,说什么只有某一类人学得会编程,只有某一类人聪明到能做 AI。他见过太多反例,不同的背景,在自己的领域里做出了世界级的结果。
真正的分水岭只有一个:韧性。放弃的人很多,不放弃的人几乎都成功了。有些人一开始他看着都替他们着急,觉得他们真的还没开窍。可最后他们还是懂了,还是做出来了。
具体建议非常朴素:训练大量的模型。把模型的输入打印出来,把输出打印出来,改一点输入,看输出怎么变。反复做实验,把直觉建立起来。
而且一定要微调,不能只跑别人的推理。只有微调,模型才算真的属于你。用你自己的数据微调,只需要五分钟。课程第二课教你怎么用脚本抓取 Google 图片搜索,从头造一个自己的数据集。他自己在课上做了一个区分泰迪熊、灰熊和棕熊的分类器,准确率基本 100%,抓图花了四分钟。Notebook 里有小控件帮你清洗数据,也有控件帮你研究错误都发生在哪里。
课程有个「晒出你的作品」的帖子,回复已经上千条。有个学生看天城文字符,第一课学完做出来的东西,比当时最好的学术论文还准。还有个女生做了特立尼达和多巴哥的蜂鸟分类,那是他们国家的国鸟。
再往远看,他的建议还是训练模型,但要在你自己的领域里训练。这个世界不需要再多一个在所有人都研究的方向上做微小改进的专家。世界需要会用深度学习诊断疟疾的专家,需要会分析语言里媒体偏见的专家,需要能分析渔业数据找出海洋问题区域的专家。
成为你真正热爱那个领域里的专家,把工具和你的领域知识结合起来,你就能比别人做得更好。
他甚至觉得,就算你想在迁移学习、主动学习这些方法本身创新,你也得先找到一个你真的在意的领域和数据集。如果你不在解决一个真实的问题,你怎么知道自己做得好不好?模型出错是因为数据有问题?你连判断的依据都没有。
他打了个比方:这就像研究自动驾驶,却从没进过一辆车、从没发动过一辆车。他顺口说,这其实描述了一大半做自动驾驶的机器人研究者,他们真的没怎么开过车。你开过车,你就知道那些路况是什么样,那些意外是什么样。没什么能替代真实世界的经验。
间隔重复,和那些被强行记住的东西
他用 Anki,很多年。这个习惯来自 Ebbinghaus 在大概一百五十年前做的一个枯燥实验:把随机字母序列写在卡片上,测自己一天后、一周后还记得多少。他画出那条遗忘曲线,也发现了一个规律,在快要忘的时候复习一次,遗忘的速率会变缓;再隔更久复习一次,变得更缓。于是有了一条约等于最优的复习时机公式。
Anki 就是把这条公式自动化。它问你记不记得,你说不记得,它就大幅提前这张卡的下一次出现时间。它的好处是,你没法骗自己。这个机制保证你要么真的学会了,要么这张卡会一直来找你,越堆越多。所以你得用点办法让大脑好过一些:助记、故事、场景。
他把这个用在中文上,也只用在中文上。原因是他做过一个清醒的决定:中文是他要一直记下去的东西,哪怕不常有机会用。他不常在中国,所以需要一套机制替他保住它。
编程语言、论文这些东西,他用的方法完全相反。他不试图记住它们,他试图从中挑出重要的概念,真正吃透,然后决定要不要吸收进自己的库、要不要改变自己做事的方式。不用的话就丢掉。这样一来,他自然会记住他在意的东西,因为那些东西他天天在用。
过去二十五年,他给自己定了一条规矩:每天至少一半时间用来学新东西或练新东西。他的同事一直不喜欢这条规矩,因为看上去他总没在干正事。可正因为练得多,他做每件事都比别人快。
学中文这件事还有个细节。他每张卡片都挂一个故事,这个故事被专门设计成好记的。人对什么记得牢?好笑的、恶心的、性感的、跟自己在乎的人有关的。他让脑子里所有故事都带上这些特征。
还得允许自己失败。他因为身体问题,卡片停了三年。也有停几个月的时候。回来的时候,一万八千张卡在等你。只有两个选择:彻底放弃,或者决定接下来两年每天做,直到追平。奇妙的是,三年过去,中文还在里面。重新学比第一次学快太多了。
他说这话的时候,我想起自己那把吉他。工作一忙就放下,一放就是一年。可只要重新每天弹,很快又能回到原来的位置。东西是存着的。
关于创业,和对风投的敌意
他做过好几家公司。被问到做成功创业公司需要什么,他的回答和做深度学习一模一样:别放弃。
钱会花完,时间会用完,总会有一样东西先见底。所以成本要压到极低,最好提前攒点钱,买下一段时间,然后坚持下去。做的要是你懂、也在意的东西。
他见过最典型的错误,是深度学习博士毕业之后,想把博士论文商业化。这是浪费时间,因为论文解决的往往不是真实存在的问题。你选那个题目,是因为它是个有意思的工程练习、数学练习或者研究练习。
正确的起点是这样的:你真的当过招聘专员,知道大部分时间花在筛简历上,知道自己在找的是某一类特征。你试着用模型做几分钟,看看它能不能做到你那个水平,如果能,你才走在创业的路上了。
还有一个建议:尽可能晚地拿风投的钱,最好是永远不拿。
他自己的前两家公司都是自筹的。FastMail 和 Optimal Decisions 是 1999 年和两个不同的朋友同时启动的。FastMail 一开始每月的服务器成本是 70 美元,空间不够了,他就在首页放了个付款按钮:想要超过 10 兆空间,一年十美元。就这样,从那时起公司一直在赚钱。
Optimal Decisions 稍微难一点,因为它卖的是单子百万美元级别的东西。他们的办法是卖「范围界定项目」,有点像原型项目,但不白做,收五万到十万美金。客户觉得自己买到了有价值的东西,他们也覆盖了成本。两家公司都在六个月时开始盈利。
他说,拿风投的钱更吓人。那些人天天在你背后喊增长、增长、增长,他们不在乎你失败,只在乎你长得不够快。而跟朋友合伙、按自己的节奏走,做出来的东西可能大到让你不用再工作,却小到任何风投都看不上。这对他们来说已经足够让人兴奋了。
他还说了一句很实在的话:拿了风投之后,很难去做他认为对公司真正重要的事,而不是去做让投资人开心的事。投资人总是嘴上说别为了取悦我们做决定,可你不取悦他们,他们就不高兴。
至于退出这件事,他觉得不能按风投的标准来优化,因为风投要的是千倍回报。如果卖掉公司能拿到一千万美元,你已经赢了。想做成一件能做一辈子的事,可以;想三年后卖掉,也可以。都是挺好的结局。
那个被拒稿的发现
他讲了一个人,叫 Leslie Smith,一个和他一样在乎把网络训得快、训得准这种实际问题的研究者。这种人他认为是所有人都该在意的,可几乎没人在意。
Leslie 发现了一件事,他管它叫 super convergence(超收敛)。某些网络在某些参数设定下,把学习率调高十倍,训练速度能快十倍。
这篇论文没发表。因为它不属于学术界的活跃研究方向,没有学者认为它重要。而且深度学习在学术界不被当成一门实验科学。
他拿物理学对比:你要是看到某个亚原子粒子做出了理论解释不了的事,你可以发表,不需要解释。接下来六十年,别人慢慢想办法解释它。深度学习界不允许这样。Leslie 不可能发表一篇论文说「我看到一件惊人的事,这个模型比它本该的速度快了十倍,我不知道为什么」。审稿人会说你解释不了就不能发。
他觉得这很荒谬。他认识的每一个其他科学领域都不是这么运作的。他也不明白为什么唯独这个领域对发表未解释的实验结果如此不感兴趣。
结果就是,他读的未发表论文比发表的多得多,因为洞见在那里。他读到那篇论文时觉得这东西太疯狂了,也太棒了,为什么没人在谈它?如果能把训练加速十倍,模型还会泛化得更好,因为 epoch 数变少了,看数据的次数变少,准确率反而更高。
后来 Leslie 搞清楚了很大一部分原理,他这边又加了些小调整。诀窍是从极低的学习率开始,非常缓慢地提升。刚开始走很小的步子,步子慢慢变大,最后大到所有人都认为不可能的程度。再加上几个小技巧,就能稳定地实现超收敛。
DAWNBench 上他们用的学习率,比所有人认为能工作的值高得多。
现在这个领域进展很快。人们越来越多地意识到,我们对优化器的理解几乎为零。权重衰减、学习率、Adam 里的 epsilon,这些东西以奇怪的方式互相作用。他这边做的另一个方向是研究模型的不同部分应该以不同速度、不同方式训练,他管这叫判别式学习率,迁移学习里尤其重要。
他的判断是,学习率这个概念在最新研究里几乎已经消失了。人类已经足够理解梯度和梯度变化,可以直接为每个参数算出最优设置。算法上的旋钮越来越少,最后可能一个都不剩。
这意味着什么?意味着专家不再被需要。人类的时间可以挪到解释、收集数据、找出模型错在哪这些事上。
他对 Google 那种用几千倍算力同时跑一堆模型、指望有一个能行的做法评价很差。他认为这很疯狂。理解了模型怎么学习,你不需要试一千个模型,可以直接跳到最好的那个。更便宜,更可及,也不需要深度学习专家来替你训练模型。
看数据这件事,他一直在做
达尔文是看着不同物种旅行的。你看数据吗?
他说,一直看。这是课程的关键部分。训练模型之前,先学会看数据。训完第一个模型,他们做的第一件事是拿一个 ImageNet 模型微调五分钟,紧接着就学怎么分析结果:看被分错的图片,看混淆矩阵,然后去 Google 上查那些被分错的东西到底是什么。
机器学习的妙处之一,是模型会告诉你什么特征最重要、哪个群体被你分错了。它让你更快成为领域专家,因为你可以把时间集中在模型告诉你重要的地方。
它还能帮你发现数据泄漏。模型说,我看的最重要的特征是客户 ID。你会想,客户 ID 不该有预测力啊。你去问管客户 ID 的人,对方说:哦对,客户申请一通过,我们就在他的 ID 末尾加个 1。
用模型去调试数据,去了解数据。这是他的原话。
框架这条路,是一路换过来的
课程最早用 Theano 和 Keras,然后换到 TensorFlow 加 Keras,再换到 PyTorch,再换到 PyTorch 加 fastai。这条路本身就反映着整个生态的演化。
Theano 和 TensorFlow 的问题是,它们要求你先定义计算图,一个静态图。你得先把模型里要做的所有事都说完,然后才说拿这份数据去做那些事。你不能调试它,不能一步一步做,不能在 Jupyter Notebook 里交互地摆弄。
PyTorch 不是第一个,可它是第一个足够强的挑战者,说我们别这么干,就用普通 Python,你会的所有 Python 东西都能用,需要跑 GPU 的时候我们来解决。这对他们的研究和教学是巨大的一步,因为它不设限。DAWNBench 这种要快速试错的事,静态图根本做不了。
问题是 PyTorch 对新手不友好,你得自己写训练循环、自己管梯度。对研究者也不够好,时间都花在样板代码上,而不是想算法。所以他们写了一个多层 API:最上层三行代码训一个 SOTA 网络,往下每一层都能钻进去,一层层接近机器层。这就是 fastai 库。有人用它赢了比赛,有人用它写了论文。
他们仍然被 Python 限制着。循环神经网络这类东西,不接受它慢到不可用,你就改不了。
所以最新一期课程和一部分研究开始用 Swift。他觉得距离真正实用还有三年,可他不着急,愿意投时间。fastai 的视觉库已经有一个 Swift 加 TensorFlow 的雏形在跑了。
他对 Python 版 TensorFlow 的评价非常不客气。他们做的事是把人们说喜欢 PyTorch 的那部分,也就是交互式计算,用语法糖模仿出来,叫 TensorFlow Eager。看起来像 PyTorch,实际跑一步慢十倍。因为他们没动底层运行时,代码库太复杂,动不了。
他说他经常翻 TensorFlow 的源码,每次都想,天啊,他们当时在想什么。他非常不看好 Python for TensorFlow 的未来。可 Swift for TensorFlow 是另一回事,它可以成为 MLIR 上面的一层,吃下 LLVM 那一整套编译器能力。
还有 tf.data,那个数据处理的方式,在他眼里是一团乱麻,效率极低。他们不得不那样写,是因为前面说的 TPU 的限制。他觉得这堆技术债,不从零开始是解决不了的。
那新学生今天该学什么?他还是推荐 fastai 加 PyTorch,因为能最快掌握概念,还能学到真正 SOTA 的技术。他也说,学哪个库其实不太重要,从 PyTorch 换到 MXNet 换到 TensorFlow,只要理解底层,就是几天的事。
Swift 会进来吗?几年内不会。Swift 没有数据科学社区,没有库,没有学校在教。Swift 社区对数值计算的理解和重视程度都很低,这些年在性能和优先级上做的决定相当糟糕。现在在变,因为 Chris Lattner 在 Google 做 Swift for TensorFlow。Apple 那边则看不出在意数值编程的迹象,底层库都不是 Swift 写的,CoreML 那些东西写得很不 Swifty。好消息是 Swift for TensorFlow 能直接调 Python 代码和库,现在 fastai 第一课的整个 notebook 已经能在 Swift 的 Python 模式里跑起来。
为什么他开始做 fast.ai
做 fast.ai 之前,他花了一整年研究:深度学习最大的机会在哪?
在 Kaggle 的经历让他知道,深度学习已经过了那个临界点,在它碰到的每一个领域都迅速变成 SOTA 方法。他自己跟神经网络打了二十多年交道,从理论上就知道,一旦过了这个点,几乎所有领域都会这样。所以他用一年时间筛选:哪些领域能在最短时间里产生最大的低垂果实。
他选了医学。可他也看到太多别的可能。
医学那边他做了 Enlitic,第一家专注医学深度学习的公司。起因是一个很硬的数字:全世界需要的医生数量,尤其在发展中国家,缺了大概十倍。按正常培养速度,填补这个缺口要三百年。
如果用深度学习分担一部分分析工作,也许就不需要那么多受过完整训练的医生。诊断,以及治疗方案的制定。
现实里的缺口具体到什么程度?非洲除去南非,整个大洲只有五名儿科放射科医生。大多数国家一个都没有。孩子病了需要看影像,就算你能拍到片子,看片子的人顶多是个护士。印度和中国几乎所有 X 光片都没有专业人士读,因为人不够。
如果有个算法能把风险最高的 5% 挑出来,做分诊,说这些需要人看,这会彻底改变发展中国家医疗的可能性。而且要注意,这些国家不是穷国,是发展中的国家,它们有钱。它们在盖医院、买设备,可在很长时间内不可能有那么多专家。
这就是深度学习能补的位置:放大他们已有的专业能力。
他明确反对把人完全替换掉这种框架。人本来就缺,为什么要想着不用人?从经济上算,让一个人效率提升十倍,去掉这个人对单位经济毫无影响。而且人在很多事情上比机器做得好。这个框架本身就没用。
分诊就是他说的那种避免去找专家的场景:99% 确定没事的,设备上直接出结果,回家。专家的时间留给那些真的值得看的片子。
那为什么医学 AI 进展这么慢?原因很多。一是新,他自己 2014 年才进场,在那之前,医学界对这里的机会有多不了解,很难形容。他去了 RSNA,全世界最大的放射学会议,逢人就说我在用深度学习做这个,来看看吧。没人知道他在说什么,也没人感兴趣。他们是从绝对零开始,这很难。
整个监管框架、教育体系,一切都在按另一种方式理解医生这个职业。现在有一小批人同时是深度学习从业者和医生,第一批正在从博士项目里出来。波士顿的 Zach Kahane 手底下已经有几个学生,既是数据科学专家、深度学习专家,又是真正的医生。不少医生学完了 fast.ai 的课,在发论文,在美国放射学会办起了期刊读书会。事情在发生,但会是个很长的过程。
监管者得学会怎么监管这个东西,得建指南。然后医院的律师得发展出一套新的理解方式:有时候,让数据以原始形态被大量看到,才能得到改变临床实践的结果。
他提到一个反直觉的点。监管本身没那么大的问题,问题出在医院律师对监管的解释上。HIPAA 的原意不是隐私,它的全称是便携性与责任性,本来是设计来让数据能被使用的。它留了很多灰色地带,本意是更实用,让人们能更周全地共享数据。
结果正好相反。律师看到灰色地带,第一反应是:不确定的事不做就不会被告,那就不做。所以 HIPAA 本身算不上问题,问题在于医院律师没有被激励去做大胆的决定。
而且这种事的好处很抽象:我们释放了十万条匿名记录,我没法指着某个具体的人说他的命因此得救。我只能说,我们得出了一篇论文,这个结论多诊断出了一千人。可哪一千个?太抽象了。反过来,一旦有人因为隐私被侵犯,那是一个能指名道姓的人。
用更少的数据,而不是更多
隐私问题他有一套很具体的答案:用更少的数据做更多的事。
大部分厂商的动机正好相反,他们被强烈激励去证明自己需要更多数据、更多算力。Google 和 IBM 是最明显的两个。两家都在强力推动一个观念:我们有更多数据、更多算力、更聪明的人,所以你得信任我们来做这些事,因为别人做不了。
Google 说得很直白,Jeff Dean 公开讲过,我们的目标是需要一千倍的算力,但更少的人。
fast.ai 这边的目标正好反过来:用你已有的人、已有的数据、已有的算力,做得更好。
他们反复发现,你往往根本不需要多少数据。你组织里现有的数据,就足够拿到 SOTA 结果。很多人在找共享数据、聚合数据的办法,可他觉得大部分时候这完全没必要。他们误以为自己需要更多数据,是因为不熟悉迁移学习的基础,而迁移学习正是那个能让数据需求量降低几个数量级的技术。
那推荐系统这类东西怎么办?Jeremy 是新客户,你以前没见过他,只能靠他自己的数据。他承认冷启动问题真实存在。很多音乐软件一开始会问你,这几个艺人你喜欢哪个、这几张专辑你喜欢哪个。Netflix 以前这么干,现在不这么干了,因为产品经理觉得这是在打扰用户。
绕开这个问题的另一种办法是去买数据,从 Axiom 这类数据商那里拿到我的营销记录,再猜。可在Jeremy 看来,帮我省下五分钟答题时间带来的社会收益,抵不上隐私被侵犯的外部性。很多以方便为名侵犯隐私的场景,本质是想多赚点钱,把负外部性转移给了不用付账的地方。真出了监管,让制造外部性的公司自己买单,他们就会说做不了了。那说明成本本来就太高。
医疗是另一回事。医院拿着我的影像、我的病理、我的病历,而这些数据属于我。他参与了一家叫 Doc.ai 的公司,那个 App 可以连到 Sutter Health、LabCorp、Walgreens,把你的医疗数据下载到手机上,再由你自己决定要不要上传、分享给谁。
自己控制谁能看。这才是他认可的路径。
大部分研究是浪费时间
被问到深度学习的理论和实践差在哪,他的回答没有任何缓冲:这个领域的大部分研究完全是浪费时间。
这是科学界的通病。科学家需要发表,就得做同行极度熟悉、能提前认出来的东西。于是所有人都在做同一件事。而他们做的那些事,没有任何机制鼓励他们去做真正有用的东西。
结果就是一大堆研究,微小的改进,被反复研究过,没有实际的重大影响。真正能改变世界的方向反而没人做,比如迁移学习。如果迁移学习做得更好,那是个世界级的转变,更多人能用更少的资源和更少的数据做出世界级的工作。可几乎没人在研究它。
另一个例子是主动学习,研究怎么从人身上榨出更多价值。这是他最喜欢的题目。可几乎没人在做,因为它不是当下的热门。
他插了一句:真正要解决问题的公司里,每个人都在重新发明主动学习。你开始标数据,标了一天才发现,这太慢也太贵了。然后你想,为什么我什么都标?机器只在两个类上出错,这两个是难的,也许我只标这两个类。接着你又想,为什么这个要人工做?为什么不让系统告诉我哪些样本最难?
道理明摆着。可它就跟着迁移学习一样,被严重低估,学术界没有任何理由关心实际结果。
他说自己这辈子只写过一篇论文。他讨厌写论文。那篇也不是他写的,是他的同事 Sebastian Ruder 写的,他只做了研究。那篇论文第一次把迁移学习成功引入 NLP,算法叫 ULMFiT。
他做这个东西
他做这个东西本来是为了课程。他想教 NLP,而他只愿意教实用的东西,在他的判断里,实用的只有迁移学习。可他找不到任何 NLP 迁移学习的例子,于是他自己做了一个。
原型花了几天。做出来就把那个领域最重要数据集上的 SOTA 打破,而他对这个领域几乎一无所知。他当时的想法是,这也太荒唐了。他跟 Sebastian 聊了这件事,对方很客气地表示愿意把结果写出来。论文最后发在 ACL,计算语言学的顶会。
他的结论是,一旦你证明某件事可行,所有人都会涌进来,后来 GPT、GPT2、BERT 接连出现,NLP 迁移学习成了主流。可对一个还在争取教职的年轻研究者来说,选那条安全的路,也就是在所有人都在做的事情上做一点微小改进,几乎是必然的选择。他很清楚,没有人在人生里靠安全选项做出过有意思的东西。
八年之后,人的位置在哪
被问到下一个重大突破是什么,他拒绝了这个问题本身。他不认为这可以预测。他指出的是另一件事:现有的工具已经足够强大,能解决一大批目前还没解决的社会性问题。他希望的只是有足够多的人学会这套工具并且去用。现在并不需要多少新的技术突破。
那通用人工智能呢?什么时候能造出人类水平的智能系统?
不知道。有多难?有多远?不知道。他补了一句:他没办法知道。他也不明白为什么人们要对这件事做预测,既没有数据,也没有依据,无从下手。眼前有那么多重要的社会问题要解决,他根本不觉得这个问题值得回答。
他真正担心的是另一件更近的事:劳动力替代。
他听过太多轻率的计量经济学论证。大意是,历史上也出现过别的技术,并没有造成大规模失业,所以 AI 也不会。他觉得这种论证站不住脚。
他看到的迹象已经出现了。工作形态的变化掏空了中产阶级。今天走出校门的学生,财务前景不如他们的父母,这在过去几百年里从未发生过,一直都是下一代比上一代更好。他看到这些焦虑变成绝望,甚至变成暴力。
这个话题在 2019 年的美国政治里有个具体的名字:Andrew Yang 拿它当竞选纲领。Jeremy 说自己极度担忧。
他也谈伦理,落点很具体:每一个用深度学习的数据科学家,手上都握着一件杠杆率极高的工具,能影响社会的很多方面。如果他在做研究,研究成果会被别人拿去用。他有责任去想后果。
想什么?人怎么留在回路里?怎么避免失控的反馈循环?被算法影响的人,怎么获得申诉的通道?算法的约束怎么向最终使用者解释清楚?
这些全是人的问题,而数据科学家恰好是唯一有资格去教育别人的人。可数据科学家往往把自己当成纯工程师,觉得这些不归自己管。他认为这是错的。
Lex 的回应是,你正好处在那个位置,可以去教他们,去读文学,读历史,从历史里学。
回到那个一万八千张卡的人
把这些年他讲过的所有东西摊开看,会发现它们其实是同一件事的不同侧面。
他挑语言,挑的是能不能从最上层一直改到最底层。他挑框架,挑的是能不能三行代码跑起来、又能一层层钻进去。他挑数据集,挑的是能不能在十分钟内跑完、又不失真地反映结论。他办课程,办的是让没有博士学位的人也能微调出世界级模型。他读书的方法,是不记细节,只吸概念,然后决定要不要把它变成自己做事的方式。
所有选择都指向同一个方向:把摩擦降到最低,把主动权留在自己手上。
他在采访里说过一句很像方法论的话,过去二十五年,他每天至少一半时间用来学新东西。同事一直不喜欢,因为看着像没在干活。可他做每件事都比别人快,因为他练得多。
这句话里没有任何技巧。有的只是把时间结构改了一改,然后坚持二十五年。
他还说过另一句,关于失败和复原的。中文卡片停了三年,回来时一万八千张在等你,只有两个选择:彻底放弃,或者接下来两年每天做。而真正让他继续的原因是,他发现三年过去,那些东西还在,重新学比第一次学快得多。
大脑是这样。手上功夫也是这样。一家小公司也是这样,1999 年每月 70 美元的服务器,攒到六个月开始盈利。一门课也是这样,七十个小时,然后你就有了一件属于自己的工具。
这些例子摆在一起,指向的结论朴素到有点扫兴:大部分事情不是靠聪明解决的,是靠不中断解决的。
他讲韧性的时候,说了句很松动的话。有些人一开始他看着都替他们着急,觉得他们真的还没开窍,可最后他们还是懂了。这句话的分量在于,他见过太多次,所以不再急着下判断。
十年后,跟他一起学中文的人一个都没剩下。他还在。
这不是励志故事,这是他解释自己所有产出的方式。
如果要从这篇文章里拿走点什么
- 今天就去 course.fast.ai,不用等到把数学补完。第一课就让你微调一个模型,五分钟出结果。你没有基础这件事,不构成障碍。
- 别跑别人的模型。找一件你自己领域里你在意的小事,用 Google 图片搜索脚本抓几百张图,清洗一遍,微调一个分类器。四分钟能做完的事,做完它你才算入门。
- 把训练好的模型的输入和输出打印出来,人工看几十条错例。比多跑十个实验有用。如果你发现模型最看重的特征是 ID 之类的字段,先去查数据是怎么生成的,别急着调参。
- 如果你在为某个问题找更多数据、更多算力,先花半天确认迁移学习能不能直接替代。很多团队以为自己需要数据共享和聚合,其实只是没用过正确的起点。
- 想清楚你的领域问题,再去学技术。世界不需要又一个在热门方向上做微小改进的人,需要的是能把深度学习用到疟疾、媒体偏见、渔业监测上的人。你已有的领域经验比你的编程水平更稀缺。
- 把每天一半时间划出来学新东西,写进日程,接受别人觉得你没在干正事。这条规矩要跑二十年才见效。
- 如果你在学语言或者背任何必须长期留住的东西,用 Anki,并且给每张卡配一个好笑、恶心、或者跟你在乎的人有关的故事。同时接受自己会中断几个月甚至几年,回来时不要清零重来,直接开始追。
- 如果你在创业,先把成本压到能自己活六个月,再考虑融资。看看你手上的问题是不是你自己真的干过、真的痛过的那种,如果不是,换个题目。融资尽量晚,最好不融。
- 如果你是数据科学家,把这几句话写进你的项目文档:谁在回路里,反馈循环怎么断,受影响的人怎么申诉,算法约束怎么向使用者解释。这些不属于产品经理。
- 别用「一万三千张图跑两天」的方式验证想法。先用小数据集、单卡、十分钟一轮的配置把方向试对,再上大机器。多卡多机大多数时候是在浪费你的迭代速度。
本集资源与出处
- 视频在 YouTube 收看
- 音频官方 MP3 直链来自 lexfridman.com 官方播客 RSS
- 官网Lex Fridman 官网本集页面