對比深度學(xué)習十大框架:TensorFlow 并非最好?
2016 年已經(jīng)過(guò)去,BEEVA Labs 數據分析師 Ricardo Guerrero Gomez-Ol 近日在 Medium 上發(fā)表了一篇文章,盤(pán)點(diǎn)了目前最流行的深度學(xué)習框架。為什么要做這一個(gè)盤(pán)點(diǎn)呢?他寫(xiě)道:「我常聽(tīng)到人們談?wù)?a class="contentlabel" href="http://dyxdggzs.com/news/listbylabel/label/深度學(xué)習">深度學(xué)習——我該從哪里開(kāi)始呢?TensorFlow 是現在最流行的吧?我聽(tīng)說(shuō) Caffe 很常用,但會(huì )不會(huì )太難了?在 BEEVA Labs,我們常常需要應對許多不同的深度學(xué)習庫,所以我希望能夠將我們的發(fā)現和感想分享出來(lái),幫助那些剛剛進(jìn)入深度學(xué)習這一美麗世界的人?!?/p>本文引用地址:http://dyxdggzs.com/article/201709/364603.htm
鏈接:https://www.tensorflow.org/
對于那些聽(tīng)說(shuō)過(guò)深度學(xué)習但還沒(méi)有太過(guò)專(zhuān)門(mén)深入的人來(lái)說(shuō),TensorFlow 是他們最喜歡的深度學(xué)習框架,但在這里我要澄清一些事實(shí)。
在 TensorFlow 的官網(wǎng)上,它被定義為「一個(gè)用于機器智能的開(kāi)源軟件庫」,但我覺(jué)得應該這么定義:TensorFlow 是一個(gè)使用數據流圖(data flow graphs)進(jìn)行數值計算的開(kāi)源軟件庫。在這里,他們沒(méi)有將 TensorFlow 包含在「深度學(xué)習框架」范圍內,而是和 Theano 一起被包含在「圖編譯器(graph compilers)」類(lèi)別中。
在結束了 Udacity 的 Deep Learning 課程(https://www.udacity.com/course/deep-learning--ud730)之后,我的感覺(jué)是 TensorFlow 是一個(gè)非常好的框架,但是卻非常低層。使用 TensorFlow 需要編寫(xiě)大量的代碼,你必須一遍又一遍地重新發(fā)明輪子。而且我并不是唯一一個(gè)這么想的人。Andrej Karpathy 在 Twitter 上就多次吐過(guò)槽:

推文:我希望 TensorFlow 能標準化我們的代碼,但它是低層面的,所以我們在其上面的層上分道揚鑣了:Slim、PrettyTensor、Keras、TFLearn ...

比如:我們在 OpenAI 使用 TensorFlow,但我們似乎都更喜歡其它框架,我們有些人還寫(xiě)自定義代碼。嘆
幾個(gè)月前,我去參加了「Google Experts Summit: TensorFlow, Machine Learning for everyone, with Sergio Guadarrama」。Sergio 是開(kāi)發(fā) TensorFlow 的一位工程師,但他在會(huì )上沒(méi)有展示 TensorFlow,而是展示了一個(gè)在 TensorFlow 上工作的更高層的庫 tf.contrib:https://www.tensorflow.org/tutorials/tflearn/。我的看法是:他們內部已經(jīng)意識到如果要讓更多人使用 TensorFlow,他們就需要以更高的抽象水平在其上創(chuàng )建一些層,從而簡(jiǎn)化 TensorFlow 的使用。
TensorFlow 支持 Python 和 C++,也允許在 CPU 和 GPU 上的計算分布,甚至支持使用 gRPC 進(jìn)行水平擴展。
總結:TensorFlow 非常好,但你必須了解它好在哪里。如果你不想什么事都自己手動(dòng)去做和重新發(fā)明輪子,你可以使用更簡(jiǎn)單的庫(安利一下 Keras)。
Theano
鏈接:http://deeplearning.net/software/theano/
Theano 是最老牌和最穩定的庫之一。據我所知,深度學(xué)習庫的開(kāi)端不是 Caffe 就是 Theano。
和 TensorFlow 類(lèi)似,Theano 是一個(gè)比較低層的庫。也因此它并不適合深度學(xué)習,而更適合數值計算優(yōu)化。它支持自動(dòng)的函數梯度計算,帶有 Python 接口并集成了 Numpy,這使得它從一開(kāi)始就成為了通用深度學(xué)習領(lǐng)域最常使用的庫之一。
今天,Theano 依然效果良好,但由于它不支持多 GPU 和水平擴展,在 TensorFlow 的熱潮下(它們針對同一個(gè)領(lǐng)域),Theano 已然開(kāi)始被遺忘了。
Keras
鏈接:https://keras.io/
「You have just found Keras.」
上面這句話(huà)是你打開(kāi)文檔頁(yè)面時(shí)看到的第一句話(huà)。我還記得我第一次發(fā)現 Keras 的時(shí)候。那時(shí)候我正在柏林解決 Data Science Retreat 的最后一個(gè)項目,為此我努力進(jìn)入了深度學(xué)習庫的世界。我在起步時(shí)就已經(jīng)有了足夠的深度學(xué)習知識,但我沒(méi)有時(shí)間自己手動(dòng)編寫(xiě)功能,也沒(méi)有時(shí)間探索和學(xué)習一個(gè)新的庫(截止時(shí)間不到 2 個(gè)月,而我還有課要上)。然后我發(fā)現了 Keras。
我真的很喜歡 Keras,因為它的句法是相當明晰的,它的文檔也非常好(盡管相對較新),而且它支持我已經(jīng)掌握的語(yǔ)言 Python。它的使用非常簡(jiǎn)單輕松;我們也能很直觀(guān)地了解它的指令、函數和每個(gè)模塊之間的鏈接方式。
Keras 是一個(gè)非常高層的庫,可以工作在 Theano 和 TensorFlow(可以配置)之上。另外,Keras 強調極簡(jiǎn)主義——你只需幾行代碼就能構建一個(gè)神經(jīng)網(wǎng)絡(luò )。在這里你可以比較一下 Keras 和 TensorFlow 實(shí)現相同功能時(shí)所需的代碼:https://gist.github.com/ricgu8086/0ba44ce3aab19ec50425383a4d778b50
Lasagne
鏈接:http://lasagne.readthedocs.io/en/latest/index.html
Lasagne 是一個(gè)工作在 Theano 之上的庫。它的使命是簡(jiǎn)化一點(diǎn)深度學(xué)習算法之下的復雜計算,同時(shí)也提供了一個(gè)更加友好的接口(也是 Python 的)。這是一個(gè)老牌的庫,并且很長(cháng)時(shí)間以來(lái)它都是一個(gè)擴展能力很強的工具;但在我看來(lái),它的發(fā)展速度趕不上 Keras。它們的適用領(lǐng)域都差不多,但 Keras 有更好的文檔、也更完整。
Caffe
鏈接:http://caffe.berkeleyvision.org/
Caffe 不只是最老牌的框架之一,而是老牌中的老牌。
在我看來(lái),Caffe 有非常好的特性,但也有一些小缺點(diǎn)。起初的時(shí)候它并不是一個(gè)通用框架,而僅僅關(guān)注計算機視覺(jué),但它具有非常好的通用性。在我們實(shí)驗室的實(shí)驗中,CaffeNet 架構的訓練時(shí)間在 Caffe 中比在 Keras 中(使用了 Theano 后端)少 5 倍。Caffe 的缺點(diǎn)是它不夠靈活。如果你想給它來(lái)一點(diǎn)新改變,那你就需要使用 C++ 和 CUDA 編程,不過(guò)你也可以使用 Python 或 Matlab 接口進(jìn)行一些小改變。
Caffe 的文檔非常貧乏。你需要花大量時(shí)間檢查代碼才能理解它(Xavier 初始化有什么用?Glorot 是什么?)
Caffe 的最大缺點(diǎn)之一是它的安裝。它需要解決大量的依賴(lài)包……我曾經(jīng)安裝過(guò) Caffe 兩次,真正痛苦至極。
但要清楚,Caffe 并不是一無(wú)是處。在投入了生產(chǎn)的計算機視覺(jué)系統的工具上,Caffe 是無(wú)可爭議的領(lǐng)導者。它非常穩健非??焖?。我的建議是:用 Keras 進(jìn)行實(shí)驗和測試,然后遷移到 Caffe 中進(jìn)行生產(chǎn)。
DSSTNE
鏈接:https://github.com/amznlabs/amazon-dsstne
DSSTNE 的發(fā)音同 Destiny,是一個(gè)酷勁十足的框架卻總是被忽略。為什么?除去其他的因素不談,原因在于這個(gè)框架不具有普適性,不是為一般常見(jiàn)任務(wù)所設計的。DSSTNE 框架只做一件事——推薦系統,但把這件事做到了極致。既不是為研究而設計,也不是為測試 idea 而設計(來(lái)源其官方網(wǎng)站的宣傳語(yǔ)),DSSTNE 框架是為量產(chǎn)而設計。
我們已在 BEEVA 上做一些實(shí)驗測試了,目前我已經(jīng)感覺(jué)到這是一個(gè)運行非??斓墓ぞ卟⑶夷軌虻玫椒浅:玫倪\行結果(平均準確率均值——mAP 很高)。為了達到這一速度,DSSTNE 框架用 GPU 運行,這也是它的弊端之一:不同于篇中分析的其他框架或者庫,這個(gè)框架不支持使用者隨意在 CPU 和 GPU 中切換,而這可能會(huì )對有些嘗試有用,但我們在 DSSTNE 里做這樣的嘗試時(shí)是不被框架所允許的。
其他的感受就是迄今為止 DSSTNE 還不是一個(gè)足夠成熟的項目,而且它封裝的太嚴密了(「black box」)。如果我們想深入了解這個(gè)框架的運行機制是什么,我們必須且只能去看它的源碼,并且你需要完成很多必須完成的設置(「TODO」)才可以看到。同時(shí),關(guān)于這個(gè)框架的在線(xiàn)教程不多,而能讓開(kāi)發(fā)者進(jìn)行操作嘗試的指導就更少了。我的意見(jiàn)是再等 4 個(gè)月看看 DSSTNE 的最新版本。不能不說(shuō) DSSTEN 的確是一個(gè)很有意思的項目但還需要一點(diǎn)成長(cháng)空間。
還想說(shuō)明一點(diǎn),這個(gè)框架對編程能力沒(méi)有要求。DSSTNE 框架通過(guò)其終端的命令行來(lái)執行相關(guān)操作。
到目前為止,很多我知道也很流行的框架和庫我還沒(méi)有用過(guò),我不能給出更多具體的細節。
Torch
鏈接:http://torch.ch/
在這個(gè)世界上每天仍有很多戰爭,但是一個(gè)優(yōu)秀的「勇士」(西班牙語(yǔ)「Guerrero」)必須熟知哪些戰爭是需要去參加作戰的,哪些是可以選擇不參與的。
Torch 是一個(gè)很著(zhù)名的框架,因巨頭 Facebook 的人工智能研究所用的框架是 Torch,并且在被谷歌收購之前 DeepMind 也是用的 Torch(收購之后 DeepMind 轉向了 TensorFlow)。Torch 的編程語(yǔ)言是 Lua,這就是我剛才所談的「戰爭」的具體所指。在目前深度學(xué)習編程語(yǔ)言絕大部分以 Python 實(shí)現為主的大趨勢下,一個(gè)以 Lua 為編程語(yǔ)言的框架的最大劣勢莫過(guò)于此。我從未用使用過(guò)這個(gè)語(yǔ)言,如果我想使用 Torch 這個(gè)工具,毫無(wú)疑問(wèn)我需要先學(xué)習 Lua 語(yǔ)言然后才能使用 Torch。這固然是一個(gè)合理的過(guò)程,但就我個(gè)人情況來(lái)說(shuō),我偏向于用 Python、Matlab 或者 C++的實(shí)現。
MXNet
鏈接:https://github.com/dmlc/mxnet
mxnet 是一個(gè)支持大多數編程語(yǔ)言的框架之一,包括 Python,R,C++,Julia 等。但我覺(jué)得使用 R 語(yǔ)言的開(kāi)發(fā)者會(huì )特別偏愛(ài) mxnet,因為至今為止還是 Python 以不可置疑的態(tài)勢稱(chēng)霸深度學(xué)習語(yǔ)言的(Python 與 R 的對決,猜猜我會(huì )站哪邊?:-p)
老實(shí)說(shuō),在此之前我并沒(méi)有很關(guān)注 mxnet。但是當亞馬遜 AWS 宣布選擇 mxnet 作為其深度學(xué)習 AMI 的庫時(shí)觸發(fā)我開(kāi)始關(guān)注 mxnet。我必須去了解一下。后來(lái)我獲知亞馬遜把 mxnet 列為其深度學(xué)習的參考庫并宣稱(chēng)其巨大的橫向擴展能力。我感覺(jué)到這里面有一些新的改變發(fā)生而且我必須深入了解。這也是為什么我們 2017 的 BEEVA 的技術(shù)測試名單里有 mnxet 的原因。
我對多 GPU 的擴展能力有點(diǎn)疑慮并且我很原意去了解這樣實(shí)驗的更多細節,但目前我還是對 mxnet 持懷疑態(tài)度。
DL4J
鏈接:https://deeplearning4j.org/
我接觸這一庫,是因為它的 documentation。當時(shí)我正在尋找受限玻爾茲曼機、自編碼器,在 DL4J 中找到了這兩個(gè) documentation。里面的文件很清楚,有理論,有代碼案例。我必須得說(shuō) DL4J 的 documentation 簡(jiǎn)直是藝術(shù)品,其他庫在記錄代碼的時(shí)候需要向它學(xué)習。
DL4J 背后的公司 Skymind 意識到,雖然在深度學(xué)習圈內 Python 是老大,但大部分程序員起自 Java,所以需要找到一個(gè)解決方案。DL4J 兼容 JVM,也適用 Java、Clojure 和 Scala,隨著(zhù) Scala 的起起落落,它也被很多有潛力的創(chuàng )業(yè)公司使用,所以我還會(huì )繼續緊追這個(gè)庫。
此外,Skymind 的 twitter 賬戶(hù)非?;钴S,不斷公開(kāi)最新的科學(xué)論文、案例和教程,及其推薦大家關(guān)注。
Cognitive Toolkit
鏈接:https://github.com/Microsoft/CNTK
認知工具包(Cognitive Toolkit)之前被大家所知的縮略是 CNTK,但是最近又重命名回歸到 Cognitive Toolkit,很可能是想沾最近微軟認知服務(wù)(Microsoft Cognitive services)的光。在公開(kāi)的基準測試上的表現來(lái)看,這個(gè)工具似乎很強勁,支持縱向和橫向的推移。
目前為止,Cognitive Toolkit 似乎不是很流行。我并沒(méi)有讀到很多關(guān)于使用這個(gè)庫的博客、在線(xiàn)實(shí)驗案例或者在 Kaggle 里的相關(guān)評論。但是對我來(lái)說(shuō),一個(gè)背靠微軟研究的框架特別強調自己的推移能力讓我覺(jué)得有些奇怪,畢竟微軟研究團隊可是在語(yǔ)音識別上打破世界紀錄并逼近人類(lèi)水準。
我在查看他們項目百科的一個(gè)范例的時(shí)候了解到 Cognitive Toolkit 在 Python 上的語(yǔ)法和 Keras 是非常相類(lèi)似的(Cognitive Toolkit 也支持 C++),這不禁讓我在想(并不是確認)Keras 才是正確的方式。
結論
我的結論是:如果你想進(jìn)入這一領(lǐng)域,你應該首先學(xué)習 Python。盡管這一領(lǐng)域還支持其它很多語(yǔ)言,但 Python 是應用范圍最廣而且最簡(jiǎn)單的一個(gè)。但是為什么要選擇 Python 呢——畢竟 Python 速度這么慢?因為大多數的庫都使用的是符號式語(yǔ)言(symbolic language)方法而非命令式語(yǔ)言(imperative language)方法。解釋一下也就是說(shuō):不是一條接一條地執行你的指令,而是根據你給出的所有指令創(chuàng )建一個(gè)計算圖(computing graph)。這個(gè)圖被內部?jì)?yōu)化和編譯成可執行的 C++ 代碼。這樣你就能同時(shí)利用上兩個(gè)世界的最優(yōu)之處:Python 帶來(lái)的開(kāi)發(fā)速度和 C++ 帶來(lái)的執行速度。
人們對深度學(xué)習的興趣越來(lái)越大了,但人們并不愿意等待算法訓練所需的大量計算時(shí)間(而且我說(shuō)的是 GPU,想都不要想只使用 CPU)。這也是多 GPU 支持、多機器上的水平擴展甚至定制硬件最近開(kāi)始得勢的原因。
深度學(xué)習領(lǐng)域非?;钴S、易變。很可能我現在所說(shuō)的在 2017 年的中旬就變了。
我的建議是,如果你是初學(xué)者,使用 Keras,如果不是初學(xué)者,也可以使用它。如果你參加過(guò) Kaggle 比賽,你肯定注意到了 Kaggle 的兩大巨星:Keras 和 XGBoost。
評論