# 傑里米·霍華德：fast.ai 深度學習課程與研究

> fast.ai 創始人談讓深度學習更易上手，以及課程設計、研究取向與教學理念。

- 原標題：Jeremy Howard: fast.ai Deep Learning Courses and Research
- 期數：特別節目
- 釋出日期：2019-08-27
- 嘉賓 / 主題：傑里米·霍華德與 fast.ai
- 網頁版：https://lex.qiaomu.ai/tw/ep/jeremy-howard/
- 官方頁面：https://lexfridman.com/jeremy-howard/
- 精讀字數：約 14335 字（閱讀約 32 分鐘）

> 本文為 lex.qiaomu.ai 基於原始訪談的 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，並且給每張卡配一個好笑、噁心、或者跟你在乎的人有關的故事。同時接受自己會中斷幾個月甚至幾年，回來時不要清零重來，直接開始追。
- 如果你在創業，先把成本壓到能自己活六個月，再考慮融資。看看你手上的問題是不是你自己真的幹過、真的痛過的那種，如果不是，換個題目。融資儘量晚，最好不融。
- 如果你是資料科學家，把這幾句話寫進你的專案文件：誰在迴路裡，反饋迴圈怎麼斷，受影響的人怎麼申訴，演算法約束怎麼向使用者解釋。這些不屬於產品經理。
- 別用「一萬三千張圖跑兩天」的方式驗證想法。先用小資料集、單卡、十分鐘一輪的配置把方向試對，再上大機器。多卡多機大多數時候是在浪費你的迭代速度。
