當前位置:
首頁 > 最新 > 紀榮嶸:深度神經網路壓縮及應用

紀榮嶸:深度神經網路壓縮及應用

AIDL簡介

「人工智慧前沿講習班」(AIDL)由中國人工智慧學會主辦,旨在短時間內集中學習某一領域的基礎理論、最新進展和落地方向,並促進產、學、研相關從業人員的相互交流。對於碩士、博士、青年教師、企事業單位相關從業者,預期轉行AI領域的愛好者均具有重要的意義。

2018年AIDL活動正在籌備,敬請關注獲取最新消息。

導讀

2016年12月,中國人工智慧學會舉辦了第一屆《人工智慧前沿講習班》,廈門大學紀榮嶸老師做了題為《深度神經網路壓縮及應用》的報告。報告介紹了如何提高深度神經模型本身的效率,分析了深度神經網路壓縮和加速的現實需求,著重講了壓縮和加速的方法及應用。本文根據紀榮嶸老師當日報告內容整理髮布。

講師簡介

紀榮嶸,福建省「閩江學者」特聘教授,廈門大學教授,萬人計劃青年拔尖人才,致力於視覺內容檢索與分析的研究。2014年獲批國家優秀青年科學基金支持;主持中央軍委科技委前沿創新重大項目,總參謀部十三五預研項目,國家自然科學基金面上項目、科技部行業專項、十三五科技部重點研發計划子課題、總裝備部十二五預研子課題等。相關工作發表於SCI源期刊論文93篇,包括國際計算機視覺期刊(IJCV)、ACM 彙刊與IEEE彙刊43篇、其中JCR一區期刊11篇,中國計算機學會推薦A類國際期刊12篇,A類國際會議長文40篇,SCI他引合計近1200次,9篇論文入選ESI高被引/熱點論文。

一、深度神經網路壓縮領域的研究現狀

深度神經網路(DNN)起源於人工神經網路(ANN),傳統的ANN雖然有很多科研成果,但是距離實際應用很遠。DNN是ANN的擴展,基本想法是把ANN做的更深,使模型具有更強的表現力。由於數據集成指數級別增長,並且有越來越多類似GPU的設備應用,使DNN的運算能力爆髮式增長,得以廣泛應用。

為了挖掘模型潛力,模型被做得更深(如從VGGNet的16層到ResNet的19層),網路的深度和每層節點的個數也必須增加以提高性能(如GoogleNet)。在某種意義上,DNN並不是越深越好,有些深度模型在兩三千次迭代訓練之後會出現梯度消失、不收斂等問題。

DNN在許多問題上取得了突破,但是有一些應用問題並未得到有效解決:

1、小樣本集訓練(Small training set)。DNN有上千萬的參數,需要大量的樣本訓練,但卻難以在少量樣本的情況下訓練模型。而小樣本訓練問題在現實生活中很常見。

2、非均衡樣本集訓練(Biased training distribution)。大多數的模型都假設訓練樣本是均衡的,面對少量的、非均勻的樣本,現有的訓練方式就會失效。

3、在線/增量學習(Online/incremental Learning)。訓練模型對於解決固定格式的數據問題是有效的,但是如果數據類別發生變化,以至於改變了整個模型結構,如何靈活應對增量的、在線的數據?

4、弱監督、非監督學習(Un/weak supervised Learning)。

5、降低深度網路複雜度(Complexity)。

隨著模型深度的增加,模型參數量以及對每張圖像做的計算,都會成倍增長。如果要在一個板上或者一個小小的晶元上實現應用,必須壓縮模型。

二、深度神經網路壓縮(DNN Compression)

主要是把大的深度模型變小,可以從三個方面入手:

1、參數並不是獨特的或者惟一的,有一些參數之間可以做交換。

2、去除不必要的參數。

3、壓縮兩層網路之間的參數矩陣。

(一)參數量化

