天天看點

深度學習架構PyTorch入門與實踐:第一章 PyTorch簡介

1.1 PyTorch的誕生

2017年1月,Facebook人工智能研究院(FAIR)團隊在GitHub上開源了PyTorch,并迅速占領GitHub熱度榜榜首。下面是PyTorch的Logo(英文Torch是火炬的意思,是以Logo中有火焰):

深度學習架構PyTorch入門與實踐:第一章 PyTorch簡介

考慮到Python在計算科學領域的領先地位,以及其生态完整性和接口易用性,幾乎任何架構都不可避免地要提供Python接口。終于,在2017年,Torch的幕後團隊推出了PyTorch。PyTorch不是簡單地封裝Lua Torch提供Python接口,而是對Tensor之上的所有子產品進行了重構,并新增了最先進的自動求導系統,成為當下最流行的動态圖架構。

PyTorch一經推出就立刻引起了廣泛關注,并迅速在研究領域流行起來。下圖所示為Google指數,PyTorch自釋出起關注度就在不斷上升,截止2017年10月18日,PyTorch的熱度已然超過其他三個架構(Caffe、MXNet和Theano),并且其熱度還在持續上升中。

深度學習架構PyTorch入門與實踐:第一章 PyTorch簡介

1.2 常見的深度學習架構

随着深度學習的發展,深度學習架構如雨後春筍般誕生于高校和公司中。尤其是近兩年,Google、Facebook、Microsoft等巨頭都圍繞深度學習重點投資了一系列新興項目,他們也一直在支援一些開源的深度學習架構。

目前研究人員正在使用的深度學習架構不盡相同,有TensorFlow、Caffe、Theano、Keras等,常見的深度學習架構如下圖所示。這些深度學習架構被應用于計算機視覺、語音識别、自然語言處理與生物資訊學等領域,并擷取了極好的效果。本節主要介紹目前深度學習領域影響力比較大的幾個架構,限于筆者個人使用經驗和了解程度,對各個架構的評價可能有不準确的地方。

深度學習架構PyTorch入門與實踐:第一章 PyTorch簡介

1.2.1 Theano

Theano最初誕生于蒙特利爾大學LISA實驗室,于2008年開始開發,是第一個有較大影響力的Python深度學習架構。

Theano是一個Python庫,可用于定義、優化和計算數學表達式,特别是多元數組(numpy.ndarray)。在解決包含大量資料的問題時,使用Theano程式設計可實作比手寫C語言更快的速度,而通過GPU加速,Theano甚至可以比基于CPU計算的C語言快上好幾個數量級。Theano結合了計算機代數系統(Computer Algebra System,CAS)和優化編譯器,還可以為多種數學運算生成定制的C語言代碼。對于包含重複計算的複雜數學表達式的任務而言,計算速度很重要,是以這種CAS和優化編譯器的組合是很有用的。對需要将每一種不同的數學表達式都計算一遍的情況,Theano可以最小化編譯、解析的計算量,但仍然會給出如自動微分那樣的符号特征。

Theano誕生于研究機構,服務于研究人員,其設計具有較濃厚的學術氣息,但在工程設計上有較大的缺陷。一直以來,Theano因難調試、建構圖慢等缺點為人所诟病。為了加速深度學習研究,人們在它的基礎之上,開發了Lasagne、Blocks、PyLearn2和Keras等第三方架構,這些架構以Theano為基礎,提供了更好的封裝接口以友善使用者使用。

2017年9月28日,在Theano 1.0正式版即将釋出前夕,LISA實驗室負責人,深度學習三巨頭之一的Yoshua Bengio宣布Theano即将停止開發:“Theano is Dead”。盡管Theano即将退出曆史舞台,但作為第一個Python深度學習架構,它很好地完成了自己的使命,為深度學習研究人員的早期拓荒提供了極大的幫助,同時也為之後的深度學習架構的開發奠定了基本設計方向:以計算圖為架構的核心,采用GPU加速計算。

2017年11月,LISA實驗室在GitHub上開啟了一個初學者入門項目,旨在幫助實驗室新生快速掌握機器學習相關的實踐基礎,而該項目正是使用PyTorch作為教學架構。

點評:由于Theano已經停止開發,不建議作為研究工具繼續學習。

1.2.2 TensorFlow

