low-rank
pruning
深度網路加速和壓縮的第二種方法是pruning,簡單來說就是把神經網路中的連線剪掉,剪掉以後整個網路複雜度特別是網路模型大小要減小很多。最早在iclr2016上史丹福大學提出了一種稱為deep compression的隨機剪枝方法。由於隨機剪枝方法對硬體非常不友好,往往在硬體實現的過程中不一定能夠很好地對網路起到加速和壓縮的效果。後來大家就想到使用成塊出現的結構化pruning,filter pruning,梯度pruning等方法。
對於結構化pruning,在icml2017中有一篇對於權重進行分析剪枝的文章。具體方法是:首先使用group sparsity組稀疏的方法對分組特徵新增稀疏正則來修剪掉權重矩陣的一些列,然後通過exclusive sparsity增強不同權重之間特徵的競爭力來學習更有效的filters,兩者共同作用取得了很好的pruning結果。
從另一方面考慮,我們能否對feature map和activation也做一些pruning的工作呢?在iccv2017的工作中有人通過給每個通道channel新增乙個尺度因子scaling factor,然後對這些尺度因子scaling factor新增sparsity regularization,最後根據尺度因子大小對相應的通道channels進行修剪,將一些尺度因子比較小的通道剪掉,實現對整個網路的**效果。
剛才所講的都是在網路前向傳播過程中所做的pruning,那麼我們能否在網路訓練的過程中也加入pruning來加快網路訓練的過程呢?icml2017有一篇文章對網路訓練過程中的梯度資訊做了分析,通過去掉幅值比較小的梯度來簡化網路的反向傳播過程,從而加快網路的訓練過程。從結果來看,這種方法可以通過僅僅更新1%-4%的權重來實現和原有網路相當的效果。
quantization
除了pruning,還有一種研究較多的方法是quantization量化。量化可以分為low-bit quantization(低位元量化)、quantization for general training acceleration(總體訓練加速量化)和gradient quantization for distributed training(分布式訓練梯度量化)。
由於在量化、特別是低位元量化實現過程中,由於量化函式的不連續性,在計算梯度的時候會產生一定的困難。對此,阿里巴巴冷聰等人把低位元量化轉化成admm可優化的目標函式,從而由admm來優化。另一種是使用雜湊把二值權重量化,再通過雜湊求解。
前面兩篇文章都是對權重進行量化,那麼feature map能否也可以進行量化呢?以前有人考慮過這個問題,將權重和feature map一起進行量化,但在實際過程中非常難以收斂。cvpr2018上有乙個方法,受到兩步雜湊法的啟發,將量化分為兩步,第一步先對feature map進行量化,第二步再對權重量化,從而能夠將兩個同時進行很好的量化。
剛才的量化都是在網路inference過程中,其實量化也可以在訓練過程中使用,這是英特爾在nips2017提出的flexpoint方法。我們知道在32位浮點和16位浮點儲存的時候,第一位是符號位,中間是指數字,後面是尾數。他們對此提出了把前面的指數項共享的方法,這樣可以把浮點運算轉化為尾數的整數定點運算,從而加速網路訓練。
在很多深度學習訓練過程中,為了讓訓練更快往往會用到分布式計算。在分布式計算過程中有乙個很大問題,每乙個分布式伺服器都和中心伺服器節點有大量的梯度資訊傳輸過程,從而造成頻寬限制。這篇文章採取把要傳輸的梯度資訊量化為三值的方法來有效加速分布式計算。
knowledge distillation
compact network design
「inverted residuals and linear bottlenecks: mobile networks for classification, detection and segmentation 「. cvpr2018
「shufflenet: an extremely efficient convolutional neural network for mobile devices」. cvpr2018
先介紹谷歌在2023年和2023年連續推出的mobilenets v1和mobilenets v2,其中使用了depthwise的1x1卷積。mobilenets v1是乙個在網路非常精簡情況下比較高效能的網路,mobilenets v2開始於通道比較少的1×1的網路,然後對映到通道比較多的層,隨後做乙個depthwise,最後再通過1x1卷積將它對映回去,這樣可以大幅減少1×1卷積計算量。
實際上mobilenets中1x1的卷積占有很大的比重,基於這樣的原則,曠視科技在cvpr2018提出把1×1的卷積通過分組來減少計算的方法,由於分組以後存在不同通道之間資訊交流非常少的問題,他們又在卷積層之間增加channel shuffle過程進行隨機擾亂,增加了不同通道之間的資訊交流。這是shufflenet所做的工作。
最後簡單講一下深度神經網路加速和壓縮的發展趨勢。第一,我們發現實際上現在絕大部分加速和壓縮的方法,都需要有乙個fine-tuning的過程,這個過程需要有一定量的含有標籤的原始訓練樣本,這在實際應用過程中可能會有一定的限制。會有一些non-fine-tuning或者unsupervised compression方法的出現。實際上現在已經有人在研究這方面的東西。第二,在加速和壓縮過程中會涉及到很多引數,甚至還包含很多經驗性東西,將來能不能做到盡可能少需要、不需要經驗或者引數越少越好的self-adaptive方法。第三,現在很多加速壓縮方法往往都是針對分類問題,未來在目標檢測、語義分割方面也會出現類似的工作。第四,現在很多方法與硬體的結合越來越緊密,對於加速和壓縮方面來說也是如此,未來肯定是之間的結合越來越多。最後是二值網路越來越成熟,未來研究的人會越來越多。
參考:讓機器「刪繁就簡」:深度神經網路加速與壓縮|valse2018之六
深度神經網路壓縮
目前深度學習模型壓縮方法的研究主要可以分為以下幾個方向 更精細模型的設計,目前的很多網路都具有模組化的設計,在深度和寬度上都很大,這也造成了引數的冗餘很多,因此有很多關於模型設計的研究,如squeezenet mobilenet等,使用更加細緻 高效的模型設計,能夠很大程度的減少模型尺寸,並且也具有...
《卷積神經網路的壓縮與加速》概述
有四種常用方法 網路剪枝,模型量化,低秩估計,模型蒸餾。網路剪枝主要有下列幾種方法 filter level剪枝 通過刪除filter來減少通道數量 group level剪枝即kernel size縮小 如將33變成32,或者3 3變成固定形狀包含若干個0的新核 稀疏卷積的方法 fine grai...
神經網路加速指南
分析各步驟耗時 1 cpu上的操作耗時 嘗試將操作放在gpu上進行,如np.argmax的操作 2 cpu 耗時 嘗試減少傳輸tensor的大小 3 資料預處理耗時 1 resample操作嘗試放到gpu上處理?2 先crop後resample?4 呼叫不同的包耗時不同 如scipy skimage...