姓名:潘虹瑋? ? ? ? ?? 學(xué)號(hào):16020199005
轉(zhuǎn)載自:https://ai.ofweek.com/news/2018-11/ART-201717-8300-30285837.html
【嵌牛導(dǎo)讀】: 目前當(dāng)紅的人工智能(Artificialintelligence科雳,AI)主要聚焦在深度學(xué)習(xí)(DeepLearning辩越,DL)領(lǐng)域,想學(xué)習(xí)深度學(xué)習(xí)技術(shù)的人姑裂,第一步通常會(huì)遇到一大堆框架(Framework)卻不知如何選擇馋袜,本文將會(huì)完整告訴你,協(xié)助找出最符合自己需求的框架舶斧。
【嵌牛鼻子】:從框架開(kāi)始深度學(xué)習(xí)欣鳖。
【嵌牛提問(wèn)】:如何選擇自己最為需要的框架?
【嵌牛正文】:
目前當(dāng)紅的人工智能(Artificial intelligence茴厉,AI)主要聚焦在深度學(xué)習(xí)(DeepLearning泽台,DL)領(lǐng)域,想學(xué)習(xí)深度學(xué)習(xí)技術(shù)的人矾缓,第一步通常會(huì)遇到一大堆框架(Framework)卻不知如何選擇怀酷,而究竟什么是框架?框架如何用來(lái)表示模型嗜闻?哪些才是主流框架蜕依?本文將會(huì)完整告訴你,協(xié)助找出最符合自己需求的框架。
何謂深度學(xué)習(xí)框架样眠?
? 深度學(xué)習(xí)簡(jiǎn)單示意圖
大家都知道只要準(zhǔn)備一張紙和一只筆友瘤,加上源源不斷的靈感,就能將想法轉(zhuǎn)化成文字檐束,創(chuàng)作出一篇令人感動(dòng)的文章辫秧。但現(xiàn)在手寫(xiě)創(chuàng)作的人越來(lái)越少,只好選用一項(xiàng)電子書(shū)寫(xiě)(數(shù)字表達(dá))的工具來(lái)創(chuàng)作被丧。以Windows舉例盟戏,可能用的是Note Pad(筆記本)、Word或PDF Editor甥桂,如果是學(xué)術(shù)寫(xiě)作的人可能較常用的是Latex抓半,在網(wǎng)頁(yè)上創(chuàng)作則可能是Html。
文章的好壞并不會(huì)因?yàn)楣ぞ叩母淖兌兴煌襦遥瑓s會(huì)影響寫(xiě)作效率以及排版美觀笛求,改變讀者對(duì)這篇文章的評(píng)價(jià)。雖然文章內(nèi)容(基本元素)可輕易的在不同工具中轉(zhuǎn)換糕簿,但遇到字體格式探入、圖片、公式等特殊排版需求時(shí)懂诗,可能出現(xiàn)檔案轉(zhuǎn)不過(guò)去等問(wèn)題蜂嗽,同時(shí)難以用來(lái)表達(dá)音樂(lè)、影像殃恒、視頻植旧。
在解決深度學(xué)習(xí)的問(wèn)題中,較常見(jiàn)的是非時(shí)序性辨識(shí)問(wèn)題离唐,以及時(shí)序性的分析或預(yù)測(cè)問(wèn)題病附。為了方便表達(dá)模型(Net/Model)的結(jié)構(gòu)、工作訓(xùn)練以及推論流程亥鬓,因此產(chǎn)生了框架完沪,用來(lái)正確表達(dá)深度學(xué)習(xí)的模型,就像在Windows上寫(xiě)文章需要有Note Pad嵌戈、Word等覆积,編輯影音內(nèi)容要有威力導(dǎo)演、After Effect等一樣熟呛。
因此宽档,許多學(xué)術(shù)單位、開(kāi)源社群甚至Google庵朝、Microsoft吗冤、Facebook這類知名大公司也紛紛推出自家的框架又厉,以確保在這場(chǎng)AI大戰(zhàn)中能占有一席之地。而有另一派人馬欣孤,想要產(chǎn)生另一種可輕易轉(zhuǎn)成各家的框架,例如微軟的Word可以另存網(wǎng)頁(yè)檔(*.html)昔逗、可攜式文件格式(*.pdf)降传、純文本檔(*.txt)等。在介紹各家框架前勾怒,先來(lái)認(rèn)識(shí)一下深度學(xué)習(xí)的模型究竟用了哪些元素婆排?就像玩樂(lè)高積木前,要先知道有哪些模塊可用笔链,后續(xù)在學(xué)習(xí)各個(gè)框架的表示語(yǔ)法時(shí)才不會(huì)一頭霧水段只。
常見(jiàn)深度學(xué)習(xí)模型介紹
首先介紹兩個(gè)較著名的模型,包括非時(shí)序性的卷積神經(jīng)網(wǎng)絡(luò)(CNN) LeNet-5 [1]以及時(shí)序性的遞歸神經(jīng)網(wǎng)絡(luò)(RNN)鉴扫,方便說(shuō)明模型中常用到的元素與流程赞枕,如何用深度學(xué)習(xí)框架來(lái)表示。
卷積神經(jīng)網(wǎng)絡(luò)(CNN)
圖一卷積神經(jīng)網(wǎng)絡(luò)(CNN) LeNet-5 [1]
(圖一)為最知名的卷積神經(jīng)網(wǎng)絡(luò)LeNet-5坪创,主要是用來(lái)辨識(shí)手寫(xiě)數(shù)字(MNIST數(shù)據(jù)庫(kù))炕婶,輸入為一張8bit灰階32×32像素的影像,而輸出為十個(gè)節(jié)點(diǎn)莱预,分別表示影像為十個(gè)數(shù)字的機(jī)率柠掂,這個(gè)模型幾乎是所有研究深度學(xué)習(xí)的入門(mén)起手式。目前先不解釋這個(gè)模型為何能學(xué)會(huì)辨識(shí)圖像依沮,而是單純就模型組成以及表示方法來(lái)進(jìn)行說(shuō)明涯贞。
首先,說(shuō)明卷積特征圖
C1層危喉,C1層上的紅點(diǎn)宋渔,是由輸入層(INPUT)紅色框(5×5個(gè)像素)乘上5×5的卷積核加總后而得,依序由輸入影像的左至右辜限、上至下共享一個(gè)卷積核進(jìn)行卷積傻谁,一次移動(dòng)一個(gè)像素(Stride=1),如此即可產(chǎn)生一張?zhí)卣鲌D列粪,而C1層共享了六組卷積核审磁,因此產(chǎn)生六張28×28像素的特征圖。再來(lái)將影像進(jìn)行池化岂座,較常見(jiàn)的方式就是把相鄰四點(diǎn)(如圖一綠色框所示)中最大的點(diǎn)當(dāng)成新點(diǎn)态蒂,稱為MaxPooling,同時(shí)把影像長(zhǎng)寬都減為一半费什,成為S2層钾恢。
接下來(lái)手素,對(duì)S2層以16組3×3卷積核進(jìn)行卷積,產(chǎn)生C3層瘩蚪,共有16組10×10像素的特征圖泉懦。同樣地再對(duì)C3層進(jìn)行池化產(chǎn)生S4層,變成16組5×5像素的特征圖疹瘦,最后再以16組5×5卷積核把S4層的16個(gè)特征圖卷積變成16個(gè)輸入點(diǎn)崩哩,再以傳統(tǒng)全鏈接神經(jīng)網(wǎng)絡(luò)進(jìn)行鏈接。C5層就是以16個(gè)輸入點(diǎn)和隱藏層120點(diǎn)進(jìn)行全連結(jié)言沐,并依指定的激活函數(shù)將輸出傳到下一層邓嘹,接下來(lái)再和下一組隱藏層F6的84點(diǎn)進(jìn)行全連結(jié),最后再和輸出層(OUTPUT)的十個(gè)輸出點(diǎn)進(jìn)行全連結(jié)险胰,并正規(guī)化輸出得到各輸出的機(jī)率汹押,即完成整個(gè)LeNet-5模型(網(wǎng)絡(luò))結(jié)構(gòu)。
綜合上述內(nèi)容可得知一個(gè)基本的卷積神經(jīng)網(wǎng)絡(luò)會(huì)有輸入層起便、卷積層棚贾、池化層、全連結(jié)層及輸出層榆综。卷積層要定義卷積核大小鸟悴、移動(dòng)距離、輸出特征圖數(shù)量奖年。而池化層同樣需要定義核的大邢钢睢(一般是2×2)、移動(dòng)距離(一般是2)及池化方式(可以是取最大值或平均值)陋守。全連結(jié)層部份則需要定義節(jié)點(diǎn)數(shù)量及激活函數(shù)類型(如:reLu震贵、sigmoid等),最后輸出層除了要定義正規(guī)化機(jī)率值(如:Softmax)外水评,還要定義損失函數(shù)以作為訓(xùn)練模型用猩系。
前面提到的卷積神經(jīng)網(wǎng)絡(luò)CNN是一種前饋(Forward)的單向網(wǎng)絡(luò),其輸出結(jié)果不會(huì)影響輸入中燥,但如果遇到如語(yǔ)音寇甸、翻譯、視頻這類時(shí)序問(wèn)題時(shí)疗涉,CNN就搞不定了拿霉,此時(shí)就該輪到遞歸神經(jīng)網(wǎng)絡(luò)(RNN)登場(chǎng)了。
遞歸神經(jīng)網(wǎng)絡(luò)(RNN)
圖二 ?遞歸神經(jīng)網(wǎng)絡(luò)(RNN)及型態(tài)(圖二)
左圖所示就是RNN最基本入門(mén)的模型咱扣,把此次輸出的結(jié)果經(jīng)過(guò)加權(quán)后绽淘,再和下一次的輸入一起計(jì)算出下一次的輸出,以串起輸入數(shù)據(jù)的時(shí)序關(guān)連闹伪。從展開(kāi)圖可更清楚看出其關(guān)連沪铭,當(dāng)前輸出(ot)是由目前狀態(tài)(st)乘上權(quán)重(U)加上前一狀態(tài)(st-1)輸出乘上權(quán)重(W)后壮池,經(jīng)過(guò)雙曲正切(tanh)函數(shù)并乘上輸出權(quán)重(V),最后取Softmax算式得出杀怠,依此類推可展開(kāi)成任意級(jí)數(shù)的網(wǎng)絡(luò)椰憋。
(圖二)右圖所示,RNN可以有很多種輸出型態(tài)赔退,一對(duì)一就等于單純的前饋網(wǎng)絡(luò)沒(méi)有時(shí)序關(guān)系橙依,另外也可以一對(duì)多、多對(duì)一离钝、多對(duì)多等不同的輸出方式票编,應(yīng)用于時(shí)序性內(nèi)容分類褪储,例如語(yǔ)句情緒意圖卵渴、音樂(lè)曲風(fēng)、視頻動(dòng)作分析鲤竹、影像加注標(biāo)題等浪读,或是型態(tài)移轉(zhuǎn)(Style
Transfer),例如語(yǔ)言翻譯辛藻、文章音樂(lè)創(chuàng)作等碘橘。對(duì)RNN而言,需要定義展開(kāi)的級(jí)數(shù)吱肌、隱含層(或稱為狀態(tài)S)到隱含層權(quán)重矩陣(W)痘拆、輸入層到隱含層權(quán)重(U)、隱含層到輸出層權(quán)重(V)氮墨、激活函數(shù)(例如:tanh等)類型纺蛆,以及輸出層機(jī)率正規(guī)化方式(例如:Softmax等)。
常見(jiàn)深度學(xué)習(xí)框架及選用考慮
圖三 ?常見(jiàn)深度學(xué)習(xí)框架
許多人準(zhǔn)備開(kāi)始進(jìn)入深度學(xué)習(xí)世界時(shí)规揪,最常問(wèn)的問(wèn)題就是到底要挑選哪一種框架來(lái)入門(mén)桥氏?有如(圖三)
、(表格一)所示猛铅,從最大的開(kāi)源社群Github上字支,就可找到二十種星星數(shù)超過(guò)一千的深度學(xué)習(xí)框架,包括TensorFlow奸忽、Keras堕伪、Caffe、PyTorch栗菜、CNTK刃跛、MXNet、DL4J苛萎、Theano桨昙、Torch7检号、Caffe2、Paddle蛙酪、DSSTNE齐苛、tiny-dnn、Chainer桂塞、neon凹蜂、ONNX、BigDL阁危、DyNet玛痊、brainstorm、CoreML等狂打,而排名第一名的TensorFlow更有近十萬(wàn)個(gè)星星擂煞。由此可知,深度學(xué)習(xí)非常受到大家重視趴乡,當(dāng)選擇深度框架時(shí)可以從好幾個(gè)面向來(lái)考慮对省,以下將會(huì)分別介紹。
1. 程序語(yǔ)言
首先是開(kāi)發(fā)時(shí)所使用的程序語(yǔ)言晾捏,如果要執(zhí)行「訓(xùn)練」及「推論」效率好些蒿涎,則可能要用C++。若要上手容易惦辛、支持性強(qiáng)劳秋,則要考慮Python,從(表格一)中可看出有3/4的框架都支援Python胖齐。
若習(xí)慣使用Java開(kāi)發(fā)程序玻淑,那大概就只有TensorFlow、DL4J和MXNet可選了市怎。目前有一些框架(如TensorFlow岁忘、Caffe等)底層是C++,應(yīng)用層API是用Python区匠,這類框架能取得不錯(cuò)的開(kāi)發(fā)及執(zhí)行效率干像。
若想改善底層效率時(shí),還要考慮依不同硬件驰弄,學(xué)會(huì)OpenCL或Nvidia的CUDA/cuDNN等平行加速程序?qū)懛ā?/p>
2. 執(zhí)行平臺(tái)
再來(lái)考慮的是可執(zhí)行的操作系統(tǒng)及硬件(CPU麻汰、GPU)平臺(tái),目前大多數(shù)的框架都是在Linux CPU+GPU的環(huán)境下執(zhí)行戚篙,部份有支持單機(jī)多CPU(多線程)或多GPU協(xié)同計(jì)算以加速運(yùn)行時(shí)間五鲫,甚至像TensorFlow、CNTK岔擂、DL4J位喂、MXNet等框架還有支持叢集(Cluster)運(yùn)算浪耘。
許多云端服務(wù)商(Google、Amazon塑崖、Microsoft等)也是采取這類組合七冲,方便布署開(kāi)發(fā)好的應(yīng)用程序。另外也有些非主流的框架(如:tiny-dnn)只支持CPU而不支持GPU规婆,這類框架的好處就是移植性較強(qiáng)澜躺,但工作效率很差,較適合小型系統(tǒng)抒蚜。
如果是用Windows的人掘鄙,英特爾(Intel)及微軟(Microsoft)也分別有提供BigDL及CNTK,若使用Mac系統(tǒng)則要考慮使用CoreML嗡髓。不過(guò)最近Google的TensorFlow為了吃下所有的市場(chǎng)操漠,已經(jīng)可以支持Linux、Windows器贩、Mac甚至是Android颅夺,因此成為開(kāi)源排行榜第一名朋截。
3. 模型支持
目前常見(jiàn)的深度學(xué)習(xí)模型包含監(jiān)督型(如CNN)蛹稍、時(shí)序型(如RNN/LSTM)、增強(qiáng)學(xué)習(xí)(如Q-Learning)部服、轉(zhuǎn)移學(xué)習(xí)唆姐、對(duì)抗生成(GAN)等,但不是每個(gè)框架都能全部支持廓八。
舉例來(lái)說(shuō):老牌的Caffe適合做監(jiān)督型學(xué)習(xí)奉芦,但對(duì)于時(shí)序型學(xué)習(xí)就不太合適,遇到對(duì)抗生成模型時(shí)就更使不上力剧蹂。若不清楚那些框架可支持的模型類型声功,可參考(表格一)的對(duì)應(yīng)網(wǎng)址,前往各官網(wǎng)了解使用上的限制宠叼。
4. 框架轉(zhuǎn)換
如果遇到需要串接不同平臺(tái)或框架時(shí)先巴,則要考慮選用具有提供跨框架功能。目前有幾大陣營(yíng)冒冬,像Keras可支持TensorFlow伸蚯、Theano、MXNet简烤、DL4J剂邮、CNTK,而微軟和臉書(shū)聯(lián)盟推的ONNX可支持Caffe2横侦、CNTK挥萌、PyTorch等绰姻,但Google的TensorFlow卻不愿加入該聯(lián)盟。
另外引瀑,雖然框架之間可以轉(zhuǎn)換龙宏,但不代表轉(zhuǎn)換后的執(zhí)行效率會(huì)和直接使用某個(gè)框架一樣好,此時(shí)只能依實(shí)際需求來(lái)取舍是否拿彈性換取效能伤疙。
5. 社群支援
最后要考慮選用的框架社群是否活躍银酗,是否很久沒(méi)有維護(hù)(升級(jí)),甚至被預(yù)告即將淘汰徒像,像Theano雖然功能強(qiáng)大也有很多人在用黍特,但目前確定已不再更新版本,因此建議不要再跳坑了锯蛀。另外對(duì)于英文不好的朋友灭衷,選用框架的社群討論區(qū)、文字教程旁涤、操作視頻等是否有中文支持也是很重要的翔曲,以免遇到問(wèn)題不知向誰(shuí)求救。
表格一 ?深度學(xué)習(xí)框架比較表
總結(jié)
對(duì)于新手來(lái)說(shuō)劈愚,目前用Python+Keras+TensorFlow是最多人的選擇瞳遍,網(wǎng)絡(luò)上也可取得最多資源(包含中文),可支持的操作系統(tǒng)菌羽、硬件平臺(tái)掠械、模型以及數(shù)學(xué)函式庫(kù)也是最豐富的。特色是彈性大注祖,相對(duì)容易開(kāi)發(fā)猾蒂,也是最容易布署在云端的解決方案。
但這樣的組合并非完全沒(méi)有缺點(diǎn)是晨,例如CNTK的執(zhí)行效率相較于MXNet略差肚菠,而Python需占用較多內(nèi)存,不利于布署在本地端(或嵌入式系統(tǒng))進(jìn)行邊緣計(jì)算罩缴,因此如何選擇合適的框架蚊逢,有賴于大家多花點(diǎn)心思了。