2015年11月10日,Google宣布推出全新的機器學習開源工具TensorFlow。TensorFlow最初是由Google機器智能研究部門的Google Brain團隊開發,基于Google 2011年開發的深度學習基礎架構DistBelief建構起來的。TensorFlow主要用于機器學習和深度神經網絡研究,但它是一個非常基礎的系統,是以也可以應用于衆多領域。由于Google在深度學習領域的巨大影響力和強大的推廣能力,TensorFlow一經推出就獲得了極大的關注,并迅速成為如今使用者最多的深度學習架構。

TensorFlow在很大程度上可以看做是Theano的後繼者,不僅因為它們有很大一批共同的開發者,而且它們還擁有相近的設計理念,都是基于計算圖實作自動微分系統。TensorFlow使用資料流圖進行數值計算,圖中的節點代表數學運算,而圖中的邊則代表這些節點之間傳遞的多元數組(張量)。

TensorFlow程式設計接口支援Python和C++。随着1.0版本的公布,Java、Go、R和Haskell API的alpha版本也被支援。此外,TensorFlow還可在Google Cloud和AWS中運作。TensorFlow還支援Windows7、Windows10和Windows Server 2016。由于TensorFlow使用C++ Eigen庫,是以庫可在ARM架構上編譯和優化。這也就意味着使用者可以在各種伺服器和移動裝置上部署自己的訓練模型,無需執行單獨的模型解碼器或者加載Python解釋器。

作為目前最流行的深度學習架構,TensorFlow獲得了極大的成功,對它的評價也不絕于耳,總結起來主要有以下四點:

  • 過于複雜的系統設計,TensorFlow在GitHub代碼倉庫的總代碼量超過100萬行。這麼大的代碼倉庫,對于項目維護者來說維護成為了一個難以完成的任務,而對于讀者來說,學習TensorFlow底層運作機制更是一個極其痛苦的過程,并且大多數時候這種嘗試以放棄告終。
  • 頻繁變動的接口。TensorFlow的接口一直處于快速疊代之中,并且沒有很好地考慮向後相容性,這導緻現在許多開源代碼已經無法在新版的TensorFlow上運作,同時也間接導緻了許多基于TensorFlow的第三方架構出現Bug。
  • 接口設計過于晦澀難懂。在設計TensorFlow時,創造了圖、會話、命名空間、Place-Holder等諸多抽象概念,對普通使用者來說難以了解。同一個功能,TensorFlow提供了多種實作,這些實作良莠不齊,使用中還有細微的差別,很容易将使用者帶入坑中。
  • 文檔混亂脫節。TensorFlow作為一個複雜的系統,文檔和教程衆多,但缺乏明顯的條理和層次,雖然查找很友善,但使用者卻很難找到一個真正循序漸進的入門教程。

由于直接使用TensorFlow的生産力過于低下,包括Google官方等衆多開發者嘗試基于TensorFlow建構一個更易用的接口,包括Keras、Sonnet、TFLearn、TensorLayer、Slim、Fold、PrettyLayer等數不勝數的第三方架構每隔幾個月就會在新聞中出現一次,但是又大多歸于沉寂,至今TensorFlow仍沒有一個統一易用的接口。

憑借Google強大的推廣能力,TensorFlow已經成為當今最炙手可熱的深度學習架構,但是由于自身的缺陷,TensorFlow離最初的設計目标還很遙遠。另外,由于Google對TensorFlow略顯嚴格的把控,目前各大公司都在開發自己的深度學習架構。

點評:不完美但最流行的深度學習架構,社群強大,适合生産環境。

1.2.3 Keras

Keras是一個高層神經網絡API,由純Python編寫而成并使用TensorFlow、Theano以及CNTK作為後端。Keras為支援快速實驗而生,能夠把想法迅速轉換為結果。Keras應該是深度學習架構中最容易上手的一個,它提供了一緻而簡潔的的API,能夠極大地減少一般應用下使用者的工作量,避免使用者重複造輪子。

