深度學習框架: PyTorch與TensorFlow

回到目錄
撰寫日期: 2021/9/17

什麼是深度學習框架?

深度學習框架基本上就是把神經網路的一些演算法跟運算流程等細節包裝好,降低使用深度學習的門檻,讓用戶可以像堆積木一樣堆出自己想要的模型結構。個人認為,深度學習框架有點像不同的程式語言。不管是用 C++ 或是Python,大部分的任務都能藉由兩者實現,差別只在於各個語言的寫法不同跟執行速度上有所差距。就像 C++ 一般來說運行較快,但是語法較為嚴謹,而 Python 的語法平易近人,而作為較高階語言的交換代價,他的執行速度就有所降低。回到深度學習框架,使用哪個框架通常也各有優缺(除非這個框架真的做的超他媽爛)不過大致上被大家廣為使用的一些模組甚至是模型本身,在常見的框架裡都已經被編入API中,能夠被輕易的調用。所以有名的幾個框架也沒有絕對的好壞,完全取決於使用者的需求。接下來我就來稍微介紹一下目前較為主流的兩種框架,PyTorch 與 TensorFlow。

起源

PyTorch 由 Facebook AI團隊(Facebook AI Research)基於另一套叫做 Torch 的框架而開發(因為Torch使用的不是Python語言,較為小眾)在 2017 年初開源。TensorFlow則是基於 Theano ,由Google Brain 所開發,於 2015 年開源,早了前者兩年。首先光是看它們背後的靠山,就知道不是泛泛之輩,而事實也的確如此。雖然他們的誕生有一段時間差,但在 2017 到 2020 年間,兩者有並駕齊驅的趨勢。PyTorch與TensorFlow分別佔據了學術界和產業界這兩塊大餅。而為什麼會有這樣的現象,後面的幾項比較就會讓你慢慢理解。

img

Coding Style

PyTorch 有著物件導向程式設計的風格(Object-oriented programming, OOP)也就是說,當你在設計model時,你常常會需要先繼承PyTorch library裡面的class,再基於這個class客製化自己要的model。總的來說就是很Python,如果對習慣Python語法的人來說,使用PyTorch不會需要太長的適應期,而且整體的結構也很清晰,但缺點是程式碼會比較冗長,讀寫其內容都比較吃力。另一方面如果使用的是TensorFlow的高階API—Keras,相對上來說,很多模組都被封裝得相當精緻,縮短了程式碼的長度,對於初學者也比較平易近人。但如果你使用的是純的TensorFlow,雖然使用上彈性很高,但是語法既難懂又長,直到跟Keras合併後才有所改善。

整體上來說,Keras比較簡單,使用起來就像在堆積木或接水管一樣容易又直觀,不過若是真的有心想要對 Deep Learning 有更全面的理解,從PyTorch先下手還是有好處。PyTorch在編寫上清晰,同時也無法省略太多的細節,有助於新手從中學習,等到有一定程度後,再使用更高階的Keras也是不錯的選擇。

學術及產業面

由於PyTorch和TensorFlow在初期的差異頗大。前者主要是語法簡潔有條理,而且一開始主打的動態圖在研究上方便調整、試驗新的想法,同時在教學文件上也做得不錯;後者則是計算效率有優勢,而且開發得早,很多早期的應用都是以TensorFlow或是它的前身Theano為主。

在學術界,PyTorch已經站穩了腳步。研究的目的本就是突破舊設計,因此TensorFlow在性能上的優點並沒有太大的影響。隨便去看看新出的論文,清一色都是用PyTorch寫的open source。從下圖CVPR 2020所接收的論文比例可看出,PyTorch使用數是TensorFlow的四倍。所以當你本身就在搞研究,想復現別人的論文。為了方便,能不用PyTorch嗎?

img

在產業上來說,身為實際運用端,效率一定是擺第一。而且,在早期就使用TensorFlow的情況下,即便後來有新框架出現,除非效能輾壓群雄,不然以工業這種牽一髮動全身的狀態,根本不可能隨便就打掉重來。即便近期兩者有一直在接收對方的優點,不斷縮小彼此的差距,但是原本就用某個框架的用戶也實在沒理由跳槽,因此,既有的客群還是難以撼動。

自身經驗

我個人學DL的第一年用的是Keras,用起來非常簡單。我當時幾乎是門外漢的等級,所以一開始學長給我參考用、以TensorFlow低階API寫的範本我根本看不懂。當時適逢TensorFlow大改版,這些code也無法執行,所以後來使用Keras才勉強把作業交差。(題外話,我真覺得TF的改版是在拿石頭砸自己腳,兩個版本的差距極大,舊有的function很多都不通用,最重要的是TF GPU版本也有夠難安裝)結果,我雖然寫出作業了,但卻是迫於壓力快速做出來的東西,實際上我沒能夠內化多少相關的知識。

之後我用Keras做出來的模型,其實說難聽的,猴子都會做。DL這種東西聽起來不明覺厲,然而,其門檻並沒有一般人想像的那麼高,也就是說,掛在DL這大招牌下的除了頂尖的研究者外,還有不少對DL只懂皮毛就用它招搖撞騙的人。這些人大概就只會調調參數,最後可能試出一個不錯的結果就把自己當成專家(跟以前的我八成像)也因此發覺,跟厲害的人比起來,DL的細節很多我都似懂非懂,所以轉向了PyTorch。後來也的確在Pytorch的環境底下,讓我稍微提升了水準。所以還是奉勸新手不要使用太高階的API,即便前期痛苦也沒關係,真的沒天分還可以趁早停損,否則拖到最後受的苦不會比較少。

總結可以用一張圖表達:
img87

參考資料

[1] Tensorflow vs PyTorch: Which is better for your application development?
[2] Pytorch vs Tensorflow 2021
[3] PyTorch稱霸:CVPR論文佔比是TensorFlow 4 倍

回到目錄