姓名:郭金? ? 學(xué)號:17101223407
轉(zhuǎn)載自英語原文:http://research.googleblog.com/2017/11/tangent-source-to-source-debuggable.html
【嵌牛導(dǎo)讀】:Google Brain 今日開源了一款 Python 庫,名為 Tangent,專門用于實現(xiàn)自動微分功能。
【嵌牛鼻子】:AI郎哭、Tangent绪励、Python
【嵌牛提問】: 我們要如何為普通Python代碼生成導(dǎo)數(shù)陕悬?
【嵌牛正文】:
? ? ? 相較于現(xiàn)有機器學(xué)習(xí)資源訓(xùn)灌诅,Tangent 屬于一套源到源系統(tǒng)践磅,其使用 Python f 函數(shù)并生成另一新 Python 函數(shù)以計算 f 梯度单刁。通過這種方式,用戶能夠更好地理解梯度計算流程府适,并輕松完成用戶級梯度編輯與調(diào)試任務(wù)羔飞。Tangent 亦擁有以下機器學(xué)習(xí)模型調(diào)試與設(shè)計能力:
輕松調(diào)試您的反向傳播 快速梯度調(diào)整
正向模式自動差異化
高效 Hessian 矢量產(chǎn)品
代碼優(yōu)化
? ? ? 在今天的文章中肺樟,我們將對 Tangent API 作出概述。文章內(nèi)容涵蓋如何在 Python 中利用 Tangent 生成易于解釋逻淌、調(diào)試以及修改的梯度代碼么伯。
? ? ? 神經(jīng)網(wǎng)絡(luò)(簡稱 NN)已經(jīng)在圖像、視頻卡儒、音頻以及文本類機器學(xué)習(xí)模型領(lǐng)域取得了巨大成功田柔。而讓我們得以訓(xùn)練出能夠在此類任務(wù)中帶來良好表現(xiàn)的神經(jīng)網(wǎng)絡(luò)的基本抽象思路,則源自 30 年前即已誕生的概念骨望,即反向模式自動微分(亦被稱為反向傳播)——其中包括兩次神經(jīng)網(wǎng)絡(luò)通過流程硬爆。首先,我們運行“正向傳播”以計算每個節(jié)點的輸出值锦募。之后摆屯,我們運行“反向傳播”以計算一系列層數(shù),從而確定如何更新權(quán)重以提高模型的準(zhǔn)確性糠亩。
? ? ? 要對神經(jīng)網(wǎng)絡(luò)進行訓(xùn)練并面向新型架構(gòu)加以研究虐骑,要求我們以正確、高效且便捷的方式實現(xiàn)導(dǎo)數(shù)計算任務(wù)赎线。如果我們的模型訓(xùn)練效果不佳廷没,或者嘗試構(gòu)建自己尚不了解的新鮮事物,則必然需要有能力對其作出調(diào)試垂寥。所謂自動微分颠黎,或者簡稱“autodiff”,是指一項用于計算計算機程序內(nèi)負責(zé)表示某些數(shù)學(xué)函數(shù)的導(dǎo)數(shù)的技術(shù)手段滞项。目前狭归,幾乎全部機器學(xué)習(xí)庫都在使用自動微分技術(shù)。
? ? ? 現(xiàn)有各類資源庫在實現(xiàn)自動微分方面文判,主要采用追蹤程序執(zhí)行(立足于 TF Eager过椎、PyTorch 以及 Autograd 等運行時內(nèi)),或者構(gòu)建動態(tài)數(shù)據(jù)流圖形而后對圖形加以微分(進行提前微分戏仓,TensorFlow 即采取此種方法)的方式疚宇。相比之下,Tangent 則可直接對 Python 源代碼進行提前自動微分赏殃,并以輸出結(jié)果的方式生成 Python 源代碼敷待。
? ? ? 如此一來,大家將能夠像讀取其它程序一樣仁热,直接讀取自動導(dǎo)數(shù)代碼榜揖。Tangent 不僅適用于希望利用 Python 編寫模型的研究人員與學(xué)生,同時亦能夠在不犧牲靈活性與速度表現(xiàn)的前提下讀取并調(diào)試自動生成的導(dǎo)數(shù)代碼。大家可以輕松檢查并調(diào)試您利用 Tangent 編寫的模型举哟,且無需使用任何特殊工具或者間接性方式钳幅。Tangent 能夠?qū)?Python 生態(tài)系統(tǒng)內(nèi)龐大且不斷增加的各類功能子集,提供其它 Python 機器學(xué)習(xí)庫所不具備的額外 autodiff 特性炎滞,性能出色且可與 TensorFlow 及 NumPy 相兼容。
? ? ? Python 代碼自動微分
? ? 那么我們要如何為普通 Python 代碼生成導(dǎo)數(shù)诬乞?以 tf.exp 或 tf.log 為代表的各類數(shù)學(xué)函數(shù)中皆包含導(dǎo)數(shù)册赛,我們可以通過編寫此類函數(shù)建立反向傳播。同樣的震嫉,語法片段(例如子例程森瘪、條件與循環(huán)等)也可擁有對應(yīng)的反向傳播版本。Tangent 中包含為每項 Python 語法生成導(dǎo)數(shù)代碼的對應(yīng)方法票堵,同時亦囊括大量面向 NumPy 與 TensorFlow 函數(shù)的調(diào)用選項扼睬。Tangent 擁有一個單函數(shù) API:
以下流程圖展示了在 Python 函數(shù)中調(diào)用 tangent.grad 時會發(fā)生怎樣的情況:
如果您打算輸出自己的導(dǎo)數(shù),則可運行:
? ? ? 從底層角度來看悴势,tangent.grad 會首先提取您傳遞給它的 Python 函數(shù)源代碼窗宇。Tangent 擁有大量 Python 語法導(dǎo)數(shù)配方庫,同時亦支持 TensorFlow Eager 函數(shù)特纤。函數(shù) tangent.grad 隨后會以反向順序遍歷您的代碼军俊,查找匹配的反向傳播配方,并將其浯對導(dǎo)數(shù)函數(shù)末尾捧存。這種逆序處理方式擁有自己的特定名稱:反向模式自動微分粪躬。
? ? 以上 df 函數(shù)僅適用于標(biāo)量(非數(shù)組)輸入內(nèi)容。Tangent 亦支持:
? ? ? 利用 TensorFlow Eager 函數(shù) 昔穴,以處理數(shù)字數(shù)組? 子例程? ? 控制流
? ? 雖然我們選擇 TensorFlow Eager 支持作為起點镰官,但 Tangent 絕不僅限于一種或者多種特定庫——我們樂于將更多 PyTorch 或者 MXNet 導(dǎo)數(shù)配方添加到 Tangent 庫當(dāng)中。
? ? ? 未來展望
? ? ? Tangent 目前在 github.com/google/tangent 上以開源形式公開吗货,感興趣的朋友可以前往下載并進行安裝泳唠。Tangent 目前仍處于實驗性階段,因此在實際使用中可能存在一些錯誤卿操。希望大家能夠在 GitHub 上向我們報告您發(fā)現(xiàn)的問題警检,我們將盡最大努力加以解決。
? ? ? 我們努力在 Tangent 當(dāng)中為 Python 語言的更多要素(例如閉包害淤、內(nèi)聯(lián)函數(shù)定義扇雕、類以及更多 NumPy 與 TensorFlow 函數(shù))添加支持。我們也希望在未來逐步實現(xiàn)更為先進的自動微分與編譯器功能窥摄,例如內(nèi)存與計算間的自動權(quán)衡镶奉、自動性更高的優(yōu)化以及 lambda 提升。
? ? ? 我們有意攜手技術(shù)社區(qū)共同推進 Tangent 的發(fā)展。我們歡迎您提交修復(fù)與功能性質(zhì)的 pull 請求哨苛。感謝您的參與鸽凶!
? ? ? 致謝
? ? ? Bart van Merri?nboer 在實習(xí)期間為 Tangent 項目的各個方面作出了卓越貢獻,Dan Moldovan 領(lǐng)導(dǎo)了 TF Eager 集成建峭、基礎(chǔ)設(shè)施與基準(zhǔn)測試等工作玻侥。此外,感謝谷歌 Brain 團隊對本文編撰工作的支持亿蒸,同時特別感謝 Sanders Kleinfeld凑兰、Matt Johnson 以及 Aleks Haecky 在技術(shù)層面對本文提供的寶貴貢獻。