嚴格意義上講,Keras并不能稱為一個深度學習架構,它更像一個深度學習接口,它建構于第三方架構之上。Keras的缺點很明顯:過度封裝導緻喪失靈活性。Keras最初作為Theano的進階API而誕生,後來增加了TensorFlow和CNTK作為後端。為了屏蔽後端的差異性,提供一緻的使用者接口,Keras做了層層封裝,導緻使用者在新增操作或是擷取底層的資料資訊時過于困難。同時,過度封裝也使得Keras的程式過于緩慢,許多Bug都隐藏在封裝之中,在絕大多數場景下,Keras是本節介紹的所有架構中最慢的一個。

學習Keras十分容易,但是很快就會遇到瓶頸,因為它缺少靈活性。另外,在使用Keras的大多數時間裡,使用者主要是在調用接口,很難真正學到深度學習的内容。

點評:入門很簡單,但是不夠靈活,使用受限。

1.2.4 Caffe/Caffe2

Caffe的全稱是Convolutional Architecture for Fast Feature Embedding,它是一個清晰、高效的深度學習架構,核心語言是C++,它支援指令行、Python和MATLAB接口,既可以在CPU上運作,也可以在GPU上運作。

Caffe的優點是簡潔快速,缺點是缺少靈活性。不同于Keras因為太多的封裝導緻靈活性喪失,Caffe靈活性的缺失主要是因為它的設計。在Caffe中最主要的抽象對象是層,每實作一個新的層,必須要利用C++實作它的前向傳播和反向傳播代碼,而如果想要新層運作在GPU上,還需要同時利用CUDA實作這一層的前向傳播和反向傳播。這種限制使得不熟悉C++和CUDA的使用者擴充Caffe十分困難。

Caffe憑借其易用性、簡潔明了的源碼、出衆的性能和快速的原型設計擷取了衆多使用者,曾經占據深度學習領域的半壁江山。但是在深度學習新時代到來之時,Caffe已經表現出明顯的力不從心,諸多問題逐漸顯現(包括靈活性缺少、擴充難、依賴衆多環境難以配置、應用局限等)。盡管現在在GitHub上還能找到許多基于Caffe的項目,但是新的項目已經越來越少。

Caffe的作者從加州大學伯克利分校畢業後加入了Google,參與過TensorFlow的開發,後來離開Google加入FAIR,擔任工程主管,并開發了Caffe2。Caffe2是一個兼具表現力、速度和子產品性的開源深度學習架構。它沿襲了大量的Caffe設計,可解決多年了在Caffe的使用和部署中發現的瓶頸問題。Caffe2的設計追求輕量級,在保有擴充性和高性能的同時,Caffe2也強調了便攜性。Caffe2從一開始就以性能、擴充、移動端部署作為主要設計目标。Caffe2的核心C++庫能提供速度和便攜性,而其Python和C++ API使使用者可以輕松地在Linux、Windows、iOS、Android,甚至Raspberry Pi和NVIDIA Tegra上進行原型設計、訓練和部署。

Caffe2繼承了Caffe的優點,在速度上令人印象深刻。Facebook人工智能實驗室與應用機器學習團隊合作,利用Caffe2大幅加速機器視覺任務的模型訓練過程,僅需1小時就訓練完ImageNet這樣超大規模的資料集。然而盡管已經釋出半年多,開發一年多,Caffe2仍然是一個不太成熟的架構,官網至今沒提供完整的文檔,安裝也比較麻煩,編譯過程時常出現異常,在GitHub上也很少找到相應的代碼。

極盛的時候,Caffe占據了計算機視覺研究領域的半壁江山,雖然如今Caffe已經很少用于學術界,但是仍有不少計算機視覺相關的論文使用Caffe。由于其穩定、出衆的性能,不少公司還在使用Caffe部署模型。Caffe2盡管做了許多改進,但是還遠沒有達到替代Caffe的地步。

點評:文檔不夠完善,但性能優異,幾乎全平台支援(Caffe2),适合生産環境。

1.2.5 MXNet

MXNet是一個深度學習庫,支援C++、Python、R、Scala、Julia、MATLAB及JavaScript等語言;支援指令和符号程式設計;可以運作在CPU、GPU、叢集、伺服器、桌上型電腦或者移動裝置上。MXNet是CXXNet的下一代,CXXNet借鑒了Caffe的思想,但是在實作上更幹淨。在2014年的NIPS上,同為上海交大校友的陳天奇與李沐碰頭,讨論到各自在做深度學習Toolkits的項目組,發現大家普遍在做很多重複性的工作,例如檔案loading等。于是他們決定組建DMLC(Distributed/Deep Machine Learning Community),号召大家一起合作開發MXNet,發揮各自的特長,避免重複造輪子。

