2018 年 3 月 30 日,Google 在加州山景城舉行了第二屆 TensorFlow 開發者高峰會(TensorFlow Dev Summit),並正式宣佈發佈 TensorFlow 1.8。
作為首批機器學習領域的Google 開發者專家,我有幸獲得Google 的資助,親臨高峰會現場,見證了這一具有里程碑意義的新版本發佈。許多新功能的加入和支援展示了 TensorFlow 的雄心壯志,已經醞釀許久的即時執行模式(Eager Execution,或稱「動態圖模式」)在這一版本中終於正式獲得支援。
在此之前,TensorFlow 基於傳統的圖執行模式與階段機制(Graph Execution and Session,或稱「靜態圖模式」)的弊端已被開發者詬病許久,如入門門檻高、偵錯困難、靈活性差、無法使用 Python 原生控制敘述等。一些新的、基於即時執行模式的深度學習架構(如 PyTorch)從天而降,並以其便利性和快速開發的特性而佔據了一席之地。尤其是在學術研究等需要快速疊代模型的領域,PyTorch 等新興深度學習架構已成為主流。我所在的近二十人的機器學習實驗室中,竟只有我一人「守舊」地使用 TensorFlow。與此同時,市面上 TensorFlow 相關的中文技術書以及資料仍然基於傳統的圖執行模式與階段機制,這讓不少初學者,尤其是剛學過機器學習課程的大學生望而卻步。
因此,在 TensorFlow 正式支援即時執行模式之際,我認為有必要出現一本全新的入門書,幫助初學者及需要快速疊代模型的研究者,以「即時執行」的角度快速入門 TensorFlow。這也是我撰寫本書的初衷。本書自 2018 年春天開始撰寫,並於 2018 年 8 月在 GitHub 發佈了第一個中英文雙語版本,很快獲得了國內外不少開發者的關注。尤其是 TensorFlow工程總監 Rajat Monga、GoogleAI 負責人 Jeff Dean 以及 TensorFlow 官方社交媒體,他們對本書給予了推薦與關注,這給了我很大的鼓舞。
同時,我作為Google 開發者專家,多次受Google 開發者社區(Google Developers Group,GDG)的邀請,在 GDG DevFest、TensorFlow Day 和Women Techmakers 等活動中使用本書進行線下的 TensorFlow Codelab 教學。教學活動獲得了較好的反響,也收到了不少回饋和建議,這些都促進了本書的更新和品質改進。
2019 年 3 月的第三屆 TensorFlow 開發者高峰會,我再次受邀來到Google
的矽谷總部,見證了 TensorFlow 2.0 alpha 的發佈。此時的 TensorFlow 已經形成了一個擁有龐大版圖的生態系統。TensorFlow Lite、TensorFlow.js、TensorFlow for Swift、TPU 等各種元件日益成熟。同時,TensorFlow2 加入了提升便利性的諸多新特性,例如以 tf.keras 為核心的統一高層API、使用 tf.function 建置圖模型、預設使用即時執行模式等,這使得對本書的大幅擴充和更新提上日程。Google 開發者社區中兩位 JavaScript和 Android 領域的資深專家李卓桓和朱金鵬也參與了本書的撰寫,這使得本書增加了諸多針對業界的 TensorFlow 模組詳解與實例。同時,我在Google 開發者大使(Developer Advocate)Paige Bailey 的邀請下申請並成功加入了 Google Summer of Code 2019 活動。作為全世界 20 位由Google TensorFlow 專案資助的學生開發者之一,我在 2019 年的暑期基於 TensorFlow 2.0 Beta 版本,對本書進行了大幅擴充和可讀性上的改進,使得本書從 2018 年發佈的小型入門指南逐漸成長為一本內容全面的TensorFlow 技術手冊和開發指導。
2019 年 10 月 1 日,TensorFlow 2.0 正式版發佈。本書也開始在TensorFlow 官方微信公眾號(TensorFlow_official)上長篇連載。在連載過程中,我收到了大量的讀者提問和意見回饋。在為讀者答疑的同時,我也修訂了書中的較多細節。2020 年 3 月,第四屆 TensorFlow 開發者高峰會在線上直播舉行。我根據高峰會的內容為本書增添了部分內容,特別是介紹了 TensorFlow Quantum 這一混合量子 – 經典機器學習函數庫的基本使用方式。我在研究所學生期間旁聽過量子力學,還做過量子計算和機器學習結合的專題報告。TensorFlow Quantum 的推出著實讓我感到興奮,讓我迫不及待地要把它介紹給讀者們。2020 年 4 月,我接受TensorFlow User Group(TFUG)和Google 開發者社區的邀請,依靠本書在 TensorFlow 官方微信公眾號上開展了「機器學習 Study Jam」線上教學活動,並啟用了 tf.wiki 中文社區進行教學互動答疑。同樣,此次教學也有不少學習者為本書提供了重要的改進意見。
由於我的研究方向是強化學習,所以在本書的附錄 A 中對強化學習進行了專題介紹。和絕大多數強化學習教學一開始就介紹馬可夫決策過程和各種概念不同,我從純動態規劃出發,結合實際算例來介紹強化學習,試圖讓強化學習和動態規劃的關係更清晰,以及對程式設計師更人性化。這個角度相比較較特立獨行,如果你發現了謬誤之處,也請多加指正。
其實在 2018 年秋天, 我就已經開始籌畫本書的出版事宜, 由於TensorFlow 版本疊代速度快,所以這個過程中多次對書中的內容進行了修訂與增加,導致本書的出版時間一再延後。在此書最後付梓時,TensorFlow 2.1 正式版已經發佈,其中修正了 TensorFlow 2 在使用中的諸多問題,使得 TensorFlow 2 的可用性和成熟度大為加強,適合進行大規模推廣普及。經過多次修訂後,書中的大部分內容也趨於穩定。因此,我認為現在(2020 年夏天)是出版本書的成熟時機。儘管如此,本書依然可能存在諸多缺陷、錯誤和過時之處,歡迎在 tf.wiki 中文社區或圖靈社區進行回饋。
本書的主要特點如下。
■ 主要基於 TensorFlow 2 最新的即時執行模式,以便模型的快速疊代開發,同時使用 tf.function 實現圖執行模式。
■ 定位為技術參考書,並以 TensorFlow 2 的各項概念和功能為核心進行編排,力求讓 TensorFlow 開發者快速查閱。各章相對獨立,不一定需要按順序閱讀。
■ 書中的程式均經過仔細推敲,儘量做到簡潔高效、表意清晰。模型實現均統一透過繼承 tf.keras.Model 和 tf.keras.layers.Layer 的方式,保障程式的高度可重複使用性。每個完整專案的程式總行數均不超過100,讀者可以快速了解並舉一反三。
■ 注重詳略,少即是多。不追求鉅細靡遺和面面俱到,不在正文中進行大篇幅的細節論述。
本書適合以下讀者閱讀:
■ 已有一定機器學習或深度學習基礎,希望將所學理論知識使用TensorFlow 進行實作方式的學生和研究者;
■ 曾使用或正在使用 TensorFlow 1.x 或其他深度學習架構(例如PyTorch),希望了解和學習 TensorFlow 2 新特性的開發者;
■ 希望將已有的 TensorFlow 模型應用於業界的開發者或工程師。
☘ 如何使用本書
建議已有一定機器學習或深度學習基礎,希望使用 TensorFlow 2 進行模型建立與訓練的學生和研究者,順序閱讀本書的基礎篇。為了幫助部分新入門機器學習的讀者了解內容,本書在基礎篇中提供了一些與行文內容相關的機器學習知識。這些內容旨在幫助讀者將機器學習理論知識與實際的 TensorFlow 程式碼進行結合,深入了解 TensorFlow 程式的內在機制,讓讀者在呼叫 TensorFlow 的 API 時能夠知其所以然。然而,這些內容對於沒有機器學習基礎的讀者而言是完全不夠的。若讀者發現閱讀這些內容有很強的陌生感,那麼應該先學習一些機器學習相關的基礎概念。部分章節的開頭提供了「前置知識」,方便讀者查漏補缺。
希望將 TensorFlow 模型部署到實際環境中的開發者和工程師,可以重點閱讀本書的部署篇,尤其是需要結合範例程式親手操作。不過,依然非常建議學習一些機器學習的基礎並閱讀本書的基礎篇,這樣有助更深入地了解 TensorFlow 2。
對於已有 TensorFlow 1.x 使用經驗的開發者,可以從本書的進階篇開始閱讀,尤其是第 15 章和第 16 章,隨後快速瀏覽基礎篇了解即時執行模式下 TensorFlow 的使用方式。在整本書中,帶 * 的部分均為選讀。
本書範例程式可至本公司官網下載, 網址為「https://deepmind.com.tw/, 選擇對應的書號下載。在使用時, 建議將程式的根目錄加入PYTHONPATH 環境變數,或使用合適的 IDE(如 PyCharm)開啟程式根目錄,這樣程式間可以順利地相互呼叫(形如 import zh.XXX 的程式)。