郭敏鋼,宮 鶴
1.吉林農(nóng)業(yè)大學 信息技術學院,長春130118
2.吉林農(nóng)業(yè)大學 吉林省智能環(huán)境工程研究中心,長春130118
3.吉林農(nóng)業(yè)大學 吉林省農(nóng)業(yè)物聯(lián)網(wǎng)科技協(xié)同創(chuàng)新中心,長春130118
隨著深度學習[1]的不斷發(fā)展,目前的機器學習框架也是層出疊見,例如:Tensorflow[2]、Theano、Keras、Caffe、Torch、DeepLearning4J 等等。首選Tensorflow 作為研究機器學習框架的原因,是其在對比同類機器學習框架的可用性、靈活性、效率、支持等方面都有著優(yōu)異的表現(xiàn)。
卷積神經(jīng)網(wǎng)絡[3-5]作為一種廣泛的深度學習方法,在Google 研發(fā)的Alphago[6]以及圖像分類、視頻及聲音識別[7]、目標檢測[8-9]、醫(yī)學研究[10]等方面都取得了顯著的效果和極高的效率。
卷積神經(jīng)網(wǎng)絡的優(yōu)秀性能表現(xiàn)不僅需要像Tensorflow這樣的良好的深度學習框架支撐,還要依賴較為出色的計算設備支撐。隨著深度學習的不斷發(fā)展,卷積神經(jīng)網(wǎng)絡計算模型的復雜度也隨之增加,使得模型訓練的難度及耗時呈指數(shù)倍增長,單CPU 或單GPU 設備甚至已經(jīng)無法解決復雜網(wǎng)絡模型的訓練耗時問題。為此,本文提出了一種異構(gòu)式CPU+GPU的協(xié)同計算模型,根據(jù)CPU邏輯運算強及GPU 費邏輯運算強的特點,將網(wǎng)絡模型計算任務按模塊分配到CPU 與GPU 設備上運行,通過耗時對比分析得出異構(gòu)式CPU+GPU[11-12]的協(xié)同計算模型要明顯優(yōu)于單CPU或單GPU計算模型。有效地提高了卷積神經(jīng)網(wǎng)絡的訓練速度。
激活函數(shù)在卷積神經(jīng)網(wǎng)絡中扮演著重要的角色,其作用是將神經(jīng)元的輸入映射到輸出端,常見的激活函數(shù)包括Sigmoid、TanHyperbolic(Tanh)、ReLU、PReLU、Softplus、ELU、Softsign、Swish等。其中,早期的Sigmoid激活函數(shù)、TanHyperbolic(Tanh)激活函數(shù)、Softsign激活函數(shù)均為S型非線性飽和函數(shù),在模型訓練中極易造成梯度消失現(xiàn)象。Krizhevsky 等人[4]提出的ReLU 激活函數(shù)由于在正向區(qū)間為線性函數(shù),加快了模型訓練的收斂速度的同時也解決了Softsign、TanHyperbolic(Tanh)、Softsign 激活函數(shù)的梯度消失問題,但由于ReLU 激活函數(shù)在x <0 時梯度為0,這樣就導致負的梯度在這個ReLU被置零,容易造成“壞死”現(xiàn)象。在此之后,一些研究者相繼提出了ELU、PReLU、Swish等激活函數(shù)用來降低“壞死”現(xiàn)象出現(xiàn)的概率,但與此同時也產(chǎn)生了相應的梯度消失和收斂速度過慢的現(xiàn)象。
本文提出了一種新的激活函數(shù)ReLU-Swish。將ReLU激活函數(shù)和Swish激活函數(shù)的正負x 半軸進行分段組合,使Swish激活函數(shù)x 正半軸成為線性函數(shù)。在CIFAR-10 和MNIST 數(shù)據(jù)集上的實驗結(jié)果表明,ReLUSwish激活函數(shù)的準確率及收斂速度上相比Swish激活函數(shù)[13]表現(xiàn)更優(yōu)秀,有效地緩解了“壞死”現(xiàn)象以及收斂速度過慢的問題,起到了優(yōu)化卷積神經(jīng)網(wǎng)絡的作用。
Tensorflow 基本系統(tǒng)架構(gòu)如圖1 所示,自下而上分別為設備管理和通信層、API 接口、計算圖層、應用層。通信層主要負責設備管理及通訊管理,主要負責卷積神經(jīng)網(wǎng)絡中算法的計算和操作,可以實現(xiàn)CPU 與GPU 異構(gòu)的特性,并依賴gRPC協(xié)議實現(xiàn)設備間的數(shù)據(jù)更新及傳輸;API 接口是對Tensorflow 各功能模塊的接口進行封裝,使其他平臺便于調(diào)用;計算圖層用于構(gòu)建分布式子圖,切割計算任務分別運行在不同的設備(CPU、GPU)上;應用層通過API接口調(diào)用Tensorflow各種功能并且實現(xiàn)相關的設計和應用。
圖1 Tensorflow基本系統(tǒng)架構(gòu)圖
Tnsorflow是谷歌基于DistBelief研發(fā)的第二代人工智能學習系統(tǒng),2017 年2 月,TensorFlow 1.0 版正式發(fā)布,其當年的提交數(shù)目就已超過2.1萬,其中還有部分外部貢獻者。同時,TensorFlow是跨平臺的,它幾乎可以運行在所有平臺上,比如GPU、CPU、移動和嵌入式平臺,甚至是張量處理單元(Tensor Processing Units,TPUs)。首選Tensorflow作為研究機器學習框架的原因,是其在對比同類機器學習框架的諸多方面都有著優(yōu)異的表現(xiàn)。如表1所示為常見常用的4個機器學習開源框架在GitHub上各類屬性的評分及對比。
表1 主流深度學習框架評分
其優(yōu)勢在于以下幾點。
(1)可用性:Tensorflow 相較于MXNet[14]、Caffe[15]、Theano[16]等框架工作流程相對容易,可直接寫Python/C++程序,節(jié)省了大量的編譯時間且能夠更快的測試相應的迭代想法;接口穩(wěn)定,兼容性較好。
(2)靈活性:Tensorflow 可在各種不同類型的設備上運行,不論是嵌入式系統(tǒng)或者是計算機服務器都能夠很好的搭建相關環(huán)境。其分布式架構(gòu)能夠降低大量的計算模型所消耗的時間,并且可以同時使用CPU+GPU進行運算。
(3)開源:深度學習是未來的新技術,并且研究方面是全球性的,Tensorflow 的目的是為了形成一個標準化的工具,同時也是最好用的深度學習工具庫之一,為用戶直接提供了一個更優(yōu)質(zhì)的學習環(huán)境。
隨著計算機科學技術的不斷發(fā)展和進步,眾多先進技術的應用對計算機的計算性能需求也在不斷攀升。近幾年來,雖然計算機硬件技術也在繼續(xù)發(fā)展,例如,Intel、IBM、AMD 等生產(chǎn)的通用CPU,采用多核集成的方式提高芯片計算能力,而非改善處理器主頻率來增強計算機性能的傳統(tǒng)概念。即便如此,很多技術采用了多核CPU 也無法滿足大多數(shù)算力的需求。因此,如何解決突破計算機算力瓶頸這一問題成為了眾多研究學者及生產(chǎn)業(yè)最為關注的問題。
伴隨著GPU 的相關技術架構(gòu)的構(gòu)建被提出,從而使得GPU 在計算機計算性能領域被廣泛推廣及發(fā)展。自1999 年到目前為止,GPU 的運算能力得到了飛躍式的提升,并且已經(jīng)將GPU 的應用范圍不斷的拓展。例如:從圖形領域來看,醫(yī)學家借助GPU可以觀察到更細微的分子;軍事作戰(zhàn)指揮借助GPU 獲得真實度更高的模擬作戰(zhàn)演習環(huán)境;影視劇借助GPU 使得特效更加逼真。近些年來,更多的科學技術研究發(fā)現(xiàn)GPU 由于其硬件結(jié)構(gòu)特點,在大量的高算力浮點吞吐運算環(huán)境中能夠起到非常重要的作用,因此,眾多領域已經(jīng)逐漸開始使用GPU設備作為輔助設備。
隨著深度學習的不斷拓展,卷積神經(jīng)網(wǎng)絡計算模型的復雜度也隨之增加,數(shù)據(jù)計算量伴著卷積神經(jīng)網(wǎng)絡層的增加以及參數(shù)的增多而增大,使得模型訓練的難度及耗時呈指數(shù)倍增長,單CPU 或單GPU 設備甚至已經(jīng)無法解決復雜網(wǎng)絡模型的訓練耗時問題。
另一方面,不少研究人員針對耗時的問題也做了很多的工作,較為常見的方法例如:CPU 串行計算、GPU并行計算。值得肯定的是不論CPU串行計算或是GPU并行計算都能夠有效地解決復雜卷積神經(jīng)網(wǎng)絡耗時較長的問題,但由于單一計算模型主要是將卷積神經(jīng)網(wǎng)絡模型運算任務調(diào)度在CPU 或GPU 設備上進行計算,這樣容易使得部分設備(CPU 或GPU)處于空閑狀態(tài),造成資源浪費,導致性耗比降低。
針對如何能夠使性耗比提升,提出了異構(gòu)式CPU+GPU協(xié)同計算模型如圖2所示,在理論上講CPU與GPU兩者的相同點都有總線、緩存體系、數(shù)字和邏輯運算單元。但CPU 更適合處理邏輯控制密集的計算任務,例如:分布式計算、物理模擬、人工智能等計算步驟相對復雜的任務;而GPU適合處理數(shù)據(jù)密集的計算任務,例如:數(shù)據(jù)分析、數(shù)據(jù)處理、圖像處理等大量吞吐量設計的任務中。另一方面在SIMD Unit(Single Instruction Multiple Data,單指令多數(shù)據(jù)流,同步同指令)GPU性能要遠大于CPU,Threads線程數(shù)方面GPU也遠大于CPU。
圖2 異構(gòu)式CPU+GPU計算模型
在這個模型中,CPU 與GPU 協(xié)同工作,各司其職。CPU 負責進行邏輯性強的事物處理和串行計算,GPU則專注于執(zhí)行高度線程化的并行處理任務。
實驗步驟:編寫Tensorflow模型訓練應用程序,Client組件創(chuàng)建Session會話并通過序列化技術發(fā)送圖定義到Distributed Master組件,Distributed Master會根據(jù)定義好的三種訓練模型(單CPU、單GPU、異構(gòu)式CPU+GPU)參數(shù)進行任務切割,并調(diào)度到指定設備。其中/job:worker/task:0負責模型的訓練和推理;/job:ps/task:0負責模型參數(shù)的存儲和更新,如圖3所示。
圖3 任務切割分配圖
圖4 異構(gòu)式CPU+GPU計算模型與單CPU計算模型測試對比
圖5 異構(gòu)式CPU+GPU計算模型與單GPU計算模型測試對比
三種訓練模型分配方法如下。單CPU:
with tf.device(’/cpu:0’):
w=tf.get_varibale(…)
b=tf.get_varibale(…)
with tf.device(’/cpu:0’):
ad=w+b mu=w*b
單GPU:
with tf.device(’/gpu:0’):
w=tf.get_varibale(…)
b=tf.get_varibale(…)
with tf.device(’/gpu:0’):
ad=w+b
mu=w*b
異構(gòu)式CPU+GPU:
with tf.device(’/cpu:0’):
w=tf.get_varibale(…)
b=tf.get_varibale(…)
with tf.device(’/gpu:0’):
ad=w+b
mu=w*b
實驗測試:選用三臺相同型號及配置的服務器,其中一臺做測試服務器task1,另兩臺做對比測試服務器task2、task3,分別在三臺服務器上定義sever,并且在task1 上制定job_model1(異構(gòu)式CUP+GPU 訓練模型),取兩次測試結(jié)果的平均值做實驗對比,在task2、task3上制定job_model2(單CPU、單GPU訓練模型),并取task2 與task3 測試結(jié)果的平均值做實驗對比,所得結(jié)果如圖4、5 所示。異構(gòu)式CPU+GPU 計算模型兩次對比測試實驗結(jié)果分別為:133.132 362 883 237 8 s、134.860 072 175 262 76 s,而單CPU計算模型測試結(jié)果為:189.031 933 339 740 60 s、189.954 021 626 453 37 s;單GPU計算模型測試實現(xiàn)演過分別為:170.143 887 107 263 25 s、167.609 163 142 034 05 s。測試實驗結(jié)果的平均值如表2所示。
表2 單CPU、單GPU、異構(gòu)式CPU+GPU測試實驗結(jié)果平均值
通過實驗結(jié)果分析可以看出,卷積神經(jīng)網(wǎng)絡訓練模型的準確率幾乎并未改變,而在模型訓練耗時上異構(gòu)式CPU+GPU 模型的時耗明顯低于單CPU 或單GPU 模型。同時由于改變了模型訓練的任務調(diào)度,使CPU 和GPU同時作業(yè),有效地避免了設備閑置問題,從而在性耗比上得到了很好的提升,使卷積神經(jīng)網(wǎng)絡在模型計算上得到了很好的優(yōu)化。
卷積神經(jīng)網(wǎng)絡(Convolutional Neural Network,CNN)通俗講是卷積結(jié)構(gòu)的深度神經(jīng)網(wǎng)絡,并且也是一種結(jié)構(gòu)層級較多的監(jiān)督型學習的神經(jīng)網(wǎng)絡。在圖像分類、目標檢測、聲音識別等方面表現(xiàn)出了極高的效率,幾乎接近人類所能達到的認知標準和抽象的表達。卷積神經(jīng)網(wǎng)絡雖然結(jié)構(gòu)層級較多,但其占用的內(nèi)存較少,網(wǎng)絡參數(shù)的個數(shù)也相對其他神經(jīng)網(wǎng)絡相對較少,這樣便極大的緩解了神經(jīng)網(wǎng)絡中過擬合的問題。
2012年,Krizhevsky等[4]提出的深度卷積神經(jīng)網(wǎng)絡,總共包含8 層,其中有5 個卷積層和3 個全連接層,有60 M 個參數(shù),神經(jīng)元個數(shù)為650 k,分類數(shù)目為1 000,LRN層出現(xiàn)在第一個和第二個卷積層后面,最大池化層出現(xiàn)在兩個LRN 層及最后一個卷積層后。AlexNet 卷積神經(jīng)網(wǎng)絡極大地減少了模型訓練時間,并使用線性ReLU激活函數(shù)加快訓練速度。
不論是傳統(tǒng)的神經(jīng)網(wǎng)絡模型還是當下熱門的深度學習,激活函數(shù)與神經(jīng)網(wǎng)絡都密不可分,其作用是將神經(jīng)元的輸入映射到輸出端。神經(jīng)網(wǎng)絡中的每個神經(jīng)元節(jié)點接受上一層神經(jīng)元的輸出值作為原神經(jīng)元的輸入值,并將輸入值傳遞給下一層,輸入層神經(jīng)元節(jié)點將輸入屬性值直接傳遞給下一層(隱藏層或輸出層)。在上層節(jié)點的輸出和下層節(jié)點的輸入之間具有一個函數(shù)關系,這個函數(shù)稱為激活函數(shù)(又稱激勵函數(shù))。常見的激活函數(shù)包括Sigmoid、TanHyperbolic(Tanh)、ReLU、PReLU、Softplus、ELU、Softsign、Swish等。
4.2.1 ReLU激活函數(shù)
線性整流函數(shù)(Rectified Linear Unit,ReLU)[17-18],又稱修正線性單元,如圖6所示。
圖6 ReLU激活函數(shù)
ReLU激活函數(shù)的優(yōu)點:
(1)解決了在正區(qū)間梯度消失問題。
(2)計算速度非???,只需要判斷輸入是否大于0,收斂速度遠快于Sigmoid 和Tanh(Sigmoid 和Tanh 的梯度在飽和區(qū)域變大非常平緩,接近于0,這就容易造成梯度消失,減緩收斂速度。而ReLU 的梯度是一個常數(shù),有助于解決深度網(wǎng)絡的收斂問題)。
ReLU函數(shù)的缺點:
壞死,ReLU 強制的稀疏處理會減少模型的有效容量(即特征屏蔽太多,導致模型無法學習到有效特征)。由于ReLU在x <0 時梯度為0,這樣就導致負的梯度在這個ReLU被置零,而且這個神經(jīng)元有可能再也不會被任何數(shù)據(jù)激活。
4.2.2 PReLU激活函數(shù)
PReLU(Parametric Rectified Linear Unit)如圖7所示,顧名思義為帶參數(shù)的ReLU。
圖7 PReLU激活函數(shù)
如果ai=0,那么PReLU退化為ReLU。
PReLU函數(shù)的優(yōu)點:
相比ReLU 激活函數(shù)PReLU 激活函數(shù)只增加了極少量的參數(shù),也就意味著網(wǎng)絡的計算量以及過擬合的危險性都只增加了一點點。特別的,當不同channels使用相同的ai時,參數(shù)就更少了。
在文獻[19]中,對比了PReLUu 激活函數(shù)和ReLU激活函數(shù)在ImageNet model A 的訓練效果,如8 所示,相對ReLU激活函數(shù)極大的降低了錯誤率。
PReLU激活函數(shù)的缺點:
PReLU激活函數(shù)雖然有負值存在,但是不能確保是一個噪聲穩(wěn)定的去激活狀態(tài)。
圖8 PReLU與ReLU激活函數(shù)對比
4.2.3 ELU激活函數(shù)
指數(shù)線性單元(Exponential Linear Unit,ELU)[20]如圖9所示。
圖9 ELU激活函數(shù)
ELU激活函數(shù)函數(shù)的優(yōu)點:
(1)ELU由于其正值特性,可以像ReLU激活函數(shù),PReLU激活函數(shù)一樣緩解梯度消失問題,如圖10所示。
圖10 ReLU、ELU、PReLU激活函數(shù)
(2)相比ReLU 激活函數(shù),ELU 與PReLU 一樣存在負值,可以將激活單元的輸出均值往0 推近,減少了計算量(輸出均值接近0可以減少偏移效應進而使梯度接近于自然梯度)。
(3)相比PReLU激活函數(shù),ELU在有負值存在的時候是一個指數(shù)函數(shù),對于輸入來說只定性不定量。
ElU激活函數(shù)函數(shù)的缺點:
雖然相對ReLU 激活函數(shù)降低了壞死率,在x <0時梯度不為0,保證了部分神經(jīng)元仍然能夠被激活,但與PReLU激活函數(shù)相似,網(wǎng)絡的計算量以及過擬合的危險仍然很大。
4.2.4 Swish激活函數(shù)
Swish 也被稱為self-gated(自門控)激活函數(shù)如圖11 所示,由谷歌研究人員發(fā)布。Swish 的數(shù)學表達為:
圖11 Swish激活函數(shù)
Swish 函數(shù)的優(yōu)點:自門控的優(yōu)勢是它僅需要一個簡單的標量輸入,而正常的門控需要多個標量輸入。Swish激活函數(shù)的表現(xiàn)比ReLU更好,原因在于Swish激活函數(shù)在x 軸的負區(qū)域內(nèi)末端的圖像形狀與ReLU、PReLU、ELU 激活函數(shù)是不同的,如圖12 所示,這是因為swich 激活函數(shù)即使輸入的值在增加,它的輸出也可以減少。大部分的激活函數(shù)都是單調(diào)的,即它們的輸出值在輸入增加的時候是不會減少的。Swish在0點具有單邊有界性,平滑且不單調(diào)。
圖12 ReLU、ELU、PReLU、Swish激活函數(shù)
谷歌測試證明,在AlexNet 上用MNIST 和Fashion-MNIST數(shù)據(jù)集對ReLU激活函數(shù)與Swish激活函數(shù)進行對比測試,結(jié)果如表3所示。
表3 Swish激活函數(shù)谷歌測試結(jié)果
在3、10、45 三種不同的全連接層上不斷地增加測試集的難度所得結(jié)果顯示,Swish 激活函數(shù)的測試結(jié)果明顯優(yōu)于ReLU激活函數(shù)的測試結(jié)果。
但在收斂性上,Swish 激活函數(shù)較ReLU 激活函數(shù)卻相差很多。
4.2.5 ReLU-Swish激活函數(shù)
針對Swish 激活函數(shù)的特性提出的ReLU-Swish 激活函數(shù)由兩個分段函數(shù)組成,如圖13 所示,表達公式為:f
圖13 ReLU-Swish激活函數(shù)
ReLU-Swish激活函數(shù)與Swish激活函數(shù)對比,如圖14所示。
圖14 ReLU-Swish、Swish激活函數(shù)對比
ReLU-Swish在保持Swish原有特性的基礎上,一方面,是為了克服Swish激活函數(shù)在反向傳播求誤差梯度時涉及參數(shù)較多導致的計算量較大的問題,這樣就可以使得輸出運算節(jié)省大量的時間;另一方面,正是因為網(wǎng)絡模型在運算時往往需要大量的時間來處理大量的數(shù)據(jù),模型的收斂速度成為了極為關鍵的因素。由于Swish 激活函數(shù)在模型收斂速度上不如ReLU 激活函數(shù),因此將正區(qū)間上的這一段Swish 函數(shù)用ReLU 激活函數(shù)來替代,從而解決了Swish激活函數(shù)由于模型訓練運算中參數(shù)過多而導致的收斂速度過慢的問題。由于ReLU-Swish 激活函數(shù)與Swish 激活函數(shù)在特征性能方面保持著高度的相近性,并且ReLU激活函數(shù)在網(wǎng)絡模型結(jié)構(gòu)層數(shù)較多時測試準確率較高的優(yōu)勢,所以ReLUSwish激活函數(shù)在提高準確率及收斂效率上有著明顯的提高。
如圖15,16 所示,在測試中可以明顯得出ReLUSwish激活函數(shù)的收斂速度相較于Swish激活函數(shù)的收斂速度更快。在準確率上,在卷積核為10 的小型卷積神經(jīng)網(wǎng)絡測試模型下,取3次CIFAR-10、MNIST訓練集訓練模型結(jié)果的平均accuracy 的結(jié)果如表4、5 所示,ReLU-Swish 激活函數(shù)的準確率為97.52%,而Swish 激活函數(shù)的準確率為96.7%,所以在準確率上ReLU-Swish激活函數(shù)也有所提升。
圖15 ReLU-Swish、Swish激活函數(shù)收斂性對比
圖16 ReLU-Swish、Swish激活函數(shù)準確率對比
表4 ReLU-Swish激活函數(shù)CIFAR-10、MNIST測試
表5 Swish激活函數(shù)CIFAR-10、MNIST測試
本文通過分析研究卷積神經(jīng)網(wǎng)絡在性耗比上的不足,提出了一種異構(gòu)式CPU+GPU 協(xié)同計算模型,在性耗比上比單CPU計算或單GPU計算的效果更優(yōu)異。本文還通過分析研究Swish激活函數(shù)以及ReLU在卷積神經(jīng)網(wǎng)絡中存在的問題,提出了一種新的ReLU-Swish 激活函數(shù)。經(jīng)過測試實驗驗證了ReLU-Swish激活函數(shù)在收斂性及準確率上都有所提高,在模型訓練中表現(xiàn)的更優(yōu)異,達到了很好的預期效果,同時也為卷積神經(jīng)網(wǎng)絡的研究提供了一種新的方法及思路。