MXNet以其超強的分布式支援,明顯的記憶體、顯存優化為人所稱道。同樣的模型,MXNet往往占用更小的記憶體和顯存,并且在分布式環境下,MXNet展現出了明顯優于其他架構的擴充性能。

由于MXNet最初由一群學生開發,缺乏商業應用,極大地限制了MXNet的使用。2016年11月,MXNet被AWS正式選擇為其雲計算的官方深度學習平台。2017年1月,MXNet項目進入Apache基金會,成為Apache的孵化器項目。

盡管MXNet擁有最多的接口,也獲得了不少人的支援,但其始終處于一種不溫不火的狀态。個人認為這在很大程度上歸結于推廣不給力及接口文檔不夠完善。MXNet長期處于快速疊代的過程,其文檔卻長時間未更新,導緻新手使用者難以掌握MXNet,老使用者常常需要查閱源碼才能真正了解MXNet接口的用法。

為了完善MXNet的生态圈,推廣MXNet,MXNet先後推出了包括MinPy、Keras個Gluon等諸多接口,但前兩個接口目前基本停止了開發,Gluon模仿PyTorch的接口設計,MXNet的作者李沐更是親自上陣,線上講授如何從零開始利用Gluon學習深度學習,誠意滿滿,吸引了許多新使用者。

點評:文檔略混亂,但分布式性能強大,語言支援最多,适合AWS雲平台使用。

1.2.6 CNTK

2015年8月,微軟公司在CodePlex上宣布由微軟研究院開發的計算網絡工具集CNTK将開源。5個月後,2016年1月25日,微軟公司在他們的GitHub倉庫上正式開源了CNTK。早在2014年,在微軟公司内部,黃學東博士和他的團隊正在對計算機能夠了解語音的能力進行改進,但當時使用的工具顯然拖慢了他們的進度。于是,一組志願者組成的開發團隊構想設計了他們自己的解決方案,最終誕生了CNTK。

根據微軟開發者描述,CNTK的性能比Caffe、Theano、TensorFlow等主流工具都要強。CNTK支援CPU和GPU模式,和TensorFlow/Theano一樣,它把神經網絡描述成一個計算圖的結構,葉子節點代表輸入或者網絡參數,其他節點代表計算步驟。在Microsoft内部使用的目的而開發的,一開始甚至沒有Python接口,而是使用了一種幾乎沒什麼人用的語言開發的,而且文檔有些晦澀難懂,推廣不是很給力,導緻現在使用者比較少。但就架構本身的品質而言,CNTK表現得比較均衡,沒有 明顯的短闆,并且在語音領域效果比較突出。

點評:社群不夠活躍,但是性能突出,擅長語音方面的相關研究。

1.2.7 其他架構

除了上述的幾個架構,還有不少架構,都有一定的影響力和使用者。比如百度開源的PaddlePaddle,CMU開發的DyNet,簡潔無依賴符合C++11标準的tiny-dnn,使用Java開發并且文檔及其優秀的DeepLearning4J,還有英特爾開源的Nervana,Amazon開源的DSSTNE。這些架構各有優缺點,但是大多流行度和關注度不夠,或者局限于一定的領域,是以不做過多的介紹。此外,還有許多專門針對移動裝置開發的架構,如CoreML、MDL,這些架構純粹為部署而誕生,不具有通用性,也不适合作為研究工具,同樣不做介紹。

1.3 屬于動态圖的未來

2016年,随着TensorFlow的如日中天,幾乎所有人都覺得深度學習架構之争接近尾聲,但2017年卻迎來了基于動态圖的深度學習架構的爆發。

幾乎所有的架構都是基于計算圖的,而計算圖又可以分為靜态計算圖和動态計算圖,靜态計算圖先定義再運作(define and run),一次定義多次運作,而動态計算圖是在運作過程中被定義的,在運作的時候建構(define by run),可以多次建構多次運作。PyTorch和TensorFlow都是基于計算圖的深度學習架構,PyTorch使用的是動态圖,而TensorFlow使用的是靜态圖。在PyTorch中每一次前向傳播(每一次運作代碼)都會建立一幅新的計算圖,如下圖所示。

