目前在深度學習領域分類兩個派別,一派爲學院派,研究強大、複雜的模型網絡和實驗方法,爲了追求更高的性能;另外一派爲工程派,旨在將算法更穩定、高效的落地在硬件平臺上,效率是其追求的目標。複雜的模型當然具備更好的性能,可是高額的存儲空間、計算資源消耗是使其難以有效的應用在各硬件平臺上的重要緣由。html
工業層面
當前各大互聯網公司都開始注意深度學習模型在工業上的落地。模型壓縮工具開始在各家的生產工具中進入主流,而且各家也開源了對應的工具。具體以下:git
整體來看,模型壓縮方法、工具及應用落地已經在各個大互聯網公司呈百花齊放的態勢。各家都在構建本身的模型壓縮工具及生態環境並努力實如今自家產品的落地(做者接下來會對各個工具作一些性能對比,並選出一家作詳細的技術調研)github
算法層面
理論算法層面,早在2015年,韓鬆發表的Deep Compression就是一篇對於模型壓縮方法的綜述型文章,將裁剪、權值共享和量化、編碼等方式運用在模型壓縮上,取得了很是好的效果,做爲ICLR2016的best paper,也引發了模型壓縮方法研究的熱潮。算法
- Deep Compression:https://arxiv.org/abs/1510.00149
隨着研究的深刻,當前深度學習模型壓縮和加速算法已經成爲一個至關龐大且活躍的研究領域,涵蓋軟件和硬件,包括衆多的技術方向。目前深度學習模型壓縮方法的研究主要能夠分爲如下幾個方向:網絡
- 輕量網絡設計:指從新設計新型網絡結構,而不侷限於僅對現有網絡進行優化加速。輕量網絡設計方向的主要表明論文是 MobileNet v1 / v2 , ShuffleNet v1 / v2 等,其主要思想是利用 Depthwise Convolution、Pointwise Convolution、Group Convolution 等計算量更小、更分散的卷積操做代替標準卷積。這類模型的計算量一般僅有幾十到幾百 MFLOPs,與傳統的大型網絡例如 VGG / Inception / ResNet等動輒上 GFLOPs 的計算量相比有明顯優點,同時在比較簡單的任務上與大模型的準確率差距較小。
- mobileNet-V1: https://arxiv.org/abs/1704.04861
- mobileNet-V2: https://arxiv.org/abs/1801.04381
- shuffleNet-V1: https://arxiv.org/abs/1707.01083
- shuffleNet-V2:https://arxiv.org/abs/1807.11164
- 模型裁剪:相比輕量網絡設計,模型裁剪主要關注對現有模型作減法,由大化小。其主要思想是在保持現有模型的準確率基本不變的前提下,設計某種篩選機制(稀疏化),在某個尺度上篩選掉卷積層中重要性較低的權重,從而達到下降計算資源消耗和提升實時性的效果。模型裁剪算法的核心就在於權重篩選機制的設計以及篩選粒度的選擇上。這也是本文接下來會着重深刻討論的方向。
- Learning both weights and connections for efficient neural network: https://arxiv.org/abs/1506.02626
- Pruning filters for efficient convnets:https://arxiv.org/abs/1608.08710
- Channel pruning for accelerating very deep neural networks:https://arxiv.org/abs/1707.06168
- Learning efficient convolutional networks through network slimming:https://arxiv.org/abs/1708.06519
- Rethinking the Smaller-Norm-Less-Informative Assumption in Channel Pruning of Convolution Layers:https://arxiv.org/abs/1802.00124
- AMC: AutoML for Model Compression and Acceleration on Mobile Devices :https://arxiv.org/abs/1802.03494
- 模型蒸餾:相比於模型裁剪的目標是把大模型逐漸變小,同時保持精度損失較小,模型蒸餾的目標是利用大模型(Teacher Network)提供的監督特徵幫助計算量較小的模型(Student Network)達到近似於大模型的精度,從而實現模型加速。模型蒸餾的關鍵在於監督特徵的設計,例如使用 Soft Target 所提供的類間類似性做爲依據,或使用大模型的中間層特徵圖, 或 attention map做爲暗示,對小網絡進行訓練。
- Distilling the Knowledge in a Neural Network:https://arxiv.org/abs/1503.02531
- FitNets: Hints for thin deep nets:https://arxiv.org/abs/1412.6550v4
- Paying More Attention to Attention: Improving the Performance of Convolutional Neural Networks via Attention Transfer:https://arxiv.org/abs/1612.03928
- 矩陣分解:因爲深度學習模型中計算量最密集的部分就是卷積,而卷積能夠通過 im2col 以後用矩陣乘法實現,所以咱們可使用多種矩陣低秩近似方法,將兩個大矩陣的乘法操做拆解爲多個小矩陣之間的一系列乘法操做,下降總體的計算量,加速模型的執行速度。
- Speeding up convolutional neural networks with low rank expansions: https://arxiv.org/abs/1405.3866
- Accelerating very deep convolutional networks for classification and detection: https://arxiv.org/abs/1505.06798
- 量化與低精度運算:深度學習模型在運行過程時須要進行大量的浮點乘加運算,通常默認數據位寬是 32bit,可是實際上咱們徹底能夠用更低的位寬(例如 16bit / 8bit / 4bit / 2bit 甚至 1bit)來量化模型的權重和特徵圖,完成近似的運算。這麼作一方面能夠成倍的下降模型運行時的訪存量,一方面在相應硬件指令集的支持下,能夠成倍的提升模型的運算速度。其重點在於如何控制低精度對模型帶來的精度損失。
- BinaryConnect: Training Deep Neural Networks with binary weights during propagations:https://arxiv.org/abs/1511.00363
- XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks:https://arxiv.org/abs/1603.05279
- Quantized Neural Networks: Training Neural Networks with Low Precision Weights and Activations:https://arxiv.org/abs/1609.07061v1
- 計算圖優化:深度學習模型的層數一般在幾十層到上百層,但實際上層與層之間有不少部分都存在固定的組合關係(例如 Conv-BatchNorm-ReLU 組合),所以咱們能夠對計算圖中的這些固定組合進行優化,分別在水平和垂直方向上將多層融合爲一層執行,從而大量減小層間沒必要要的內存拷貝以及屢次 kernel launch 帶來的開銷,有效提高模型的運行速度。
- 卷積算法優化:卷積運算自己有多種算法實現方式,例如滑動窗、im2col + gemm、FFT、Winograd卷積等方式。這些卷積算法在速度上並無絕對的優劣,由於每種算法的效率都很大程度上取決於卷積運算的尺寸。所以,在優化模型時,咱們應該對模型的各個卷積層有針對性的選用效率最高的卷積算法,從而充分利用不一樣卷積算法的優點。
- Fast Algorithms for Convolutional Neural Networks: https://arxiv.org/abs/1509.09308
- Winograd算法解析:http://www.javashuo.com/article/p-hpvnkqmn-dx.html
- 硬件加速:任何模型的運行都須要依託於某種計算平臺來完成,所以咱們能夠直接從計算平臺的硬件設計方面進行加速。目前深度學習模型的主流計算平臺是 GPU,從 Volta 架構開始,GPU 配備了專門用於快速矩陣乘法運算的硬件計算單元 Tensor Core,能夠顯著提高深度學習模型的吞吐量。同時,以低功耗低延遲爲主要特性的 FPGA / ASIC 加速芯片也開始在業界嶄露頭角。
總之,深度學習的模型要真正落地,繞不開對模型進行速度及精度的優化。在模型優化方面,學術界和工業界也都開始發力。創新算法,使用工具,落地案例可能會愈來愈多。架構