2015年ICML的工作,Compressing Neura Networks With the hashing trick。把現在的參數做一次索引,之後不再保存原始參數,通過哈希碼找到參數。上圖可以看到,對於輸入層到輸出層之間的參數矩陣,不直接存儲矩陣中的16個元素,而是對矩陣進行量化,例如圖中量化成三個值,只存儲這些值的index,把32位數字壓縮成2位編碼。同理,在其他層也可以進行相同的壓縮。模型預測時查找哈希表,速度非常快。

這個思路簡單直接,但是效果不及預期,所以又加入一個負號,一個哈希碼有正負之分,進一步縮小量化誤差。再把傳統的權值傳播轉變成在哈希碼0和1之間的權重傳播,找到對應的規律,用相應的方式做優化和計算。

2014年發表在ArXiv的論文,把壓縮問題看成量化問題,對網路中的參數做量化。例如對參數進行二值化,參數大於0就是1,小於0就是-1,網路在全連接層部分壓縮比1:32。除了簡單二值化,還可以做標量量化(Scalar Quantization),給定某一層權重矩陣W,把W轉換成M×N個數,之後進行K-means聚類,將其中的任意值用聚類中心index。這種方法壓縮比較低,但是保留的信息會更多。還有一種方法,乘法量化(Product Quantization),給定參數W,把參數W切成s個小的矩陣,W1…Ws,對M×N矩陣,切成M×N/S,每個矩陣單獨做一次量化,每個矩陣都有對應的索引表。另外還有殘差量化(Residual Quantization),先量化第一次,對第一次量化的殘差再做一次量化。

對比各個實驗,乘法量化的結果最好。

(二)參數裁剪

參數裁剪,就是把所對應的網路當成一棵樹,樹上並不是每個連接都有用,有一些連接可以刪掉,且網路性能損失最小。首先設損失函數,標示原始網路的誤差跟刪掉某個節點之後的誤差二者之間的關係。計算每個節點的顯著性(saliency,刪除節點之前和之後的誤差)。把所有的參數顯著性計算出來並存在矩陣M中,刪除顯著性最小的節點,如此循環,一直到達到滿意的壓縮比為止。這是BMVC 2015的工作。

還有組合式的壓縮演算法(ICLR2016):

1、在最早的網路裡面,把不相關的單元用類似於網路裁剪的方式刪掉;

2、對剩下的單元做量化;

3、統計比特數分布,把權重再做一次哈夫曼編碼,使高頻的權重有很短的編碼,低頻的權重有很長的編碼。

這種方式可以獲得非常高的壓縮比。例如可以計算出40倍、39倍、35倍、49倍的壓縮比,例如把1070KB的參數壓縮成27KB,將top-1 error從1.64%降到了1.58%。

(三)參數矩陣分解

2015年NIPS的文章,Tensorizing Neural Networks,對於神經網路做tensor分解。通過2ensor分解的形式,存儲全連接層稠密的權重矩陣。分解之後,把矩陣A拆成子矩陣相乘的形式(低維的tensor),每一維都對應一個元素的表示,可以做很高的存儲表示。

如果對大的矩陣做tensor分解,在線存儲時可以把原始的大矩陣轉換成線性的tensor矩陣,N1、N2、N3、N4連乘矩陣變成了k個小矩陣的連乘,大大降低了存儲和計算量。

如何將張量轉化成傳統向量的矩陣?就是構建Index的索引表,向量可以看成是一維向量的索引,矩陣可以看成是二維向量的索引。通過構建索引表,把向量或者矩陣全部轉成向量保存。通過構建向量保存,一層一層往裡學,例如在每步學習的過程中採用隨機下降加上反向操作,與傳統方式不同的是,傳統方式截取了權重里的gradient,而這裡的gradient分為三部分,第一部分是原有的gradient,前一部分跟後一部分的gradient使用迭代順序求解,分為前、中、後三個步驟,可以使用BP演算法的sequencial gradient update。

之前的工作,優化目標就像在做參數的重構,但是網路不是用來重構參數的,需要重構用於最終分類層的特徵;第二,每一層壓縮的結果都可以往下回傳,可以把所有的全連接層一起壓縮,所以優化單元單層測試是有問題的。