深度學習架構PyTorch入門與實踐:第一章 PyTorch簡介

靜态圖一旦建立就不能修改,而且靜态圖定義的時候,使用了特殊的文法,就像新學一門語言。這還意味着你無法使用if、while、for-loop等常用的Python語句。是以靜态圖架構不得不為這些操作專門設計文法,同時在建構圖的時候必須把所有可能出現的情況都包含進去,這也導緻了靜态圖過于龐大,可能占用過高的顯存。動态圖架構就沒有這個問題,它可以使用Python的if、while、for-loop的等條件語句,最終建立的計算圖取決于你執行的條件分支。

我們來看看if條件語句在TensorFlow和PyTorch中的兩種實作方式,第一個利用PyTorch動态圖的方式實作。

import torch as t
from torch.autograd import Variable

N, D, H = 3, 4, 5

x = Variable(t.randn(N, D))
w1 = Variable(t.randn(D, H))
w2 = Variable(t.randn(D, H))

z = 10
if z > 10:
    y = x.mm(w1)
else:
    y = x.mm(w2)
           

第二個利用TensorFlow靜态圖的方式實作。

import tensorflow as tf
import numpy as np

N, D, H = 3, 4, 5
x = tf.placeholder(tf.float32, shape=(N, D))
z = tf.placeholder(tf.float32, shape=None)
w1 = tf.placeholder(tf.float32, shape=(D, H))
w2 = tf.placeholder(tf.float32, shape=(D, H))

def f1():
    return tf.matmul(x, w1)

def f2():
    return tf.matmul(x, w2)

y = tf.cond(tf.less(z, 0), f1, f2)

with tf.Session() as sess:
    values = {
        x: np.random.randn(N, D),
        z: 10,
        w1: np.random.randn(D, H),
        w2: np.random.randn(D, H)
    }

y_val = sess.run(y, feed_dict=values)
           

可以看出,PyTorch的實作方式和Python的文法一緻,簡潔直覺;而TensorFlow的實作不僅代碼冗長,而且十分不直覺。

動态計算圖的設計思想正被越來越多人所接受,2017年1月20日前後,先後有三款深度學習架構釋出:PyTorch、MinPy和DyNet,這三個架構都是基于動态圖的設計模式。PyTorch就是其中的佼佼者,至今已經成為動态圖架構的代表。在PyTorch之前,Chainer就以動态圖思想設計架構,并獲得使用者一緻好評,然而Chainer是由日大學學家開發的,開發人員和文檔都偏向于日本本土,沒有很好地做推廣。PyTorch的釋出讓許多使用者第一次發現原來深度學習架構可以如此靈活、如此容易、還如此快速。

動态圖的思想直覺明了,更符合人的思考過程。動态圖的方式使得我們可以任意修改前向傳播,還可以随時檢視變量的值。如果說靜态圖架構好比C++,每次運作都要編譯才行(session.run),那麼動态圖架構就是Python,動态執行,可以互動式檢視修改。動态圖的這個特性使得我們可以在IPython和Jupyter Notebook上随時檢視和修改變量,十分靈活。

動态圖帶來的另外一個優勢是調試更容易,在PyTorch中,代碼報錯的地方,往往就是你寫錯代碼的地方,而靜态圖需要先根據你寫的代碼生成Graph對象,然後在session.run()時報錯,這種報錯幾乎很難找到對應的代碼真正錯誤的地方。

1.4 為什麼選擇PyTorch

這麼多深度學習架構,為什麼選擇PyTorch呢?

