深度学习编程框架
深度學(xué)習(xí)編程框架
王秉睿, 蘭慧盈, 陳云霽
中國科學(xué)技術(shù)大學(xué),安徽 合肥 230026
中國科學(xué)院計算技術(shù)研究所,北京 100190
中國科學(xué)院大學(xué),北京 100049
摘要:近年來,深度學(xué)習(xí)算法日益流行,在各種領(lǐng)域的應(yīng)用都取得了出色的效果,受到工業(yè)界和學(xué)術(shù)界的廣泛關(guān)注。越來越多的研究者開始利用深度學(xué)習(xí)算法解決實際問題(如圖像分類、圖像識別、語音識別、自然語言處理等)。人們提出了各種各樣的深度學(xué)習(xí)編程框架,便于研究者們開發(fā)新的深度學(xué)習(xí)算法。這些深度學(xué)習(xí)庫的設(shè)計原則、抽象層次各有不同。對常見的深度學(xué)習(xí)編程框架進行了分類介紹,針對深度學(xué)習(xí)編程框架設(shè)計中的關(guān)鍵問題進行了分析,并且對未來深度學(xué)習(xí)編程框架的發(fā)展方向做了展望,為以后深度學(xué)習(xí)編程框架的設(shè)計提供了設(shè)計思路和方向。
關(guān)鍵詞:機器學(xué)習(xí);編程框架;大數(shù)據(jù)
論文引用格式:
王秉睿, 蘭慧盈, 陳云霽[J]. 深度學(xué)習(xí)編程框架. 大數(shù)據(jù), 2018, 4(4): 56-63.
WANG B?R, LAN H?Y, CHEN Y?J. Programming frameworks for deep learning algorithms[J]. Big Data Research, 2018, 4(4): 56-63.
1 引言
機器學(xué)習(xí)是一類研究通過計算機模擬人類學(xué)習(xí)行為,從而解決實際問題的學(xué)科。機器學(xué)習(xí)算法涉及多學(xué)科,如概率論、統(tǒng)計學(xué)、逼近論、凸分析等。傳統(tǒng)的機器學(xué)習(xí)算法包括k近鄰(k-nearest neighbor, k-NN)分類 、k均值(k-means)聚類算法 、支持向量機(support vector machine,SVM)、決策樹(decision tree)等。最近,機器學(xué)習(xí)中的一個子類— —深度學(xué)習(xí),在圖像處理、語音處理等多個領(lǐng)域上都取得了長足的進步。深度學(xué)習(xí)的快速發(fā)展得益于兩點,首先是硬件計算設(shè)備性能的提升,比如圖形處理器(graphics processing unit,GPU)的廣泛應(yīng)用,其次是大規(guī)模數(shù)據(jù)集的構(gòu)建,大量的訓(xùn)練數(shù)據(jù)減輕了過擬合的問題,使得訓(xùn)練復(fù)雜的模型成為可能。深度學(xué)習(xí)算法的結(jié)構(gòu)通常非常復(fù)雜,包含上百兆的可訓(xùn)練參數(shù)。比如2016年由He K等人提出的ResNet網(wǎng)絡(luò),最大的一種模型包含了上千層。
由于算法的復(fù)雜性,構(gòu)建算法的計算過程需要耗費大量的時間。值得慶幸的是,深度學(xué)習(xí)算法的復(fù)雜網(wǎng)絡(luò)結(jié)構(gòu)是由有限的基本算子通過各種復(fù)雜連接關(guān)系搭建起來的,常用的算子包括卷積、池化、全連接等。因此,可以提取出機器學(xué)習(xí)算法中共性的部分,將其抽象出來,便于反復(fù)調(diào)用。用于機器學(xué)習(xí)算法的編程庫層出不窮,各有特色。比如,Google公司提出的Tensorflow,是一款基于數(shù)據(jù)流圖的深度學(xué)習(xí)庫,支持多種計算設(shè)備(CPU、GPU 、張量處理單元(tensor processing unit,TPU)),同時還可以直接運行在包含多種計算設(shè)備的分布式結(jié)構(gòu)上。除了深度學(xué)習(xí)算法庫,還有針對傳統(tǒng)機器學(xué)習(xí)算法的庫。比如 , Scikit-Learn 用Python語言作為接口,提供大量的機器學(xué)習(xí)算法,包括有監(jiān)督學(xué)習(xí)算法、無監(jiān)督學(xué)習(xí)算法、數(shù)據(jù)降維算法、圖像預(yù)處理算法等。
現(xiàn)有的深度學(xué)習(xí)庫主要面臨兩個方面的挑戰(zhàn)。一是對更多的計算設(shè)備的支持,尤其是對機器學(xué)習(xí)加速器的支持。目前,多數(shù)深度學(xué)習(xí)庫支持的設(shè)備是CPU和GPU (如MXNet、Caffe),一些深度學(xué)習(xí)庫僅支持CPU(如Scikit-Learn),只有很少的一部分深度學(xué)習(xí)庫可以支持深度學(xué)習(xí)加速器,如TensorFlow可以支持TPU。但是,這種支持還是有局限性的,其他的加速器要集成到TensorFlow中會非常困難,同時, TPU也無法被其他編程庫利用。另一個挑戰(zhàn)是機器學(xué)習(xí)庫的模塊化。現(xiàn)在的機器學(xué)習(xí)庫所有模塊之間耦合緊密,不利于代碼的重用。開發(fā)者如果想構(gòu)建一個新的機器學(xué)習(xí)庫,很難利用現(xiàn)有庫的模塊進行開發(fā)。
2 機器學(xué)習(xí)算法
2.1 經(jīng)典機器學(xué)習(xí)算法
經(jīng)典機器學(xué)習(xí)算法指主要依賴統(tǒng)計方法的機器學(xué)習(xí)算法。和深度學(xué)習(xí)算法相比,這類機器學(xué)習(xí)算法的模型較為簡單,在小數(shù)據(jù)集上可以達到很好的預(yù)測效果,但是對于大數(shù)據(jù)集,如ImageNet,預(yù)測能力不足。表1列舉了常見的經(jīng)典機器學(xué)習(xí)算法以及它們可以完成的機器學(xué)習(xí)任務(wù)。
2.2 深度學(xué)習(xí)算法
深度學(xué)習(xí)算法是機器學(xué)習(xí)算法中的一類,近年來,隨著計算設(shè)備的計算能力的增強以及大規(guī)模數(shù)據(jù)集的建立,神經(jīng)網(wǎng)絡(luò)算法開始從單層逐漸發(fā)展到多層,到現(xiàn)在,一個神經(jīng)網(wǎng)絡(luò)可能包含上百層以及上百兆的可訓(xùn)練參數(shù)。深度神經(jīng)網(wǎng)絡(luò)模型主要有:卷積神經(jīng)網(wǎng)絡(luò)以及遞歸神經(jīng)網(wǎng)絡(luò)。卷積神經(jīng)網(wǎng)絡(luò)是近年來迅速發(fā)展起來,并獲得了廣泛關(guān)注的一種前饋人工神經(jīng)網(wǎng)絡(luò)算法。它在大規(guī)模的圖像識別任務(wù)上取得了出色的識別率。2012年提出的AlexNet取得了ImageNet2012圖像分類任務(wù)比賽的第一名,Top 5的識別錯誤率低至15.3%。之后的幾年,這一錯誤率不斷被新提出的CNN刷新,2014年提出的VGGNet取得了89.3%的平均正確率, 2016年He K等人提出的ResNet,又將分類錯誤率降低到3.57%。通常,卷積神經(jīng)網(wǎng)絡(luò)是由很多層構(gòu)成的,常見的層包括卷積層、池化層、激活層、全連接層。卷積神經(jīng)網(wǎng)絡(luò)非常善于處理圖像數(shù)據(jù),通過卷積層,可以提取出各種圖像特征,經(jīng)過多次卷積處理后,可以提取出比較抽象的圖像特征,這些高級的抽象特征則作為分類器(全連接層)的輸入,用于圖像的分類。 遞歸神經(jīng)網(wǎng)絡(luò)是一類用于處理序列數(shù)據(jù)的神經(jīng)網(wǎng)絡(luò),可以展現(xiàn)輸入數(shù)據(jù)在時序上的行為。不同于前饋神經(jīng)網(wǎng)絡(luò)的是, RNN可以利用其內(nèi)部的記憶來處理任意時序的輸入序列,更容易處理輸入數(shù)據(jù)長度不定的情況,比如手寫識別、語音識別等。
3 ?深度學(xué)習(xí)編程框架
為了幫助深度學(xué)習(xí)開發(fā)者更加快速、方便地開發(fā)深度學(xué)習(xí)算法,各種針對深度學(xué)習(xí)算法開發(fā)的編程庫被提出。圖1展示了一般的深度學(xué)習(xí)編程庫的層次。最上層是編程庫提供的編程接口,程序員通過調(diào)用編程接口來描述算法的計算過程。對于開發(fā)者來說,編程接口的易用性以及接口的表達能力非常重要,對算法的描述會映射到計算圖上,對計算圖進行優(yōu)化和調(diào)度后,圖中的每一個算子會調(diào)用硬件的編程接口,如Nvidia廠商發(fā)布的、在其GPU設(shè)備上處理深度學(xué)習(xí)算法的高性能庫—— cuDNN。最后,這些硬件調(diào)用接口(高性能庫)再進一步生成硬件指令,以在硬件設(shè)備上運行。比如,在TensorFlow和MXNet中,它們的編程接口是基于圖的,源文件是一個Python文件。而Caffe基于層的框架采用了自定義的prototxt文件構(gòu)建神經(jīng)網(wǎng)絡(luò)。
圖1 深度學(xué)習(xí)編程框架結(jié)構(gòu)抽象層次
深度學(xué)習(xí)庫的編程接口主要可以分為3類:一類是基于數(shù)據(jù)流圖的編程接口,流行的基于數(shù)據(jù)流圖的機器學(xué)習(xí)編程框架包括Tensorflow、MXNet、Theano、Torch7等;另一類是基于層的編程接口,如Caffe;還有一類是基于算法的編程接口,主要用于傳統(tǒng)機器學(xué)習(xí)算法的實現(xiàn),如Scikit-Learn。
3.1 基于數(shù)據(jù)流圖的編程框架
基于數(shù)據(jù)流圖(data flow graph)的機器學(xué)習(xí)編程框架利用節(jié)點(node)和邊(edge)構(gòu)造的有向圖來描述計算過程。節(jié)點可以表示一個運算操作,或者表示一塊數(shù)據(jù)的輸入起點或者輸出終點,邊則表示節(jié)點之間的輸入/輸出關(guān)系。數(shù)據(jù)被表示為多維數(shù)組(張量)的形式,可以在這些邊上進行傳輸。通過一個節(jié)點時,數(shù)據(jù)就會作為該節(jié)點運算操作的輸入被計算,計算的結(jié)果則順著該節(jié)點的輸出邊流向后面的節(jié)點。一旦輸入端的所有數(shù)據(jù)準(zhǔn)備好,節(jié)點將被分配到各種計算設(shè)備,完成異步并行的執(zhí)行運算。下面介紹4種流行的基于數(shù)據(jù)流圖的機器學(xué)習(xí)庫。
Theano是一個用Python語言寫成的基于圖的機器學(xué)習(xí)庫。用戶可以定義、優(yōu)化和評估數(shù)學(xué)表達式,尤其是包含多維數(shù)組的表達式,多維數(shù)組是機器學(xué)習(xí)算法中最常用的一種數(shù)據(jù)結(jié)構(gòu)。當(dāng)數(shù)據(jù)量很大的時候,使用Theano可以獲得與手工優(yōu)化的C代碼相媲美的運行速度。Theano也支持跨平臺執(zhí)行,在GPU上,可以獲得超過CPU幾個數(shù)量級的運行速度。Theano將計 算機代數(shù)系統(tǒng)(computer algebra system,CAS)的各個方面與優(yōu)化編譯器的各個方面結(jié)合起來。它還可以為許多數(shù)學(xué)運算生成定制的C代碼。CAS與優(yōu)化編譯的結(jié)合,對于復(fù)雜的數(shù)學(xué)表達式被反復(fù)計算且計算速度很關(guān)鍵的任務(wù)來說特別有用。
Tensorflow是Google公司開發(fā)的一種基于數(shù)據(jù)流圖的機器學(xué)習(xí)編程框架。它具有編程靈活、支持跨平臺運行的特點。程序員只需要修改很少量的代碼,就可以將在CPU上執(zhí)行的Tensorflow移植到GPU平臺上進行運算。同時,Tensorflow還可以支持自動異構(gòu)分布式計算,它的模型能夠運行在不同的分布式系統(tǒng)上,系統(tǒng)可以包括多個GPU、CPU、手機節(jié)點等。
MXNet也是一個基于計算圖模型的機器學(xué)習(xí)編程庫,類似Theano和TensorFlow。它同樣可以支持多GPU配置。MXNet包含了類似L asagne 和Blocks更高級別的模型構(gòu)建塊,并且可以在常見的硬件設(shè)備上運行(包括手機、服務(wù)器等)。除了支持Python的編程接口外,MXNet還提供了對 R、J ulia、C++、S cala、Matlab和J avaScript 的編程接口。
Torch是一款用于科學(xué)計算的編程框架,為機器學(xué)習(xí)算法提供了充分的支持。Torch7采用數(shù)據(jù)流圖的編程方法,便于構(gòu)建計算模型。它采用L ua語言作為接口,主要原因是Lua和C/C++語言之間的調(diào)用接口友好,開銷小,可以更好地支持內(nèi)嵌C UDA-C優(yōu)化代碼。
3.2 基于層的編程框架
基于層的編程框架為用戶提供一組表示各種層(比如卷積層、池化層、全連接層等)的函數(shù)作為接口。用戶通過反復(fù)調(diào)用這些層的函數(shù)接口構(gòu)成網(wǎng)絡(luò)。通過將計算單位限制到層上,庫的開發(fā)者們可以對各種層進行充分的性能優(yōu)化,因此可以提供更好的運行效率。Caffe是一種常用的卷積神經(jīng)網(wǎng)絡(luò)框架,它采用層的調(diào)用方式,用一個p rototxt文件對每一個層進行定義和配置,之后程序分析這個文件,獲得這個網(wǎng)絡(luò)結(jié)構(gòu)的信息。
3.3 基于算法的編程框架
基于算法的編程庫提供了大量的機器學(xué)習(xí)算法,涵蓋各種任務(wù)和算法。和前兩種框架不同,基于算法的編程庫不需要構(gòu)建復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu),只需要通過設(shè)置庫里面提供的算法函數(shù)接口中的參數(shù)即可完成任務(wù)。比如Scikit-Learn機器學(xué)習(xí)庫,它是一種基于Python語言的機器學(xué)習(xí)庫,提供了數(shù)據(jù)分析和數(shù)據(jù)挖掘中針對各種任務(wù)(包括分類、聚類、數(shù)據(jù)降維、模型選擇、預(yù)處理等)的算法,提供了各種不同類別(如k-NN、k-means)的決策樹(如C4.5、ID3等)的算法接口,開發(fā)者只需要設(shè)置接口中的參數(shù),并且將數(shù)據(jù)傳入,就可以得到訓(xùn)練和預(yù)測的結(jié)果。
3.4 深度學(xué)習(xí)編程框架中的關(guān)鍵問題
本節(jié)將針對3個深度學(xué)習(xí)編程框架中的問題進行分析。
(1)添加新算子
深度學(xué)習(xí)算法是由不同的算子構(gòu)成的,在實現(xiàn)一個新算法的時候,有兩種實現(xiàn)方式。首先可以利用深度學(xué)習(xí)框架中已經(jīng)有的基本算子(如矩陣計算(矩陣乘法、矩陣轉(zhuǎn)置等)、代數(shù)計算(包括標(biāo)量數(shù)據(jù)的加減乘除))實現(xiàn)一個新算子。這種處理方法的劣勢在于,由于一個算法中包含的算子非常多,算子的調(diào)度開銷會增大。同時每一個算子都需要調(diào)用一次硬件設(shè)備,而調(diào)用硬件設(shè)備需要一定的啟動開銷,算子越多,整體啟動開銷越大,導(dǎo)致運行效率低下。因此,通常采用另一種更加高效的實現(xiàn)方式,即添加一個新的算子,算子內(nèi)部是通過直接調(diào)用下一層的硬件調(diào)用接口實現(xiàn)的,以此節(jié)省算子的調(diào)度開銷。深度學(xué)習(xí)算法的發(fā)展非常迅速,這使得添加新算子成為一種常見任務(wù)。如何方便地添加新算子成為深度學(xué)習(xí)框架需要研究的一個重要問題。
(2)資源映射策略
神經(jīng)網(wǎng)絡(luò)中很多算子的計算規(guī)模很大,需要較多的計算資源和內(nèi)存資源。這可能超過了硬件能夠提供的資源,因此需要深度學(xué)習(xí)框架對硬件上的計算資源和內(nèi)存資源進行調(diào)配,通過將一個操作拆分成更小的子操作,使得硬件的資源可以支持該操作。此外,不同的算子對資源的需求也是不平衡的。這種不平衡使資源的映射和分配變得更加困難。
(3)分布式執(zhí)行
現(xiàn)在神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)規(guī)模越來越大,一些研究人員開始使用包含多種計算設(shè)備的集群(cluster)來執(zhí)行。分布式執(zhí)行面臨的多種困難(如不同算子之間的同步、算子和設(shè)備之間的映射、算子到設(shè)備上的分配等)也是深度學(xué)習(xí)架構(gòu)需要解決的,尤其是針對訓(xùn)練算法的分布式計算。
?
4 ?未來研究方向
本文對現(xiàn)有的常用機器學(xué)習(xí)庫進行了介紹和分析。隨著機器學(xué)習(xí)領(lǐng)域的發(fā)展,新的需求逐漸被提出,現(xiàn)有的機器學(xué)習(xí)庫要兼容這些新的需求,需要進行進一步的改善。未來,對機器學(xué)習(xí)庫的研究可從以下發(fā)展方向展開。
4.1 多樣化計算設(shè)備支持
機器學(xué)習(xí)算法的發(fā)展越來越快,尤其是在各種實際情景中,機器學(xué)習(xí)的應(yīng)用場景日益增多。人們逐漸發(fā)現(xiàn),傳統(tǒng)的計算設(shè)備已經(jīng)無法支持機器學(xué)習(xí)的計算需求。比如,在手機上,許多應(yīng)用都需要用到人臉識別技術(shù)、語音識別技術(shù)。然而,雖然使用深度學(xué)習(xí)算法進行人臉識別、語音識別任務(wù)效果較好,但是計算量巨大,手機的計算資源有限,無法支持這樣大規(guī)模的計算任務(wù)。在這樣的情況下,研究人員提出了專門針對機器學(xué)習(xí)算法的加速器,利用機器學(xué)習(xí)算法中大量的數(shù)據(jù)重用,有效降低了功耗,提高了計算性能。機器學(xué)習(xí)加速器雖然有巨大的計算潛力,但是由于缺乏合適的編程框架,機器學(xué)習(xí)開發(fā)者實際上很難在機器學(xué)習(xí)加速器上進行開發(fā)。因此,機器學(xué)習(xí)庫除了需要支持CPU、GPU之外,還需要進一步支持機器學(xué)習(xí)加速器,尤其是對跨平臺(多加速器)的支持。現(xiàn)在,雖然有一些加速器可以被集成到框架中,如TensorFlow可以支持同是Google公司研發(fā)的TPU,但是,其他加速器要想集成到TensorFlow中則非常困難。
4.2 模塊化系統(tǒng)定制
模塊化是機器學(xué)習(xí)庫發(fā)展的另一個方向。一個機器學(xué)習(xí)庫一般由幾個層次構(gòu)成,各層次都是非模塊化的,與自己的系統(tǒng)是緊耦合的,開發(fā)者如果想要定制自己的機器學(xué)習(xí)系統(tǒng),很難復(fù)用現(xiàn)有庫中的模塊,這導(dǎo)致本來可以重用的模塊還需要重新實現(xiàn)一次。現(xiàn)在,已經(jīng)有一些開發(fā)者提出針對機器學(xué)習(xí)算法的中 間語言(intermediate representation,IR)以及相應(yīng)的編譯器,如由Chen T等人提出的T VM,是一個針對深度學(xué)習(xí)的編譯軟件棧,其中用到的N NVM,就是一個開放的模塊化的計算圖的中間語言。
?
5 ?結(jié)束語
機器學(xué)習(xí)算法已經(jīng)被學(xué)術(shù)界和工業(yè)界廣泛接受,成為一種實用有效的算法,應(yīng)用在了很多任務(wù)上,如圖像識別、圖像分類等。本文首先介紹了常用的機器學(xué)習(xí)算法,包括經(jīng)典的基于統(tǒng)計學(xué)的機器學(xué)習(xí)算法以及深度學(xué)習(xí)算法(如CNN、RNN/LSTM)。由于機器學(xué)習(xí)算法編程的復(fù)雜性,人們提出了各種深度學(xué)習(xí)編程框架,從而為深度學(xué)習(xí)算法的開發(fā)提供便利。本文主要介紹了3類深度學(xué)習(xí)開發(fā)庫:基于數(shù)據(jù)流圖的編程庫、基于層的編程庫以及基于算法的編程庫。
《大數(shù)據(jù)》期刊
《大數(shù)據(jù)(Big?Data?Research,BDR)》雙月刊是由中華人民共和國工業(yè)和信息化部主管,人民郵電出版社主辦,中國計算機學(xué)會大數(shù)據(jù)專家委員會學(xué)術(shù)指導(dǎo),北京信通傳媒有限責(zé)任公司出版的科技期刊。
關(guān)注《大數(shù)據(jù)》期刊微信公眾號,獲取更多內(nèi)容
總結(jié)
- 上一篇: 【2017年第3期】开放政府环境下医药公
- 下一篇: 【CyberSecurityLearni