我們在2016年做的工作,直接優化倒數第二層,也就是softmax之前層的特徵,它在模型中占的比重遠超重構參數的比重。第二,允許每層結果往下回傳,多層做嚴格的壓縮。通過這種方式開發新的優化學習演算法——「全局最小化的壓縮」,有有監督和無監督兩個版本。

有監督的全局最小化壓縮

目標是使壓縮之後的response,接近原始的網路加入參數之後的response。為此,把結果一層一層的往下傳重構的項,重構生成的上面那層誤差要小。

在每一層里做一個SVD,如果學出參數W來,可以估計生成的響應函數y,這是迭代的過程,可以用GSVD去解。

固定生成的參數W,然後更新生成的y。在每次迭代中選最小的y替換原始的y,之後做迭代計算。

把原來大的F、W拆成了對應每一層的W值。最開始使用隨機初始化,初始化之後在每一層做SVD,然後將求出來的殘差通過BP的方式進行傳播。這個演算法跑起來很慢,但是效果非常好,可以達到目前(2016年12月)為止CNN壓縮完之後最好的指標。

三、DNN的加速(DNN Acceleration)

壓縮跟加速很多時候是重合的,但是重點不同。例如CNN,最慢的部分是卷積,最大的部分是全連接層,加速一般在卷積層做,壓縮一般是在全連接層下做。

DNN Acceleration也是做parameter quantization,做參數的parameter pruning,做tensor decomposition,只是關注的焦點放在了卷積層。

(一)CVPR 2016論文,把CNN做量化(特別是在卷積層)。把權重矩陣分解成m個子矩陣,每個子空間做辭典去量化。測試時,輸入被分解成m個子向量,每個向量在對應辭典里做量化,做出來的結果再做內積乘,之後看卷積結果。

1、feature map。response feature map可以理解成兩個部分,第一部分是空間上的部分,第二個部分是權重,可將兩個向量轉變成子空間里小向量的內積和,直接量化全連接層。原始的全連接層W轉化成一個辭典D跟參數B,這是標準的詞典學習問題,可以用隨機演算法去做辭典。對於卷積層,下標表示空間位置,上標表示N個子空間或者子向量,在子空間里做內積的疊加,然後擴展到空間意義上做累加,最後計算卷積層的量化表示結果。

這種方式沒有考慮誤差的傳播,只近似了參數的量化結果,沒有得到很好的量化。而且,累計誤差會隨著網路的疊加而增加,需要修正誤差。不同層的error的correction是不同的,包含三個部分,分別是對全卷積層修正,對卷積層修正,對多層的混合修正。對於多層混合的修正,首先做單層的優化,是基於上一層優化的結果,然後採用量化後的輸入結果,把上一層的量化考慮到這一層的量化里,這是CVPR 2016的文章。

(二)NIPS 2015論文,直接做二值網路。

二值網路起初做不出來,因為參數update的時候不能假設網路參數是1或者-1,否則無法做梯度傳播。論文引入概率,如果當前的概率滿足0-1分布,當ΣX大於1時,當前的取值是1,當ΣX小於1時,當前的取值是-1,前面的概率是p,後面的概率是1-p,使得直接做優化的二值問題成為可能,這篇論文的思路與眾不同,區別在於加入概率先驗,可以做離散的優化。

(三)ECCV 2016的論文XNOR-Net

這個思路是加速卷積。卷積操作分兩個部分,input和weight,如果把weight做成binary的話,就可以直接壓縮存儲開銷,如果把input做成binary的話,不僅存儲開銷加速,計算也會加速,因為binary和binary可以直接做異或操作。把input和weights都量化成+1、-1,不僅可以壓縮,而且可以用異或操作去做加速,卷積的計算變成異或計算,就提高了計算效率。

1、把weight做成binary,用一個scale α和一個binary matrix B去逼近當前的W。

2、把input也量化到二值參數,對二值做非同步操作。把真實的X×W拉成一個長向量Y,每層表示的是Xi跟Wi的計算結果,相應的H跟B相乘,也可以轉化成長向量C,在向量內部做量化。

(四)ICLR 2015的論文

