深度學(xué)習(xí),從「框架」開始學(xué)起
目前當(dāng)紅的人工智能(Artificial intelligence,AI)主要聚焦在深度學(xué)習(xí)(DeepLearning,DL)領(lǐng)域,想學(xué)習(xí)深度學(xué)習(xí)技術(shù)的人,第一步通常會遇到一大堆框架(Framework)卻不知如何選擇,而究竟什么是框架?框架如何用來表示模型?哪些才是主流框架?本文將會完整告訴你,協(xié)助找出最符合自己需求的框架。
何謂深度學(xué)習(xí)框架?
深度學(xué)習(xí)簡單示意圖
大家都知道只要準(zhǔn)備一張紙和一只筆,加上源源不斷的靈感,就能將想法轉(zhuǎn)化成文字,創(chuàng)作出一篇令人感動的文章。但現(xiàn)在手寫創(chuàng)作的人越來越少,只好選用一項電子書寫(數(shù)字表達(dá))的工具來創(chuàng)作。以Windows舉例,可能用的是Note Pad(筆記本)、Word或PDF Editor,如果是學(xué)術(shù)寫作的人可能較常用的是Latex,在網(wǎng)頁上創(chuàng)作則可能是Html。
文章的好壞并不會因為工具的改變而有所不同,卻會影響寫作效率以及排版美觀,改變讀者對這篇文章的評價。雖然文章內(nèi)容(基本元素)可輕易的在不同工具中轉(zhuǎn)換,但遇到字體格式、圖片、公式等特殊排版需求時,可能出現(xiàn)檔案轉(zhuǎn)不過去等問題,同時難以用來表達(dá)音樂、影像、視頻。
在解決深度學(xué)習(xí)的問題中,較常見的是非時序性辨識問題,以及時序性的分析或預(yù)測問題。為了方便表達(dá)模型(Net /Model)的結(jié)構(gòu)、工作訓(xùn)練以及推論流程,因此產(chǎn)生了框架,用來正確表達(dá)深度學(xué)習(xí)的模型,就像在Windows上寫文章需要有Note Pad、Word等,編輯影音內(nèi)容要有威力導(dǎo)演、After Effect等一樣。
因此,許多學(xué)術(shù)單位、開源社群甚至Google、Microsoft、Facebook這類知名大公司也紛紛推出自家的框架,以確保在這場AI大戰(zhàn)中能占有一席之地。而有另一派人馬,想要產(chǎn)生另一種可輕易轉(zhuǎn)成各家的框架,例如微軟的Word可以另存網(wǎng)頁檔(*.html)、可攜式文件格式(*.pdf)、純文本檔(*.txt)等。在介紹各家框架前,先來認(rèn)識一下深度學(xué)習(xí)的模型究竟用了哪些元素?就像玩樂高積木前,要先知道有哪些模塊可用,后續(xù)在學(xué)習(xí)各個框架的表示語法時才不會一頭霧水。
常見深度學(xué)習(xí)模型介紹
首先介紹兩個較著名的模型,包括非時序性的卷積神經(jīng)網(wǎng)絡(luò)(CNN) LeNet-5 [1]以及時序性的遞歸神經(jīng)網(wǎng)絡(luò)(RNN),方便說明模型中常用到的元素與流程,如何用深度學(xué)習(xí)框架來表示。
卷積神經(jīng)網(wǎng)絡(luò)(CNN)
圖一卷積神經(jīng)網(wǎng)絡(luò)(CNN) LeNet-5 [1]
(圖一)為最知名的卷積神經(jīng)網(wǎng)絡(luò)LeNet-5,主要是用來辨識手寫數(shù)字(MNIST數(shù)據(jù)庫),輸入為一張8bit灰階32×32像素的影像,而輸出為十個節(jié)點,分別表示影像為十個數(shù)字的機(jī)率,這個模型幾乎是所有研究深度學(xué)習(xí)的入門起手式。目前先不解釋這個模型為何能學(xué)會辨識圖像,而是單純就模型組成以及表示方法來進(jìn)行說明。
首先,說明卷積特征圖 C1層,C1層上的紅點,是由輸入層(INPUT)紅色框(5×5個像素)乘上5×5的卷積核加總后而得,依序由輸入影像的左至右、上至下共享一個卷積核進(jìn)行卷積,一次移動一個像素(Stride=1),如此即可產(chǎn)生一張?zhí)卣鲌D,而C1層共享了六組卷積核,因此產(chǎn)生六張28×28像素的特征圖。再來將影像進(jìn)行池化,較常見的方式就是把相鄰四點(如圖一綠色框所示)中最大的點當(dāng)成新點,稱為Max Pooling,同時把影像長寬都減為一半,成為S2層。
接下來,對S2層以16組3×3卷積核進(jìn)行卷積,產(chǎn)生C3層,共有16組10×10像素的特征圖。同樣地再對C3層進(jìn)行池化產(chǎn)生S4層,變成16組5×5像素的特征圖,最后再以16組5×5卷積核把S4層的16個特征圖卷積變成16個輸入點,再以傳統(tǒng)全鏈接神經(jīng)網(wǎng)絡(luò)進(jìn)行鏈接。C5層就是以16個輸入點和隱藏層120點進(jìn)行全連結(jié),并依指定的激活函數(shù)將輸出傳到下一層,接下來再和下一組隱藏層F6的84點進(jìn)行全連結(jié),最后再和輸出層(OUTPUT)的十個輸出點進(jìn)行全連結(jié),并正規(guī)化輸出得到各輸出的機(jī)率,即完成整個LeNet-5模型(網(wǎng)絡(luò))結(jié)構(gòu)。
綜合上述內(nèi)容可得知一個基本的卷積神經(jīng)網(wǎng)絡(luò)會有輸入層、卷積層、池化層、全連結(jié)層及輸出層。卷積層要定義卷積核大小、移動距離、輸出特征圖數(shù)量。而池化層同樣需要定義核的大。ㄒ话闶2×2)、移動距離(一般是2)及池化方式(可以是取最大值或平均值)。全連結(jié)層部份則需要定義節(jié)點數(shù)量及激活函數(shù)類型(如:reLu、sigmoid等),最后輸出層除了要定義正規(guī)化機(jī)率值(如:Softmax)外,還要定義損失函數(shù)以作為訓(xùn)練模型用。
前面提到的卷積神經(jīng)網(wǎng)絡(luò)CNN是一種前饋(Forward)的單向網(wǎng)絡(luò),其輸出結(jié)果不會影響輸入,但如果遇到如語音、翻譯、視頻這類時序問題時,CNN就搞不定了,此時就該輪到遞歸神經(jīng)網(wǎng)絡(luò)(RNN)登場了。
遞歸神經(jīng)網(wǎng)絡(luò)(RNN)
圖二 遞歸神經(jīng)網(wǎng)絡(luò)(RNN)及型態(tài)
(圖二)左圖所示就是RNN最基本入門的模型,把此次輸出的結(jié)果經(jīng)過加權(quán)后,再和下一次的輸入一起計算出下一次的輸出,以串起輸入數(shù)據(jù)的時序關(guān)連。從展開圖可更清楚看出其關(guān)連,當(dāng)前輸出(ot)是由目前狀態(tài)(st)乘上權(quán)重(U)加上前一狀態(tài)(st-1)輸出乘上權(quán)重(W)后,經(jīng)過雙曲正切(tanh)函數(shù)并乘上輸出權(quán)重(V),最后取Softmax算式得出,依此類推可展開成任意級數(shù)的網(wǎng)絡(luò)。
(圖二)右圖所示,RNN可以有很多種輸出型態(tài),一對一就等于單純的前饋網(wǎng)絡(luò)沒有時序關(guān)系,另外也可以一對多、多對一、多對多等不同的輸出方式,應(yīng)用于時序性內(nèi)容分類,例如語句情緒意圖、音樂曲風(fēng)、視頻動作分析、影像加注標(biāo)題等,或是型態(tài)移轉(zhuǎn)(Style Transfer),例如語言翻譯、文章音樂創(chuàng)作等。
對RNN而言,需要定義展開的級數(shù)、隱含層(或稱為狀態(tài)S)到隱含層權(quán)重矩陣(W)、輸入層到隱含層權(quán)重(U)、隱含層到輸出層權(quán)重(V)、激活函數(shù)(例如:tanh等)類型,以及輸出層機(jī)率正規(guī)化方式(例如:Softmax等)。
常見深度學(xué)習(xí)框架及選用考慮
圖三 常見深度學(xué)習(xí)框架
許多人準(zhǔn)備開始進(jìn)入深度學(xué)習(xí)世界時,最常問的問題就是到底要挑選哪一種框架來入門?有如(圖三) 、(表格一)所示,從最大的開源社群Github上,就可找到二十種星星數(shù)超過一千的深度學(xué)習(xí)框架,包括TensorFlow、Keras、Caffe、PyTorch、CNTK、MXNet、DL4J、Theano、Torch7、Caffe2、Paddle、DSSTNE、tiny-dnn、Chainer、neon、ONNX、BigDL、DyNet、brainstorm、CoreML等,而排名第一名的TensorFlow更有近十萬個星星。由此可知,深度學(xué)習(xí)非常受到大家重視,當(dāng)選擇深度框架時可以從好幾個面向來考慮,以下將會分別介紹。
1. 程序語言
首先是開發(fā)時所使用的程序語言,如果要執(zhí)行「訓(xùn)練」及「推論」效率好些,則可能要用C++。若要上手容易、支持性強(qiáng),則要考慮Python,從(表格一)中可看出有3/4的框架都支援Python。
若習(xí)慣使用Java開發(fā)程序,那大概就只有TensorFlow、DL4J和MXNet可選了。目前有一些框架(如TensorFlow、Caffe等)底層是C++,應(yīng)用層API是用Python,這類框架能取得不錯的開發(fā)及執(zhí)行效率。
若想改善底層效率時,還要考慮依不同硬件,學(xué)會OpenCL或Nvidia的CUDA/cuDNN等平行加速程序?qū)懛ā?/p>
2. 執(zhí)行平臺
再來考慮的是可執(zhí)行的操作系統(tǒng)及硬件(CPU、GPU)平臺,目前大多數(shù)的框架都是在Linux CPU+GPU的環(huán)境下執(zhí)行,部份有支持單機(jī)多CPU(多線程)或多GPU協(xié)同計算以加速運行時間,甚至像TensorFlow、CNTK、DL4J、MXNet等框架還有支持叢集(Cluster)運算。
許多云端服務(wù)商(Google、Amazon、Microsoft等)也是采取這類組合,方便布署開發(fā)好的應(yīng)用程序。另外也有些非主流的框架(如:tiny-dnn)只支持CPU而不支持GPU,這類框架的好處就是移植性較強(qiáng),但工作效率很差,較適合小型系統(tǒng)。
如果是用Windows的人,英特爾(Intel)及微軟(Microsoft)也分別有提供BigDL及CNTK,若使用Mac系統(tǒng)則要考慮使用CoreML。不過最近Google的TensorFlow為了吃下所有的市場,已經(jīng)可以支持Linux、Windows、Mac甚至是Android,因此成為開源排行榜第一名。
3. 模型支持
目前常見的深度學(xué)習(xí)模型包含監(jiān)督型(如CNN)、時序型(如RNN/LSTM)、增強(qiáng)學(xué)習(xí)(如Q-Learning)、轉(zhuǎn)移學(xué)習(xí)、對抗生成(GAN)等,但不是每個框架都能全部支持。
舉例來說:老牌的Caffe適合做監(jiān)督型學(xué)習(xí),但對于時序型學(xué)習(xí)就不太合適,遇到對抗生成模型時就更使不上力。若不清楚那些框架可支持的模型類型,可參考(表格一)的對應(yīng)網(wǎng)址,前往各官網(wǎng)了解使用上的限制。
4. 框架轉(zhuǎn)換
如果遇到需要串接不同平臺或框架時,則要考慮選用具有提供跨框架功能。目前有幾大陣營,像Keras可支持TensorFlow、Theano、MXNet、DL4J、CNTK,而微軟和臉書聯(lián)盟推的ONNX可支持Caffe2、CNTK、PyTorch等,但Google的TensorFlow卻不愿加入該聯(lián)盟。
另外,雖然框架之間可以轉(zhuǎn)換,但不代表轉(zhuǎn)換后的執(zhí)行效率會和直接使用某個框架一樣好,此時只能依實際需求來取舍是否拿彈性換取效能。
5. 社群支援
最后要考慮選用的框架社群是否活躍,是否很久沒有維護(hù)(升級),甚至被預(yù)告即將淘汰,像Theano雖然功能強(qiáng)大也有很多人在用,但目前確定已不再更新版本,因此建議不要再跳坑了。另外對于英文不好的朋友,選用框架的社群討論區(qū)、文字教程、操作視頻等是否有中文支持也是很重要的,以免遇到問題不知向誰求救。
表格一 深度學(xué)習(xí)框架比較表
總結(jié)
對于新手來說,目前用Python+Keras+TensorFlow是最多人的選擇,網(wǎng)絡(luò)上也可取得最多資源(包含中文),可支持的操作系統(tǒng)、硬件平臺、模型以及數(shù)學(xué)函式庫也是最豐富的。特色是彈性大,相對容易開發(fā),也是最容易布署在云端的解決方案。
但這樣的組合并非完全沒有缺點,例如CNTK的執(zhí)行效率相較于MXNet略差,而Python需占用較多內(nèi)存,不利于布署在本地端(或嵌入式系統(tǒng))進(jìn)行邊緣計算,因此如何選擇合適的框架,有賴于大家多花點心思了。
作者:許哲豪

請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
推薦專題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 4 “AI寒武紀(jì)”爆發(fā)至今,五類新物種登上歷史舞臺
- 5 國產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計算迎來商業(yè)化突破,但落地仍需時間
- 7 東陽光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開成長空間
- 8 地平線自動駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機(jī)器人東風(fēng)翻身?