因為PyTorch是目前難得的簡潔優雅且高效快速的架構。在筆者眼裡,PyTorch達到目前深度學習架構的最高水準。目前開源的架構中,沒有哪一個架構能夠在靈活性、易用性、速度這三個方面有兩個能夠超過PyTorch。下面是許多研究人員選擇PyTorch的原因。

  • 簡潔:PyTorch的設計追求最少的封裝,盡量避免重複造輪子。不像TensorFlow中充斥着session、graph、operation、name_scope、variable、tensor、layer等全新的概念,PyTorch的設計遵循tensor——>variable(autograd)——>nn.Module三個由低到高的抽象層次,分别代表高維數組(張量)、自動求導(變量)和神經網絡(層/子產品),而且這三個層次之間的聯系緊密,可以同時進行修改和操作。簡介的設計帶來的另外一個好處就是代碼易于了解。PyTorch的源碼隻有TensorFlow的十分之一左右,更少的抽象、更直覺的設計使得PyTorch的源碼十分易于閱讀。在筆者眼裡,PyTorch的源碼甚至比許多架構的文檔更容易了解。
  • 速度:PyTorch的靈活性不以速度為代價,在許多測評中,PyTorch的速度表現勝過TensorFlow和Keras等架構。架構的運作速度和程式員的程式設計水準有極大關系,但同樣的算法,使用PyTorch實作的那個更有可能快過使用其他架構實作的。
  • 易用:PyTorch是所有的架構中面向對象設計的最優雅的一個。PyTorch的面向對象的接口設計來源于Torch,而Torch的接口設計以靈活易用而著稱,Keras作者最初就是受Torch的啟發才開發了Keras。PyTorch繼承了Torch的衣缽,尤其是API的設計和子產品接口都與Torch高度一緻。PyTorch的設計最符合人們的思維,它讓使用者盡可能地專注于實作自己的想法,即所思即所得,不需要考慮太多關于架構本身的束縛。
  • 活躍的社群:PyTorch提供了完整的文檔,循序漸進的指南,作者親自維護的論壇供使用者交流和求教問題。Facebook人工智能研究院對PyTorch提供了強力支援,作為當今排名前三的深度學習研究機構,FAIR的支援足以確定PyTorch獲得持續的開發更新,不至于像許多由個人開發的架構那樣昙花一現。在PyTorch推出不到一年的時間内,各類深度學習問題都有利用PyTorch實作的解決方案在GitHub上開源。同時也有許多新發表的論文采用PyTorch作為論文實作的工具,PyTorch正在受到越來越多人的追捧。

如果說TensorFlow的設計是“Make It Complicated”,Keras的設計是“Make It Complicated and Hide It”,那麼PyTorch的設計真正做到了“Keep It Simple,Stupid”。簡潔即是美。

使用TensorFlow能找到很多别人的代碼,使用PyTorch能輕松實作自己的想法。

1.5 星火燎原

盡管2017年TensorFlow的新聞依舊鋪天蓋地,但是我們能夠明顯地感受到PyTorch正越來越流行。2017年的年度深度學習架構屬于PyTorch。

2017年1月18日,PyTorch釋出。

2017年2月,最著名的深度學習課程,斯坦福大學的CS231n公布了課程大綱,将釋出才一個多月的PyTorch選為課程教學架構,使用PyTorch布置作業,并提供教程。

2017年3月31日~4月12日,獎金高達100萬美元的Kaggle資料科學競賽(Data Science Bowl 2017)落幕,名為grt123的隊伍使用剛釋出不久的PyTorch以較大優勢奪冠。

2017年4月25日,深度學習年度盛會ICLR2017在法國舉行,PyTorch獲得了極大關注。短短三個月,PyTorch就獲得了極大的認可。

2017年下半年,PyTorch的新聞越來越多,關注度持續提升。PyTorch 0.2版本釋出,新增分布式訓練、高階導數、自動廣播法則等衆多新特性。

艾倫人工智能研究院開源了AllenNLP,基于PyTorch輕松建構NLP模型,幾乎适用于任何NLP問題。

Facebook和微軟宣布,推出Open Neural Network Exchange(ONNX,開放神經網絡交換)格式,這是一個用于表示深度學習模型的标準,ONNX目前支援PyTorch、Caffe2和CNTK,未來會支援更多的架構。除了Facebook和微軟,AMD、ARM、華為、IBM、英特爾、高通也宣布支援ONNX。

著名的深度學習教育網站fast.ai宣布,它們的下一個課程,将完全基于PyTorch,抛棄原來的TensorFlow和Keras。

不同于Google在各個場合大力宣傳TensorFlow,PyTorch的流行更多是由于其簡潔優雅的設計吸引了使用者,幾乎每一個PyTorch使用者都會自發地宣傳PyTorch。TensorFlow确實流行,但正如PyTorch slack中使用者制作的一張調侃圖所說,如果你無法用TensorFlow快速實作你的想法,不要因為TensorFlow最流行就使用它。

