Google Brain開源新的Python 庫:Tangent

作者 | Alex Wiltschko

譯者 | 核子可樂

編輯 | Vincent

AI前線出品| ID:ai-front

AI 前線導語:「Google Brain 今日開源了一款 Python 庫,名為 Tangent,專門用於實現自動微分功能」。

相較於現有機器學習資源訓,Tangent 屬於一套源到源系統,其使用 Python f 函數並生成另一新 Python 函數以計算 f 梯度。通過這種方式,用戶能夠更好地理解梯度計算流程,並輕鬆完成用戶級梯度編輯與調試任務。Tangent 亦擁有以下機器學習模型調試與設計能力:

  • 輕鬆調試您的反向傳播 快速梯度調整
  • 正向模式自動差異化
  • 高效 Hessian 矢量產品
  • 代碼優化

在今天的文章中,我們將對 Tangent API 作出概述。文章內容涵蓋如何在 Python 中利用 Tangent 生成易於解釋、調試以及修改的梯度代碼。

神經網路(簡稱 NN)已經在圖像、視頻、音頻以及文本類機器學習模型領域取得了巨大成功。而讓我們得以訓練出能夠在此類任務中帶來良好表現的神經網路的基本抽象思路,則源自 30 年前即已誕生的概念,即反向模式自動微分(亦被稱為反向傳播)——其中包括兩次神經網路通過流程。首先,我們運行「正向傳播」以計算每個節點的輸出值。之後,我們運行「反向傳播」以計算一系列層數,從而確定如何更新權重以提高模型的準確性。

要對神經網路進行訓練並面向新型架構加以研究,要求我們以正確、高效且便捷的方式實現導數計算任務。如果我們的模型訓練效果不佳,或者嘗試構建自己尚不了解的新鮮事物,則必然需要有能力對其作出調試。所謂自動微分,或者簡稱「autodiff」,是指一項用於計算計算機程序內負責表示某些數學函數的導數的技術手段。目前,幾乎全部機器學習庫都在使用自動微分技術。

現有各類資源庫在實現自動微分方面,主要採用追蹤程序執行(立足於 TF Eager、PyTorch 以及 Autograd 等運行時內),或者構建動態數據流圖形而後對圖形加以微分(進行提前微分,TensorFlow 即採取此種方法)的方式。相比之下,Tangent 則可直接對 Python 源代碼進行提前自動微分,並以輸出結果的方式生成 Python 源代碼。

如此一來,大家將能夠像讀取其它程序一樣,直接讀取自動導數代碼。Tangent 不僅適用於希望利用 Python 編寫模型的研究人員與學生,同時亦能夠在不犧牲靈活性與速度表現的前提下讀取並調試自動生成的導數代碼。大家可以輕鬆檢查並調試您利用 Tangent 編寫的模型,且無需使用任何特殊工具或者間接性方式。Tangent 能夠對接 Python 生態系統內龐大且不斷增加的各類功能子集,提供其它 Python 機器學習庫所不具備的額外 autodiff 特性,性能出色且可與 TensorFlow 及 NumPy 相兼容。

Python 代碼自動微分

那麼我們要如何為普通 Python 代碼生成導數?以 tf.exp 或 tf.log 為代表的各類數學函數中皆包含導數,我們可以通過編寫此類函數建立反向傳播。同樣的,語法片段(例如子常式、條件與循環等)也可擁有對應的反向傳播版本。Tangent 中包含為每項 Python 語法生成導數代碼的對應方法,同時亦囊括大量面向 NumPy 與 TensorFlow 函數的調用選項。Tangent 擁有一個單函數 API:

以下流程圖展示了在 Python 函數中調用 tangent.grad 時會發生怎樣的情況:

如果您打算輸出自己的導數,則可運行:

從底層角度來看,tangent.grad 會首先提取您傳遞給它的 Python 函數源代碼。Tangent 擁有大量 Python 語法導數配方庫,同時亦支持 TensorFlow Eager 函數。函數 tangent.grad 隨後會以反向順序遍歷您的代碼,查找匹配的反向傳播配方,並將其浯對導數函數末尾。這種逆序處理方式擁有自己的特定名稱:反向模式自動微分。

以上 df 函數僅適用於標量(非數組)輸入內容。Tangent 亦支持:

  • 利用 TensorFlow Eager 函數 ,以處理數字數組
  • 子常式
  • 控制流

雖然我們選擇 TensorFlow Eager 支持作為起點,但 Tangent 絕不僅限於一種或者多種特定庫——我們樂於將更多 PyTorch 或者 MXNet 導數配方添加到 Tangent 庫當中。

未來展望

Tangent 目前在 github.com/google/tange 上以開源形式公開,感興趣的朋友可以前往下載並進行安裝。Tangent 目前仍處於實驗性階段,因此在實際使用中可能存在一些錯誤。希望大家能夠在 GitHub 上向我們報告您發現的問題,我們將盡最大努力加以解決。

我們努力在 Tangent 當中為 Python 語言的更多要素(例如閉包、內聯函數定義、類以及更多 NumPy 與 TensorFlow 函數)添加支持。我們也希望在未來逐步實現更為先進的自動微分與編譯器功能,例如內存與計算間的自動權衡、自動性更高的優化以及 lambda 提升。

我們有意攜手技術社區共同推進 Tangent 的發展。我們歡迎您提交修復與功能性質的 pull 請求。感謝您的參與!

致謝

Bart van Merri?nboer 在實習期間為 Tangent 項目的各個方面作出了卓越貢獻,Dan Moldovan 領導了 TF Eager 集成、基礎設施與基準測試等工作。此外,感謝谷歌 Brain 團隊對本文編撰工作的支持,同時特別感謝 Sanders Kleinfeld、Matt Johnson 以及 Aleks Haecky 在技術層面對本文提供的寶貴貢獻。

查看英文原文

research.googleblog.com


-全文完-

關注人工智慧的落地實踐,與企業一起探尋 AI 的邊界,AICon 全球人工智慧技術大會火熱售票中,8 折倒計時一周搶票,詳情點擊:

t.cn/Rl2MftP

《深入淺出TensorFlow》迷你書現已發布,關注公眾號「AI前線」,ID:ai-front,回復關鍵字:TF,獲取下載鏈接!


推薦閱讀:

Windows下MySQL 5.7.17壓縮版安裝過程的坑
優秀開源項目kombu源碼分析之registry和entrypoint
Python從零開始系列連載(14)——Python程序的基本控制流程(中)
你真的了解Python中的日期時間處理嗎?
Beautiful Soup實踐

TAG:Python | 谷歌Google | 开源 |