在卷積層做tensor decomposition,把原始的卷積拆成兩個tensor相乘.另外一個分解成4個一維向量的卷積,用它去逼近三維中的卷積層。

(五)我們的工作

我們主要想把卷積層做小。前人的做法是設計緊湊的卷積核和量化權重,在卷積層做量化,做權重剪枝、做張量分解、組合式目標。如果把卷積當成是kernal運算的話,是減少kernal中的冗餘信息。kernal中的信息可在統一框架下求解,這個框架包含兩部分,第一部分,傳統kernal內部的信息;第二部分(之前沒有人做),空間部分的採樣,輸入信號本身是冗餘的,尤其是空間冗餘性,可以把空間的冗餘性跟feature map冗餘性融合到一個完整的框架里做加速。我們的主要貢獻有3點:

1、考慮視覺輸入的冗餘,包括卷積核通道冗餘,用tensor decomposition進行分解,不把所有的pixel放進來,只放一部分去做。

2、兩個冗餘信息彼此之間可以組合,把卷積核的冗餘跟卷積空間計算的冗餘組合起來,協同優化。

3、卷積空間的冗餘是一個mask模板,可以採用不同策略,比如採用random mask或者learning based mask。

第一步,用兩個小的卷積核代替原始的卷積,減少3D卷積核的通道冗餘性。第二步,減少空間計算冗餘,跳過不顯著點的計算,提出特定的演算法計算當前點的顯著性。通過顯著性構造一個基於學習的模板,在每個點計算saliency,留下排序靠前的30%-40%的點,過濾掉大部分的視覺數據,可以很快的過濾掉卷積層。把通道跟空間二者聯合起來,去除空間和通道上的冗餘信息,然後逐層優化。

在ActivityNet和GoogleNet上,我們的模型基本上是最好的。

四、總結與展望

在深度神經網路里壓縮和加速,是我們研究組最近做的重點工作。

我們與騰訊優圖實驗室共享技術,做合作發表,也初步應用在騰訊優圖的產品中。例如,在「天天P圖」中,應用於具體的跟蹤跟關鍵點定位的模塊;在超大規模數據集中,在QQ空間或者QQ直播平台中,快速過濾敏感內容。技術在高加速比的前提下,可以節約資源,帶來很大的經濟效益。

廈門大學媒體分析與計算實驗室是我2013年回國之後建立的,現有科研人員包括工程師、秘書約十餘人,教師偏少,我們現在有一些合作,也有一些大的項目,參與了一些國家重點計劃,歡迎大家來實驗室參觀。

Q&A

提問:目前這些網路壓縮演算法能得到多大的加速比?

紀榮嶸:這取決於可承受的性能損失。例如在ImageNet上,top-1 error損失上升100%的情況下可能6—8倍,但是如果不要求所有類別的top-1 error,只看特定方面的performance,加速比可以達到很大很大。極端的情況,大概600MB的模型到20MB,是30倍左右的加速。

提問:設計一個比較小、比較合適的網路,或在一個成熟網路上做壓縮,您覺得哪種方式更實用?

紀榮嶸:這是兩條路,第一條路是影子網路,這個網路很小,只要能模仿出大網路的處理就行,但是泛化能力會很差。另外一個,把大網路壓小,這個是現在大家都在做的事情,因為前面那條路已經被證明基本走不通。

提問:目前深度學習發展特別快,每年都有新的演算法出現,以後是否會出現一個模型本身就很小,因此就不用壓縮了?

紀榮嶸:例如ResNet,這個模型很小,但不適用於所有場景。圖像的解析、邊緣檢測就不適用Resnet。

提問:你的計算用了低秩分解,它本身就是一個沒有完全解決的數據問題,如何既保證精度又保證時間複雜度?

紀榮嶸:時間複雜度本身也沒有保證,只能說實驗效果還可以,就是數字上還可以。

感謝AIDL志願者王嘉豪協助整理!

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 人工智慧前沿講習班 的精彩文章:

張宇 楊強:多任務學習概述「全文翻譯」

TAG:人工智慧前沿講習班 |