當前位置:
首頁 > 知識 > 緊跟未來深度學習框架需求,TensorFlow 推出 Eager Execution

緊跟未來深度學習框架需求,TensorFlow 推出 Eager Execution

Google 的 TensorFlow 是 AI 學習者中使用率最高、名氣也最大的深度學習框架,但由於 TensorFlow 最早是基於 Google 的需求開發的,在實際使用上也會存在如文檔亂、調試難等諸多缺點,而且開發時間比較早未能及時對一些新的需求進行反應(據AI研習社了解,由於缺乏類似 PyTroch、DyNet 的動態圖功能,Lecun 就不止一次吐槽過 TensorFlow 是 「過時的深度學習框架」(yesterday deep learning framework)),而針對用戶的需求,Google 也在對 TensorFlow 不斷改進。

在 10 月 31 日,Google 為 TensorFlow 引入了動態圖機制 Eager Execution,而 Google Brain Team 的工程師 Asim Shankar 和 Wolff Dobson 也在 Google 官方博客發文詳細闡述了這一功能帶來的變化,AI研習社摘編如下:

今天,我們為 TensorFlow 引入了 「Eager Execution」,它是一個命令式、由運行定義的介面,一旦從 Python 被調用可立即執行操作,這使得 TensorFlow 的入門學習變的更簡單,也使得研發工作變得更直觀。

Eager Execution 的優點包括:

可以在即時的運行錯誤下進行快速調試,與 Python 工具進行整合

通過易於使用的 Python 控制流支持動態模型

為自定義和高階梯度提供強大支持

適用於幾乎目前所有的 TensorFlow 操作

目前 Eager Execution 仍處於試用階段,因此我們也在尋求來自社區的反饋以指導我們的方向。

同時 Google 還舉了一些使用 Eager Execution 的直觀例子,例如使用兩個矩陣相乘的代碼是這樣編寫的:

import tensorflow as tf

tfe.enable_eager_execution()

x = [[2.]]

m = tf.matmul(x, x)

使用 print 或者 Python 調試器檢查中間結果也非常直接。

print(m)

# The 1x1 matrix [[4.]]

梯度與自定義梯度

大多數 TensorFlow 用戶對自動微分感興趣。因為每次調用期間可能會產生不同的運算,因此我們將所有的正向運算錄到一個 「磁帶」 上,並在計算梯度時進行反向運算。計算了梯度之後,這個 「磁帶」 就沒用了。

這一 API 與 autograd 包非常類似,例子如下:

def square(x):

return tf.multiply(x, x)

grad = tfe.gradients_function(square)

print(square(3.)) # [9.]

print(grad(3.)) # [6.]

在這裡,gradients_function 先調用了一個預先定義的 Python 函數 square() 作為參數,並返回一個 Python 可調用函數 grad 來計算相對於輸入的 square() 的偏導數。如以上例子中當輸入為 3.0 時, square() 的計算結果為 9,而 grad(3.0) 為對 square() 進行偏導,其計算結果為 6。

同樣,我們也可以調用 gradient_function 計算 square 的二階導數。

此外,用戶也可能需要為運算或函數自定義梯度。這一功能可能有用,例如,它可以為一系列運算提供了更高效或者數值更穩定的梯度。

以下是一個自定義梯度的例子。我們先來看函數 log(1 + e^x),它通常用於計算交叉熵和對數似然。

def log1pexp(x):

return tf.log(1 + tf.exp(x))

grad_log1pexp = tfe.gradients_function(log1pexp)

# The gradient computation works fine at x = 0.

print(grad_log1pexp(0.)

)# [0.5]

# However it returns a `nan` at x = 100 due to numerical instability.print(grad_log1pexp(100.))

# [nan]

上述例子中,當 x=0 時,梯度計算表現良好。然而由於數值的不穩定性,當 x=100 時則會返回 `nan` 。使用上述函數的自定義梯度可用於分析簡化梯度表達式。

使用 Eager 和 Graphs

Eager execution 使開發和調試互動性更強,但是 TensorFlow graphs 在分散式訓練、性能優化和生產部署中也有著諸多優勢。

當啟用 eager execution 時,執行運算的代碼同時還可以構建一個描述 eager execution 未啟用狀況的計算圖。要將模型轉換成圖形,只需在新的 Python 進程中運行同樣的代碼即可。這一做法可以從檢查點保存和修復模型變數值,這允許我們在 eager(命令式)和 graph(聲明式)編程之間輕鬆轉換。通過這種方式可以輕鬆地將啟用 eager execution 開發出的模型導出到生產部署中。

在不久的將來,我們將提供工具來選擇性地將模型的某些部分轉換為圖形。這樣就可以融合部分計算(如自定義 RNN 單元的內部),以實現高性能並同時保持 eager execution 的靈活性和可讀性。

新功能勢必帶來代碼編寫上的變化。Google 還很貼心地給出了幾個 Tips:

與 TensorFlow 一樣,我們建議,如果您還沒有從隊列切換到使用 tf.data 進行輸入處理,請抓緊時間進行切換,它更容易使用,也會更快。 有關幫助參閱相關博客文章(http://t.cn/RpNiMIo)和文檔頁面(http://t.cn/Rl2azT8)。

使用面向對象層,如 tf.layer.Conv2D()或 Keras 層;;它們可以直接存儲變數。

你可以為大多數模型編寫代碼,無論是執行和圖形構建都是一樣的。 但也有一些例外,例如使用 Python 控制流來改變基於輸入的計算的動態模型。

一旦你調用了 tfe.enable_eager_execution(),它就不能關閉。 要獲取圖形行為,請啟動一個新的 Python 會話。

更多內容可參閱 Google 博客(http://t.cn/RlZizQ2)。

新人福利

關注 AI 研習社(okweiwu),回復1領取

【超過 1000G 神經網路 / AI / 大數據,教程,論文】

文檔亂、調試難… TensorFlow 有那麼多缺點,但為何我們依然待它如初戀?


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI研習社 的精彩文章:

如何看待 Hinton 那篇備受關注的Capsules論文?
加速深度學習的訓練和推理

TAG:AI研習社 |