谷歌推出Tangent開源庫(kù),在Python源代碼上做自動(dòng)微分
谷歌今天推出了一個(gè)新的開源Python自動(dòng)微分庫(kù):Tangent。
和現(xiàn)有的機(jī)器學(xué)習(xí)庫(kù)不同,Tangent是一個(gè)源代碼到源代碼的系統(tǒng),使用Python函數(shù)f,并用一個(gè)新的Python函數(shù)來計(jì)算f的梯度。這能幫用戶更好地看清梯度計(jì)算,并更簡(jiǎn)單地對(duì)梯度進(jìn)行用戶級(jí)編輯和調(diào)試。
此外,Tangent還有更多調(diào)試和設(shè)計(jì)機(jī)器學(xué)習(xí)模型的功能:
- 輕松調(diào)試反向傳遞過程(backward pass)
- 快速的gradient surgery
- 正向模式自動(dòng)微分
- 高校的Hessian向量積
- 代碼優(yōu)化
本文簡(jiǎn)要介紹了Tangent API,包括如何用它在Python中生成易于理解、調(diào)試和修改的梯度代碼。
神經(jīng)網(wǎng)絡(luò)為機(jī)器學(xué)習(xí)帶來了巨大的進(jìn)步,而我們訓(xùn)練神經(jīng)網(wǎng)絡(luò)來完成各類任務(wù)的基本思想已經(jīng)存在30年了,它就是反向模式自動(dòng)微分(reverse-mode automatic differentiation),也就是我們常說的反向傳播(backpropagation)。反向傳播的過程包含兩次通過神經(jīng)網(wǎng)絡(luò):首先是運(yùn)行“正向傳遞”來計(jì)算每個(gè)節(jié)點(diǎn)的輸出值,然后再運(yùn)行“反向傳遞”計(jì)算一系列導(dǎo)數(shù),來確定如何更新權(quán)重以提高模型準(zhǔn)確性。
訓(xùn)練神經(jīng)網(wǎng)絡(luò)、研究新架構(gòu),就需要我們正確、高效、方便地計(jì)算這些導(dǎo)數(shù)。當(dāng)模型訓(xùn)練不好時(shí),或者嘗試構(gòu)建我們不了解的新東西時(shí),也需要能調(diào)試這些導(dǎo)數(shù)。自動(dòng)微分(簡(jiǎn)稱autodiff)就能夠計(jì)算里表示某些數(shù)學(xué)函數(shù)的計(jì)算機(jī)程序的導(dǎo)數(shù),而且?guī)缀跛袡C(jī)器學(xué)習(xí)庫(kù)都能實(shí)現(xiàn)它。
現(xiàn)有的機(jī)器學(xué)習(xí)庫(kù)通過跟蹤程序的執(zhí)行(在運(yùn)行時(shí),比如TensorFlow Eager、PyTorch、Autograd),或者構(gòu)建動(dòng)態(tài)數(shù)據(jù)流圖然后微分它(提前,比如TensorFlow)來實(shí)現(xiàn)自動(dòng)微分。
Tangent采用了與它們都不同的方式,在Python源代碼上提前執(zhí)行自動(dòng)微分,并生成Python源代碼作為輸出。
于是,你可以像讀取程序其他部分一樣,來讀取自動(dòng)導(dǎo)數(shù)代碼。
對(duì)于那些不僅想用Python來寫模型,還想在不犧牲速度和靈活性的情況下來讀取、調(diào)試自動(dòng)生成的導(dǎo)數(shù)代碼的研究人員和學(xué)生來說,Tangent非常有用。
檢查和調(diào)試Tangent模型不需要特殊的工具,Tangent可以在Python龐大又不斷增長(zhǎng)的子集上工作,為其他Python機(jī)器學(xué)習(xí)庫(kù)提供它們所沒有的自動(dòng)微分特性。它性能高,且與TensorFlow、NumPy兼容。
怎樣自動(dòng)為Python代碼生成導(dǎo)數(shù)呢?
像tf.exp或tf.log這樣的數(shù)學(xué)函數(shù)具有導(dǎo)數(shù),我們可以編寫出來構(gòu)建反向傳遞,子例程、條件、循環(huán)等語法片段也同樣具有反向傳遞版本。Tangent能為任何Python語法、以及很多Numpy和TensorFlow函數(shù)調(diào)用生成導(dǎo)數(shù)代碼。
Tangent有一個(gè)單一功能API:
下面的動(dòng)圖展示了當(dāng)我們?cè)赑ython函數(shù)上調(diào)用tangent.grad時(shí)會(huì)發(fā)生什么:
如果你想列出自己的導(dǎo)數(shù),可以運(yùn)行:
對(duì)于Python語法的導(dǎo)數(shù)和TensorFlow Eager函數(shù),Tangent有一個(gè)巨大的recipe庫(kù)。tangent.grad會(huì)抓取你傳遞給它的Python函數(shù)源代碼,然后反向遍歷它,從自己的庫(kù)中查找匹配的反向傳遞recipe,并把它加到導(dǎo)數(shù)函數(shù)的末尾。
這項(xiàng)技術(shù)的名字——反向模式自動(dòng)微分——就來源于這種逆向處理。
上面的函數(shù)df只適用于張量(非數(shù)組)輸入。Tangent也支持:
- 用TensorFlow Eager函數(shù)來處理數(shù)組
- 子例程
- 控制流
谷歌在博客文章中強(qiáng)調(diào),雖然Tangent從支持TensorFlow Eager開始,但它并不和某一個(gè)庫(kù)綁定,他們也愿意接受添加PyTorch或者M(jìn)XNet導(dǎo)數(shù)recipe的請(qǐng)求。