search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

為什麼PyTorch這麼火?一線開發者這樣說

編者按:2017 年初,Facebook 在機器學習和科學計算工具 Torch 的基礎上,針對 Python 語言發布了一個全新的機器學習工具包 PyTorch。一經發布,這款開源工具包就受到了業界的廣泛關注和討論,經過幾個月的發展,目前 PyTorch 已經成為從業者最重要的研發工具之一。PyTorch 為什麼如此受歡迎,研究人員是出於怎樣的考慮選擇了 PyTorch?針對這些問題,我們今天不妨來看看專業人士怎麼說。

以下內容轉載自饒錦峰在知乎上的問答,雷鋒網 AI 研習社已或授權。饒錦峰先後就讀於浙江大學和美國馬里蘭大學的計算機科學學院,曾於微軟和谷歌實習,研究方向是深度神經網路和自然語言處理等。(文中所有鏈接詳見文末「閱讀原文」)

PyTorch比較吸引我的特性有以下幾點:

1. 支持Python。之前用Lua寫代碼不要太痛苦(用 Torch 時),各種功能性函數沒有。舉個例子,Lua裡面最主要的數據結構是table(類似於Python語言裡面的dict),table里元素是通過key的形式來訪問的。很多情況下我想訪問table裡面有多少個元素,這要是在python或者java裡面就是table.size一句話就能搞定的,但放在Lua裡面,唯一可行的方案就是像下面這樣:

function tablelength(T)

local count = 0

for _ in pairs(T) do count = count + 1 end

return countend

2. 支持autograd。不用自己去定義和數學推導back-propagation. 這個還是比較實用的,記得很早的時候,torch裡面還沒有計算cosine similarity的函數,得自己定義cosine的forward和backward函數,又溫習了一遍微積分=_=不過自己寫backward也是有好處的,這是一個很好的學習過程,對你理解深度學習的原理有很大的幫助。當你的代碼出錯了的時候,你能有個比較清晰的思路從哪裡開始debug.

3. 更容易debug。無論是Torch還是PyTorch的底層都是一個C語言實現的庫函數。在寫深度學習的代碼的時候最痛苦的一塊可能就是debug了。當結果出現問題的時候你不知道你是因為你的hyper-parameter設得不對,還是模型定義的時候出錯了,或者是某一層layer計算的時候出錯了和整個模型的assumption就不適合這個數據集。要找出原因只能不斷的簡化模型並且試錯,這時候PyTorch能夠逐層列印出計算結果就顯得非常靈活了(簡直是NN debug的救星)。雖然其他一些工具Keras也能支持顯示每層layer的output,但是依賴於一些輔助函數,寫起來也比較麻煩。

4. 支持動態圖的創建。現在的深度學習平台在定義模型的時候主要用兩種方式:static computation graph(靜態圖模型) 和 dynamic computation graph(動態圖模型)。 絕大部分平台都採用的是static的定義方式,包括TensorFlow, Theano, Caffe,Keras等。靜態圖定義的缺陷是在處理數據前必須定義好完整的一套模型,能夠處理所有的邊際情況。比如在聲明模型前必須知道整個數據中句子的最大長度。相反動態圖模型(現有的平台比如PyTorch, Chainer, Dynet)能夠非常自由的定義模型。舉個例子,傳統的LSTM往往處理一個句子的時候都是以word為單位,然後利用word2vec來初始化詞向量。但是往往有一些很奇怪的詞在vocabulary里是找不到的,也就是沒法用word2vec初始化詞向量。這時候你可能想用characer-level(字元)級別的表示來初始化那個單詞,就需要藉助動態圖模型的定義了。簡單來說動態圖模型允許你在運行程序的時候動態去修正你的模型結構,來處理各種奇奇怪怪的邊角輸入,這在學術研究的時候的靈活性就體現出來了。

上圖左邊為靜態圖的計算框架,右邊為動態圖的框架 [1]。靜態圖需要在處理數據前定義好一套完整的模型;而動態圖模型允許用戶先定義好一套基本的框架再根據數據來實時修正模型。

5. 和 LuaJIT 相比降低了大概30%-50%的內存使用率,而且 LuaJIT 是有 2G 的內存上限的(這個有時候很麻煩)。另外謝謝評論區的@peng sun補充,LuaJIT的內存上限是指lua內部的數據結構,比如table, string等,不包括用戶定義的數據結構,比如torch.Tensor之類等,不然把word embedding load到內存里就炸了。。有時候為了避免內存溢出的情況,會用Lua 5.1編譯,而不用LuaJIT。關於Lua 編譯器和LuaJIT的區別,可以參看這個帖子:What makes LuaJIT faster than Lua?

補充一點是,目前版本在效率上比Torch慢5%,可能是因為創建動態圖的時候多耗時了. 在PyTorch網站上有個帖子討論和Torch的比較,可以看看:Roadmap for torch and pytorch

其他一些我會考慮的點:

1. 遷移成本。作為Torch用戶,我已經很習慣它的一套開發流程了,也能夠比較高效的實現定義的模型了。如果要遷移到PyTorch平台,需要學習下裡面的一些函數定義和使用,不想換平台的時候太麻煩。

2. 社區支持。作為一個新開發的平台,PyTorch的社區支持還是比較弱的,還沒有什麼開源的代碼和模型。我不知道有多少老Torch用戶去轉移到PyTorch上面去,但是有一個良好的社區環境是需要長時間的積累的。

在選擇一個深度學習平台上,我會主要考慮易用性,學習成本和社區環境。舉個例子就Torch而言,社區環境很好,但學習成本和易用性上要打個折扣,我想這是很多新用戶可能不會選擇Torch的原因,也是PyTorch開發的一部分初衷吧(降低學習成本和提高易用性來吸引更多的新用戶)。就PyTorch而言,剛開始開放出來社區支持還不是很強,不過最近一段時間口碑上去得很快,社區的增長也比較迅速。

總體來說我還是很喜歡 PyTorch 的編程模式的,非常好用,推薦 researcher 使用。相反,如果只是想了解一下深度學習,並且快速開發出一套簡單實用的深度學習模型,推薦 Keras+TensorFlow 作為入門工具(API簡單+文檔全+社區強)。

最後貼一張Andrej Karpathy博客里各深度學習平台使用比例的圖:

圖片來源:

[1] Chainer: a Next-Generation Open Source Framework for Deep Learning, Tokui, Seiya and Oono, Kenta and Hido, Shohei and Clayton, Justin, NIPS 2015, Learning System workshop.

「實戰特訓:遠場語音交互技術」 課程開課啦!

深入了解 AI 設備語音交互關鍵技術,更有價值 1999 元的開發板放送!



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