就在PyTorch釋出不久後,OpenAI的科學家,Tesla的AI部門主管Andrej Karpathy就發了一篇意味深長的Twitter:

Matlab is so 2012. Caffe is so 2013. Theano is so 2014. Torch is so 2015. TensorFlow is so 2016. ?

2017年5月,Andrej Karpathy又發了一篇Twitter,調侃道:

I’ve been using PyTorch a few months now. I’ve never felt better. I have more energy. My skin is clearer. My eye sight has improved.

2019年馬上要過去了,你還在等什麼?

1.6 fast.ai放棄Keras+TensorFlow選擇PyTorch

fast.ai CEO Jeremy Howard在fast.ai官網宣布下一個課程将完全基于一個使用PyTorch開發的架構,抛棄原來的TensorFlow和Keras架構。

官網通告部分翻譯如下。

我們在開發《面向程式員的前沿深度學習》這門課程的時候遇到瓶頸,因為原來選的TensorFlow和Keras架構讓我們處處碰壁。例如,現在自然語言進行中最重要的技術,大概是Attention模型。可是我們發現,當時在Keras上沒有Attention模型的有效實作,而TensorFlow實作缺乏必要文檔、不斷地變化,而且過于複雜以至于難以了解。于是我們決定利用Keras實作Attention模型,這花了我們好長時間,調試過程也十分痛苦。

随後,我們開始嘗試實作dynamic teacher forcing,這是神經網絡翻譯系統的關鍵,而且無論是在Keras裡還是在TensorFlow裡,我們都找不到這個模型的參考實作,而我們自己嘗試實作的系統直接就不能用。

這時,PyTorch的第一個預釋出版出現了。這個新架構不是基于靜态計算圖,而是一個動态的架構,這為我們帶來了新的希望。動态架構讓我們在開發自己的神經網絡時,隻需要寫普通的Python代碼,像正常用Python一樣調試。我們都沒有專門學習PyTorch,第一次用PyTorch,就用它實作了Attention模型和dynamic teacher forcing,隻用了幾個小時。

上文提到的那門課程的一個重要目标就是讓學生能讀最近的論文,然後實作它們。自己實作深度學習模型的能力十分重要,因為到目前為止,我們十分關注學術研究,對深度學習的應用反倒很有限。是以,用深度學習解決很多現實世界問題的時候,不僅需要了解基礎技術,還要能針對特定的問題和資料實作定制化的深度學習模型。

PyTorch,讓學生能充分利用普通Python代碼的靈活性和能力建構、訓練神經網絡。這樣他們就能解決更廣泛的問題。

PyTorch的另一個好處是,它能讓學生更深入地了解每個算法中發生了什麼。用TensorFlow那樣的靜态計算圖庫,你一旦聲明性地表達了你的計算,就把它發送到了GPU,整個處理過程就是一個黑箱。但是通過動态的方法,你可以完全進入計算的每一層,清楚地看到正在發生的情況。我們認為學習深度學習的最佳途徑就是通過程式設計、實驗,動态的方法正是我們的學生所需要的。

令我們驚奇的是,我們還發現很多模型在PyTorch上訓練比在TensorFlow上更快。這和我們所熟知的“靜态計算圖能帶來更多優化,是以應該性能更好”恰恰相反。

在實踐中我們看到,有些模型快一點,有些慢一點,每個月都不一樣。問題的關鍵似乎在以下兩點。

  • PyTorch提供了開發人員的生産力和調試經驗,是以可以帶來更快的開發疊代和更好的實作。
  • PyTorch中更小、更集中的開發團隊不會對每個功能都進行微優化,而是在整體設計上尋求“大勝”。

筆者認為fast.ai的這篇部落格很好地對比了PyTorch和Keras+TensorFlow。

  • 許多論文方法都沒有TensorFlow的開源實作,或者實作的品質不如人意,并且TensorFlow和Keras難以調試。
  • PyTorch容易上手(fast.ai研究人員第一次使用PyTorch就實作了Attention模型和dynamic teacher forcing)。
  • PyTorch易于調試、十分靈活、透明;TensorFlow和Keras難以調試,就像一個黑箱。
  • PyTorch比TensorFlow快。

繼續閱讀