陳莉君,李卓
(西安郵電大學(xué)計(jì)算機(jī)學(xué)院,西安710100)
從AlphaGo開(kāi)始,深度學(xué)習(xí)漸漸進(jìn)入業(yè)內(nèi)研究者的視線。深度學(xué)習(xí)近些年大熱的主要原因是由于近些年設(shè)備的計(jì)算力的增加,尤其是圖形處理器(Graphics Processing Unit,GPU)對(duì)于浮點(diǎn)數(shù)運(yùn)算的有力支持。YOLO[1]的提出了一種在目標(biāo)識(shí)別領(lǐng)域新的方式,將檢測(cè)和回歸問(wèn)題集合在一起,大大的增加了對(duì)于目標(biāo)的檢測(cè)速度。但是,YOLO的網(wǎng)絡(luò)層數(shù)相較于傳統(tǒng)的網(wǎng)絡(luò)也增加很多,導(dǎo)致訓(xùn)練和推理的計(jì)算量會(huì)大大增加。尤其是嵌入式設(shè)備和移動(dòng)設(shè)備,這些設(shè)備可能并不能很好地支撐層數(shù)增加之后帶來(lái)的計(jì)算量增加。為了能讓更多的設(shè)備和更多的人用上和享受到深度學(xué)習(xí)給他們帶來(lái)的方便,對(duì)于深度神經(jīng)網(wǎng)絡(luò)推理加速需求就漸漸增多了[2-4]。
國(guó)內(nèi)外現(xiàn)有的研究結(jié)果中有一部分是利用并行化神經(jīng)網(wǎng)絡(luò)進(jìn)行加速,這樣可以將一個(gè)深度神經(jīng)網(wǎng)絡(luò)并行化拆分,分布式運(yùn)行這個(gè)模型。另外一部分是使用軟件加速深度神經(jīng)網(wǎng)絡(luò)的例子。例如:EIE(Efficient Inference Engine)[5]這個(gè)軟件提出了一個(gè)推理引擎,對(duì)這個(gè)壓縮的網(wǎng)絡(luò)模型進(jìn)行推理,并利用權(quán)重共享進(jìn)行加速稀疏矩陣的相乘過(guò)程。DeepX[6]:用于移動(dòng)設(shè)備上低功耗深度學(xué)習(xí)推斷的軟件加速器。Eyeriss[7]:用于深度卷積神經(jīng)網(wǎng)絡(luò)的節(jié)能可重構(gòu)加速器。針對(duì)深度神經(jīng)網(wǎng)絡(luò)模型的壓縮,Kim等人在2015年提出了一種壓縮CNN模型的方法。Soulie等人在2016年提出一種在模型訓(xùn)練階段進(jìn)行壓縮的方法。首先在全連接層損失函數(shù)上增加額外的歸一項(xiàng),使得權(quán)重趨向于二值,然后對(duì)于輸出層進(jìn)行量化。
現(xiàn)有的加速方案都是基于大型GPU設(shè)備的。對(duì)于嵌入式和移動(dòng)設(shè)備,加速的效果并不是很明顯。嵌入式和移動(dòng)設(shè)備的硬件限制仍然是影響神經(jīng)網(wǎng)絡(luò)發(fā)展的一個(gè)重要的因素。
針對(duì)上述問(wèn)題,本文中主要對(duì)YOLO神經(jīng)網(wǎng)絡(luò)進(jìn)行壓縮,測(cè)試深度神經(jīng)壓縮[8]中剪枝方式對(duì)于卷積神經(jīng)網(wǎng)絡(luò)的模型減少和推理加速效果。
深度神經(jīng)網(wǎng)絡(luò)中通常會(huì)有過(guò)多的參數(shù),存在大量的計(jì)算冗余的情況。這種情況將浪費(fèi)設(shè)備的內(nèi)存和計(jì)算資源,加大了嵌入式設(shè)備、低功耗設(shè)備和移動(dòng)設(shè)備的消耗[9-11]。
深度神經(jīng)壓縮(Deep Compression)存在四種方式,參數(shù)共享方法、網(wǎng)絡(luò)刪減方法、暗知識(shí)方法和矩陣分解方法。
參數(shù)共享的主要思路是多個(gè)參數(shù)共享一個(gè)值。通常實(shí)現(xiàn)的方法可以有很多選擇。例如Vanhoucke和Hwang等人使用定點(diǎn)方法江都參數(shù)精度,從而是值相近的參數(shù)共享一個(gè)值。Chen等人提出一種基于哈希算法的方法,將參數(shù)映射到相應(yīng)的哈希表上,實(shí)現(xiàn)參數(shù)共享。Gong等人使用K-means聚類方法將錢(qián)全部的參數(shù)進(jìn)行聚類,每簇參數(shù)共享參數(shù)的中心值。
網(wǎng)絡(luò)刪減用來(lái)降低網(wǎng)絡(luò)復(fù)雜度,防止過(guò)擬合。Han等人針對(duì)模型的訓(xùn)練效果,然后在基于參數(shù)共享和哈夫曼編碼進(jìn)一步對(duì)網(wǎng)絡(luò)壓縮。
在基于暗知識(shí)的方法中,Sau等人基于老師-學(xué)生學(xué)習(xí)框架對(duì)網(wǎng)絡(luò)進(jìn)行壓縮。
基于矩陣分解理論,Sainath、Denil等人采用低秩分解對(duì)神經(jīng)網(wǎng)絡(luò)不同曾的參數(shù)進(jìn)行壓縮。Denton等人在神經(jīng)網(wǎng)絡(luò)使用矩陣分解的方法加速了卷積層的計(jì)算過(guò)程,減少了全連接層的網(wǎng)絡(luò)參數(shù),對(duì)于神經(jīng)網(wǎng)絡(luò)進(jìn)行壓縮。
深度神經(jīng)壓縮主要表現(xiàn)在三個(gè)部分:存儲(chǔ)、訓(xùn)練復(fù)雜度和推理復(fù)雜度。以上介紹的方法中,都有各自的優(yōu)點(diǎn)和不足。參數(shù)共享方法、網(wǎng)絡(luò)刪減方法、暗知識(shí)方法和矩陣分解方法都可以有效的降低模型的存儲(chǔ)復(fù)雜度,但是在訓(xùn)練復(fù)雜度和推理復(fù)雜度上沒(méi)有重要影響。暗知識(shí)方法雖然在三個(gè)方面都有比較好的表現(xiàn),但是在準(zhǔn)確率方面,相較于其他三種方法,會(huì)有較大的變化。
YOLO屬于CNN,由卷積層、池化層和全連接層組成。與CNN不同的是,YOLO的輸出層不再是max函數(shù),而是張量(Tensor)。
YOLO的訓(xùn)練和推理過(guò)程和其他CNN存在不同之處[12],例如 R-CNN、Fast R-CNN和 Faster R-CNN 三種網(wǎng)絡(luò)。RCC、Fast R-CNN采用模塊分離的方式進(jìn)行推理過(guò)程。在檢測(cè)目標(biāo)的過(guò)程中,兩種網(wǎng)絡(luò)需要將待檢測(cè)的目標(biāo)區(qū)域進(jìn)行預(yù)提取,再將包含目標(biāo)的區(qū)域進(jìn)行卷積/池化操作提取特征,最后進(jìn)行檢測(cè)行為。在Faster R-CNN中,使用 RPN(Region Proposal Network)代替R-CNN/Fast R-CNN中的選擇搜索模塊,將RPN集成到Fast R-CNN模塊中,得到一個(gè)統(tǒng)一的檢測(cè)網(wǎng)絡(luò)。但是在模型的訓(xùn)練過(guò)程中,需要反復(fù)訓(xùn)練RPN網(wǎng)絡(luò)和Fast R-CNN網(wǎng)絡(luò)。上述三種網(wǎng)絡(luò)最大的特點(diǎn)就是在推理的過(guò)程中,需要將待檢測(cè)的目標(biāo)區(qū)域進(jìn)行預(yù)讀取。預(yù)讀取會(huì)耗費(fèi)大量的磁盤(pán)(內(nèi)存)空間,會(huì)對(duì)一些嵌入式設(shè)備、低功耗設(shè)備和移動(dòng)設(shè)備造成壓力。YOLO在設(shè)計(jì)的過(guò)程中就針對(duì)的進(jìn)行了改進(jìn)。
原始的YOLO模型在完成訓(xùn)練后,模型大小達(dá)到200M,對(duì)于嵌入式設(shè)備和移動(dòng)設(shè)備而言。200M的模型進(jìn)行內(nèi)存預(yù)讀,會(huì)對(duì)設(shè)備的性能造成較大的影響,所以論文主要從深度神經(jīng)壓縮理論入手,對(duì)于YOLO進(jìn)行修改,達(dá)到對(duì)于模型進(jìn)行體積壓縮,改善其在嵌入式設(shè)備和移動(dòng)設(shè)備上的表現(xiàn)[15]。針對(duì)YOLO進(jìn)行深度神經(jīng)壓縮,主要是以下步驟:
(1)權(quán)值修剪
(2)權(quán)值共享和量化
流程如圖1所示。
圖1 壓縮框架圖
權(quán)值修剪[16]主要目的是保存YOLO中重要的鏈接來(lái)達(dá)到降低存儲(chǔ)數(shù)量和計(jì)算復(fù)雜度的目的。傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)訓(xùn)練過(guò)程中,在神經(jīng)網(wǎng)絡(luò)訓(xùn)練之前,神經(jīng)網(wǎng)絡(luò)的框架結(jié)構(gòu)就已經(jīng)被固定了。用戶只需要進(jìn)行數(shù)據(jù)的輸入,就可以在迭代訓(xùn)練后獲得需要的權(quán)重。但是這種固定框架結(jié)構(gòu)的方式,導(dǎo)致不能在訓(xùn)練的過(guò)程中,隨時(shí)對(duì)于神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)進(jìn)行優(yōu)化。因此,常規(guī)訓(xùn)練出的模型文件大小都不適合于部署在嵌入式設(shè)備或者移動(dòng)設(shè)備上。YOLO常規(guī)訓(xùn)練后的模型大小達(dá)到200M,對(duì)于嵌入式設(shè)備,將模型預(yù)讀進(jìn)內(nèi)存中,提供給推理過(guò)程使用,將會(huì)消耗設(shè)備的所有內(nèi)存。所以,利用深度神經(jīng)壓縮的剪枝思路,對(duì)于YOLO模型進(jìn)行壓縮,是提高YOLO在各種設(shè)備上通用性的一個(gè)方式。剪枝過(guò)程分為四個(gè)步驟;
(1)通過(guò)訓(xùn)練找到權(quán)重小于閾值的神經(jīng)網(wǎng)絡(luò)鏈接;
(2)刪除權(quán)重小于閾值的神經(jīng)網(wǎng)絡(luò)鏈接;
(3)重新對(duì)于神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練;
(4)將修剪后的以 CSR(Compressed Sparse Row)方式存儲(chǔ)。
在訓(xùn)練的過(guò)程中使用公式:
對(duì)權(quán)重進(jìn)行計(jì)算,使一部分權(quán)重趨向于0,然后將小于閾值的鏈接剪枝。使用公式的目的是能夠減少在訓(xùn)練剪枝過(guò)程中的過(guò)擬合現(xiàn)象,并且可以保持較高的精度。相對(duì)的,通常訓(xùn)練過(guò)程中的Droupout概率也需要進(jìn)行調(diào)整。在深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練的過(guò)程中,Droupout主要是用來(lái)防止訓(xùn)練出的模型數(shù)據(jù)有過(guò)擬合的現(xiàn)象。因?yàn)樵谏鲜龅募糁^(guò)程中,使用了L2正則進(jìn)行過(guò)擬合的預(yù)防。所以,在重訓(xùn)練的過(guò)程中,按照剪枝后的神經(jīng)網(wǎng)絡(luò)數(shù)量進(jìn)行對(duì)Droupout概率進(jìn)行等比例的調(diào)整。初步剪枝之后將要進(jìn)行對(duì)于本次鏈接層的一個(gè)重訓(xùn)練。每一次的剪枝過(guò)后的重新訓(xùn)練都是一個(gè)原子操作。重新訓(xùn)練的目的是為了神經(jīng)網(wǎng)絡(luò)模型有更好的精確度,以及更小的過(guò)擬合的可能。
剪枝之后的權(quán)重按照CSR方式進(jìn)行存儲(chǔ),CSR方式可以減少存儲(chǔ)元素位置index帶來(lái)的額外存儲(chǔ)開(kāi)銷。按CSR方式轉(zhuǎn)換完成的稀疏矩陣,在存儲(chǔ)的過(guò)程中使用按位存儲(chǔ)的方式,存儲(chǔ)過(guò)程中,每一個(gè)非零元素都會(huì)進(jìn)行標(biāo)記。如果使用3bit形式進(jìn)行存儲(chǔ),每一個(gè)非零元素和另外一個(gè)非零元素之間的距離在標(biāo)記后將會(huì)被檢查。如果一個(gè)非零元素和另外一個(gè)非零元素的超過(guò)8,則這個(gè)第八位的位置將會(huì)被填充一個(gè)0,這樣防止在使用按位存儲(chǔ)的時(shí)候出現(xiàn)數(shù)據(jù)的溢出。
為了進(jìn)一步的壓縮剪枝之后的YOLO,第二部將使用權(quán)值共享的方法[17],對(duì)于剪枝結(jié)束的權(quán)值,進(jìn)行一個(gè)K-means聚類。
式(2)中,W代表權(quán)值C代表聚類。
聚類之后的結(jié)果代表著一類權(quán)值的聚類執(zhí)行,這個(gè)質(zhì)心的值將作為共享的權(quán)值進(jìn)行存儲(chǔ)。最后存儲(chǔ)的結(jié)果是一個(gè)碼書(shū)和一個(gè)索引表。
K-means算法中,聚類的核心是聚類中心的選擇和初始化。常規(guī)的初始化方式有三種:
(1)隨機(jī)初始化
(2)密度分布初始化
(3)線性初始化
由于在神經(jīng)網(wǎng)絡(luò)的訓(xùn)練中,權(quán)值越大,對(duì)神經(jīng)網(wǎng)絡(luò)精確度的影響越高,所以使用將權(quán)重排序后進(jìn)行線性劃分的線性初始化較為合適。
本層的權(quán)重完成剪枝和共享之后,將執(zhí)行神經(jīng)網(wǎng)絡(luò)層與層之間的前向傳播和反向傳播。前向傳播時(shí)需要將每個(gè)權(quán)值用其經(jīng)過(guò)聚類的中心進(jìn)行代替,反向傳播時(shí),計(jì)算每個(gè)聚類中權(quán)值的梯度,用來(lái)進(jìn)行聚類中心的更新和迭代。
實(shí)驗(yàn)結(jié)果分析算法在經(jīng)過(guò)深度神經(jīng)壓縮之后壓縮率、準(zhǔn)確率和執(zhí)行速度。運(yùn)行YOLO模型的設(shè)備為NVIDIA TX2嵌入式開(kāi)發(fā)板。YOLO的訓(xùn)練數(shù)據(jù)集為基于VoC2007和ImageNet的常見(jiàn)數(shù)據(jù)集。
表1中展示了YOLO未壓縮和已壓縮之后的大小對(duì)比。
表1 YOLO壓縮體積對(duì)比
由表1可以看出,經(jīng)過(guò)深度神經(jīng)壓縮后的模型只有原模型的3%,減少了嵌入式設(shè)備和移動(dòng)設(shè)備在預(yù)讀模型時(shí)的內(nèi)存消耗,提高了模型預(yù)讀的速度。
表2 僅剪枝YOLO模型大小和準(zhǔn)確率
表3 僅共享權(quán)重
表4 剪枝+共享權(quán)重
從表2、3、4可以得到,準(zhǔn)確率隨著模型體積的下降而下降。僅剪枝能達(dá)到的最低壓縮率為4.5%。僅共享權(quán)重最低壓縮率可以達(dá)到6%。剪枝和共享權(quán)重可以達(dá)到最低的壓縮率3%。
表5 壓縮YOLO在嵌入式設(shè)備上運(yùn)行時(shí)間
表5可以看出壓縮網(wǎng)絡(luò)對(duì)比原始網(wǎng)絡(luò),在嵌入式GPU設(shè)備上可以獲得5倍加速。
本方案基于深度升級(jí)壓縮理論,提出了YOLO算法的改進(jìn)方案。對(duì)于YOLO算法進(jìn)行剪枝、共享權(quán)重、霍夫曼編碼等步驟。并且將壓縮后的YOLO算法部署到NVIDIA TX2上,進(jìn)行目標(biāo)識(shí)別實(shí)驗(yàn)。實(shí)驗(yàn)結(jié)果表明,經(jīng)過(guò)優(yōu)化的YOLO可以在原體積3%的情況下穩(wěn)定運(yùn)行,并且準(zhǔn)確率相較于原模型只有-2%的差距。并且在嵌入式設(shè)備上獲得原模型5倍的加速效果。但是該實(shí)驗(yàn)只是單純的進(jìn)行L2范式的權(quán)重衡量,沒(méi)有做到多情況的權(quán)重衡量。并且K-means只選擇了線性初始化的情況。后期實(shí)驗(yàn)可以進(jìn)行優(yōu)化,找到更好的剪枝方式和聚類方式[19-20]。