自動模型壓縮與架構搜尋,這是飛槳PaddleSlim最全的解讀

机器之心發表於2019-07-10
剪枝、量化到輕量級神經網路架構搜尋與自動模型壓縮,越來越強大的飛槳 PaddleSlim 已經模型瘦身提供了一系列高效工具。

近年來,深度學習技術在很多方向都取得了巨大的成功,但由於深度神經網路計算複雜度高,模型引數量大,限制了其在一些場景和裝置上進行部署,特別是在移動嵌入式裝置的部署。因此,模型小型化技術成為最近幾年學術界和工業界研究的熱點,模型小型化技術也從最開始的網路剪枝、知識蒸餾、引數量化等發展為最新的神經網路架構搜尋(NAS)和自動模型壓縮等技術。

飛槳核心框架 Paddle Fluid v1.5 版本,PaddleSlim 也釋出了最新升級,新增支援基於模擬退火的自動剪下策略和輕量級模型結構自動搜尋功能(Light-NAS)。

PaddleSlim 簡介

PaddleSlim 是百度飛槳 (PaddlePaddle) 聯合視覺技術部釋出的模型壓縮工具庫,除了支援傳統的網路剪枝引數量化和知識蒸餾等方法外,還支援最新的神經網路結構搜尋和自動模型壓縮技術。

PaddleSlim 工具庫的特點

介面簡單

  • 以配置檔案方式集中管理可配引數,方便實驗管理

  • 在普通模型訓練指令碼上,新增極少程式碼即可完成模型壓縮

效果好

  • 對於冗餘資訊較少的 MobileNetV1 和 MobileNetV2 模型,卷積核剪下工具和自動網路結構搜尋工具依然可縮減模型大小,並保持儘量少的精度損失。

  • 蒸餾壓縮策略可明顯提升原始模型的精度。

  • 量化訓練與蒸餾的組合使用,可同時做到縮減模型大小和提升模型精度。

  • 網路結構搜尋工具相比於傳統 RL 方法提速幾十倍。

功能更強更靈活

  • 剪下壓縮過程自動化

  • 剪下壓縮策略支援更多網路結構

  • 蒸餾支援多種方式,使用者可自定義組合 loss

  • 支援快速配置多種壓縮策略組合使用

PaddleSlim 工具庫的功能列表

模型剪裁

  • 支援通道均勻模型剪裁(uniform pruning)、基於敏感度的模型剪裁、基於進化演算法的自動模型剪裁三種方式

  • 支援 VGG、ResNet、MobileNet 等各種型別的網路

  • 支援使用者自定義剪裁範圍

量化訓練

  • 支援動態和靜態兩種量化訓練方式


    • 動態策略: 在推理過程中,動態統計啟用的量化引數

    • 靜態策略: 在推理過程中,對不同的輸入,採用相同的從訓練資料中統計得到的量化引數

  • 支援對權重全域性量化和 Channel-Wise 量化

  • 支援以相容 Paddle Mobile 的格式儲存模型

蒸餾

  • 支援在 teacher 網路和 student 網路任意層新增組合 loss


    • 支援 FSP loss

    • 支援 L2 loss

    • 支援 softmax with cross-entropy loss

輕量級神經網路結構自動搜尋

  • 支援百度自研的基於模擬退火的輕量模型結構自動搜尋 Light-NAS

自動模型壓縮

  • 支援基於模擬退火自動網路剪枝

其它功能

  • 支援配置檔案管理壓縮任務超引數

  • 支援多種壓縮策略組合使用

PaddleSlim 應用效果

經典壓縮 Benchmark

自動模型壓縮與架構搜尋,這是飛槳PaddleSlim最全的解讀

Light-NAS Benchmark

自動模型壓縮與架構搜尋,這是飛槳PaddleSlim最全的解讀

Light-NAS 百度業務應用效果

自動模型壓縮與架構搜尋,這是飛槳PaddleSlim最全的解讀

輕量級模型搜尋詳解

1、自動網路結構搜尋

網路結構的好壞對最終模型的效果有非常重要的影響,高效的網路結構可以可以用較少的計算量獲得較高的精度收益,比如 MobileNet,ShuffleNet 等,但手工設計網路需要非常豐富的經驗和眾多嘗試,並且眾多的超引數和網路結構引數會產生爆炸性的組合,常規的 random search 幾乎不可行,因此最近幾年神經網路架構搜尋技術(Neural Architecture Search)成為研究熱點。

區別於傳統 NAS,我們專注在搜尋精度高並且速度快的模型結構,我們將該功能統稱為 Light-NAS。網路結構搜尋關鍵的幾個要素一般包括搜尋策略、搜尋目標評估方法、搜尋空間定義和搜尋速度優化。

  • 搜尋策略

搜尋策略定義了使用怎樣的演算法可以快速、準確找到最優的網路結構引數配置。常見的搜尋方法包括:強化學習、貝葉斯優化、進化演算法、基於梯度的演算法等。

早期的 NAS 方法中,強化學習使用的比較多。強化學習(Reinforcement learning,簡稱 RL)是機器學習中的一個領域,強調如何基於環境而行動,以取得最大化的預期利益。強化學習是一種非常有意思的正規化,幾乎只要可以提煉出強化學習四要素,原問題就可以用強化學習來求解。

論文「NEURAL ARCHITECTURE SEARCH WITH REINFORCEMENT LEARNING」將架構的生成看成是一個 agent 在選擇 action,reward 是通過在訓練集上訓練一定的 epochs 後的精度。在具體的實現過程中,用 RNN 作為控制器來表示策略函式,每次通過 RNN 生成一串編碼,通過一個對映函式將編碼對映成網路結構,並使用 policy gradient 來優化 RNN 控制器的引數,如圖 1 所示。

自動模型壓縮與架構搜尋,這是飛槳PaddleSlim最全的解讀

圖 1

強化學習策略計算複雜度高、耗時長,因此 PaddleSlim 選用了經典的組合優化策略模擬退火。模擬退火演算法來源於固體退火原理,將固體加溫至充分高,再讓其徐徐冷卻,加溫時,固體內部粒子隨溫升變為無序狀,內能增大,而徐徐冷卻時粒子漸趨有序,在每個溫度都達到平衡態,最後在常溫時達到基態,內能減為最小。鑑於物理中固體物質的退火過程與一般組合優化問題之間的相似性,我們將其用於網路結構的搜尋。

在 PaddleSlim 的 NAS 任務中,採用了百度自研的基於模擬退火的搜尋策略,區別於 RL 每次重新生成一個完整的網路,我們將網路結構對映成一段編碼,第一次隨機初始化,然後每次隨機修改編碼中的一部分(對應於網路結構的一部分)生成一個新的編碼,然後將這個編碼再對映回網路結構,通過在訓練集上訓練一定的 epochs 後的精度以及網路延時融合獲得 reward,來指導退火演算法的收斂,如圖 2 所示。

自動模型壓縮與架構搜尋,這是飛槳PaddleSlim最全的解讀

圖 2

  • 搜尋目標評估方法

相比一般的網路搜尋技術,在模型小型化方向,不僅要考慮模型的精度,同時要考慮模型的執行效率,論文「MnasNet」同時將模型的精度以及在手機上執行的時間加權計算作為最終的 reward。

由於每次在手機上執行網路獲得延時操作非常繁瑣並且耗時,論文「ChamNet」提出將網路結構拆解成若干可窮舉的 OP,在手機上執行每個 OP 獲得延時並建立一個查詢表 LUT,這樣每次只需要通過查表並累加各個 OP 的時間就可以快速獲得模型整體的執行耗時。PaddleSlim 也正在進行相關功能研發,即將開源,敬請期待。

  • 搜尋空間定義

搜尋空間定義了優化問題的變數,變數規模決定了搜尋演算法的難度和搜尋時間。因此為了加快搜尋速度,定義一個合理的搜尋空間至關重要,早期的 NAS 因為沒有限制搜尋空間,甚至需要使用 800 塊 GPU 訓練一個月才能收斂。

為了加快收斂速度,論文「Learning Transferable Architectures for Scalable Image Recognition」將網路拆分為多個 Normall Cell 和 Reduction Cell,只搜尋這兩個子模組中的拓撲結構,然後人工堆疊成最終的網路結構,如圖 3 所示。

自動模型壓縮與架構搜尋,這是飛槳PaddleSlim最全的解讀

圖 3

在模型小型化方向,為了使搜尋到的結構儘量高效,PaddleSlim 參考了 MobileNetV2 中的 Linear Bottlenecks 和 Inverted residuals 結構,搜尋每一個 Inverted residuals 中的具體引數,包括 kernelsize、channel 擴張倍數、重複次數、channels number,如圖 4 所示。

自動模型壓縮與架構搜尋,這是飛槳PaddleSlim最全的解讀

圖 4

  • 搜尋速度優化

最後在搜尋速度優化方面,為了減少取樣的網路訓練時間,一般採用提前終止的策略,只訓練少量 epochs 數獲得其在驗證集上的精度作為 reward。

最新的一些文章考慮使用引數共享的方案,如論文「Efficient Neural Architecture Search via Parameter Sharing」共享 OP 的引數,而進行拓撲結構的搜尋,另外論文「Darts: Differentiable architecture search」基於可微分搜尋空間的方案也能加快搜尋速度,如圖 5,不過其無法搜尋 channel 數量,這對於高效的網路結構設計有比較大的限制。PaddleSlim 也正在做這個方向的探索。

自動模型壓縮與架構搜尋,這是飛槳PaddleSlim最全的解讀

圖 5

2、自動模型壓縮

自動模型壓縮相比 NAS 而言,不是一個從無到有的過程,而是在一個已有的模型(訓練好的)基礎上進行壓縮裁剪,在保證精度的同時,快速獲得一個更快、更小的模型。目前傳統的剪枝、量化、蒸餾這些人工壓縮方法,一方面需要使用者瞭解演算法原理和實現細節,另一方面在使用時有大量繁瑣的調參工作,特別是對於模型剪枝,不同任務的最優引數差異很大,因此,如何用機器代替人工,自動搜尋出最合適的引數變得非常重要。

在眾多的壓縮加速方法中,通道剪枝已經被證明非常有效,並在實際業務中廣泛應用。通道剪枝壓縮後模型不僅在大小上有收益,並且不需要依賴特殊的預測庫就能加速,但由於神經網路中不同層的允餘程度不同,並且不同層之間存在相互依賴關係,如何確定每一層的壓縮率變得十分困難,論文「AMC: AutoML for Model Compression and Acceleration on Mobile Devices」提出使用強化學習搜尋每一層最優的剪枝比例。

搜尋策略採用 actor-critic 架構的 DDPG 演算法,從網路的第一層開始,Actor 網路輸入每層的相關引數(input_size、kernel_size、filter_num、stride、flops 等),輸出一個(0~0.8)連續值,表示這層的剪枝率,直到模型的最後一層,然後根據輸出的壓縮率對網路進行裁剪,並將裁剪後的模型在 validation set 上測試得到裁剪後的網路精度作為 reward 來指導 ddpg 收斂,整體的流程如圖 6。

自動模型壓縮與架構搜尋,這是飛槳PaddleSlim最全的解讀

圖 6

PaddleSlim 基於模擬退火演算法實現了類似的功能,搜素速度有明顯的提升。具體的實現方法中,我們將網路的壓縮率編碼成一個向量,向量中每一維表示某一層的壓縮率(取值範圍為 0~0.8),初始狀態下,隨機生成一個向量,然後用向量中的壓縮率裁剪整個網路,和用強化學習一樣,我們將裁剪後的網路在 validation set 上測試得到裁剪後的網路精度,並使用的延時評估器獲取裁剪後網路的速度,將延時和精度融合後得到最終的 reward。

每次結束後,我們會隨機改變向量中某一維(也可以是多維),得到網路一個新的裁剪率,根據這個新的向量裁剪網路並獲取 reward,根據當前 reward 和前一個狀態的 reward 的關係來指導退火演算法收斂。

剪枝類似,在引數量化方向,論文「HAQ: Hardware-Aware Automated Quantization」搜尋出每層最優量化位寬已達到最佳的整體量化收益。整體框架和搜尋剪枝的類似,如圖 7 所示。

自動模型壓縮與架構搜尋,這是飛槳PaddleSlim最全的解讀

圖 7

未來 PaddleSlim 也將支援類似的功能。

經典模型壓縮技術詳解

PaddleSlim 除了支援新增的基於模擬退火的自動剪下策略和輕量級模型結構自動搜尋功能(Light-NAS)以外,之前的版本中已經支援了經典的模型壓縮技術,如網路剪枝引數量化和模型蒸餾等。

一. 剪枝

網路剪枝是將訓練好的模型中的允餘引數去掉,達到減小模型引數量和計算量的目的。在眾多剪枝方法中,可以根據被裁剪的引數是否具有結構化的資訊分為細粒度剪枝和結構化剪枝兩類。

1、細粒度剪枝

細粒度剪枝主要用於壓縮模型的大小,比較有名的是韓鬆在論文【Deep Compression:Compressing Deep NeuralNetworks with Pruning, Trained Quantization and Huffman Coding】中提出的方法,主要包含剪枝、量化和哈弗曼編碼三個步驟。

其具體的思想是認為網路中權值越靠近 0 的神經元對網路的貢獻越小,剪枝的過程就是對每一層神經元的權重按照絕對值排序,按一定的比例裁剪掉最小的一部分,使得這些神經元不啟用,為了保證剪枝後網路的精度損失儘量小,每次裁剪後都會對保留的非零權重進行 fine-tuning,最終能將模型大小減小 9~13 倍。

為了進一步壓縮模型大小,對於剪枝後稀疏的神經元,通過量化編碼,將連續的權值離散化,從而用更少位元數來儲存浮點權值,如圖 8 所示。最後再通過霍夫曼編碼進一步壓縮模型大小,最終可以在不損失精度的情況下將模型大小壓縮 35 到 49 倍。

細粒度剪枝雖然能達到較高的壓縮比,但稀疏的權值沒有結構化的資訊,如果不依賴特定預測庫或硬體的優化,模型在實際執行中並不能加速,並且佔用的記憶體也和未壓縮前一樣。所以細粒度的剪枝方法目前使用的相對比較少,因此 PaddleSlim 中暫未支援。

自動模型壓縮與架構搜尋,這是飛槳PaddleSlim最全的解讀

圖 8

2、結構化剪枝

相比細粒度剪枝隨機地裁剪掉網路中的若干的神經元,結構化剪枝以一定的結構為單位進行剪枝,如裁剪掉卷積層中若干 filter,如圖 9 所示。裁剪後的模型相比原始模型,只是 channel 數量減小,不需要額外的預測庫支援就能達到加速的目的,因此結構化剪枝是目前使用較多,也是 PaddleSlim 中支援的剪枝方案。

自動模型壓縮與架構搜尋,這是飛槳PaddleSlim最全的解讀

圖 9

剪枝的過程中,如何確定每層的最優剪枝比例和具體要裁剪的 filter,來達到整個模型的最優壓縮比是該方法中要解決的問題,對於選擇哪些 filter 進行裁剪,常規的方案和細粒度剪枝類似,對不同 filter 的引數計算了 l1_norm,選擇值較小的 filter 進行裁剪。

對於每層裁剪的比例,常規的方法是網路中所有層使用同樣的比例,沒有考慮到模型中不同層引數允餘程度的差異性。

論文【Pruning Filters for Efficient ConvNets】提出了一種基於敏感度的剪枝策略,通過不同層對剪枝的敏感度來決定裁剪比例,每層敏感度的計算方法是使用不同裁剪比例對該層進行剪枝,評估剪枝後模型在驗證集上的精度損失大小,對於剪枝比例越大,但精度損失越小的層,認為其敏感度越低,可以進行較大比例的裁剪,如圖 9 所示。

由於每次剪枝完在驗證集上進行評估的開銷比較大,該方法在計算敏感度時每次只對其中的一層進行剪枝,沒有考慮到不同層之間的相關性,所以實際的敏感度並不是非常準確。

自動模型壓縮與架構搜尋,這是飛槳PaddleSlim最全的解讀

圖 10

二、量化

很多嵌入式晶片中都設計有各種位寬的乘法器,將神經網路中 32 位的全精度資料處理成 8 位或 16 位的定點數,同時結合硬體指定的乘法規則,就可以實現低記憶體頻寬、低功耗、低計算資源佔用以及低模型儲存需求等。

1、8bit 量化

自動模型壓縮與架構搜尋,這是飛槳PaddleSlim最全的解讀

圖 11

低精度定點數操作的硬體面積大小及能耗比高精度浮點數要少幾個數量級,如圖 11 所示。使用 8bit 定點量化可帶來 4 倍的模型壓縮、4 倍的記憶體頻寬提升,以及更高效的 cache 利用 (很多硬體裝置,記憶體訪問是主要能耗)。除此之外,計算速度也通常具有 2~3 倍的提升。另外在很多場景下,定點量化操作對精度並不會造成損失。

目前量化方法主要分為兩大類:Post Training Quantization 和 Quantization Aware Training。Post Training Quantization 是指使用 KL 散度、滑動平均等方法確定量化引數,量化過程不需要重新訓練。

Quantization Aware Training 是對量化後的模型進行 fine-tuning,通過量化模型產生的梯度更新模型引數,以恢復由於量化而造成的精度損失,它與 Post Training Quantization 模式相比可以提供更高的預測精度。PaddleSlim 實現了 Quantization Aware Training 量化方式。

2、二值神經網路

為了進一步壓縮網路的計算量,在 8bit 量化的基礎上,論文「Binaryconnect: Training deep neural networks with binary weights during propagations」和「BinaryNet: Training Deep Neural Networks with Weights and Activations Constrained to +1 or −1」分別提出了二值權重網路和二值神經網路的概念。

二值權重網路是將網路的權重量化成+1、-1 兩個數,對預測過程中的啟用值不做量化。這樣一方面權重可以用更低的位元數(1bit)來儲存達到壓縮模型大小的目的,另一方面,原本網路計算中的浮點運算可以被加法代替達到加速的目的。

由於計算機底層硬體在實現兩個 n 位寬資料的乘法運算時必須完成 2*n 位寬度的邏輯單元處理,而同樣資料在執行加法時只需要 n 個位寬的邏輯單元處理,因此理論上可以得到 2 倍的加速比。

二值神經網路是在二值權重網路的基礎上對網路中間啟用值也進行二值量化,這樣網路中所有的參與運算的資料都量化成了+1、-1 兩個數,權重值和啟用值都進行二值化之後,原來 32 位浮點型數的乘加運算,可以通過一次異或運算和一次 popcnt(population count 統計有多少個為 1 的位) 運算解決,極大地壓縮了計算量,從而達到加速的目的。

不過通過大量實驗表明,二值權重網路和二值神經網路的適應性還不是很強,在很多工上都有較大的精度損失,且對硬體和預測庫的優化要求比較高,因此這些方法目前還不是很普及,所以 PaddleSlim 暫未支援。

四、知識蒸餾

一般情況下,模型引數量越多,結構越複雜,其效能越好,但引數也越允餘,運算量和資源消耗也越大;知識蒸餾是將複雜網路中的有用資訊提取出來,遷移到一個更小的網路中去,以達到模型壓縮的效果。

1、傳統方案

知識蒸餾最早由 Hinton 在 2015 年提出,核心思想是用一個或多個訓練好的 teacher(大模型)指導 student(小模型)進行訓練,在論文「Distilling the Knowledge in a Neural Network」中,對於分類任務要學習的目標,將圖片實際的類別概率資訊稱為 hard target(只有真實類別對應的概率為 1,其他為 0),而模型輸出的類別概率資訊稱為 soft target(各個類別概率都為一個大於 0 的值)。

由於類別之間具有相關性,soft target 相比 hard target 具有更高的資訊熵,比如一張貓的圖片,在 soft target 中,其分到狗的概率一般會大於分到汽車的概率,而不是 hard target 中將它們都設定為 0,導致沒有區別。

使用大模型產生 soft target 代替 hard target 能獲得更多的資訊和更小的梯度方差,可以達到更好的效能。一般模型蒸餾的流程如下,先訓好一個大模型,讓後讓小模型去擬合大模型產生的 soft target,在蒸餾結束後,一般還會使用真實的 label 資訊進行 fine-tuning,如圖 12 所示。

自動模型壓縮與架構搜尋,這是飛槳PaddleSlim最全的解讀

圖 12

另外,為了使 soft target 中各個類別的概率值更加平滑,文章中還引入了一個溫度係數 T 的概念,對大模型輸出的概率值做一個平滑處理,具體如下面公式。

自動模型壓縮與架構搜尋,這是飛槳PaddleSlim最全的解讀

T 一般被設定成一個大於 1 的數,值越大輸出的概率值越平滑。

2、fsp 方案

相比傳統的蒸餾方法直接用小模型去擬合大模型產生的 soft target,論文「A Gift from Knowledge Distillation: Fast Optimization, Network Minimization and Transfer Learning」用小模型去擬合大模型不同層特徵之間的轉換關係(flow of the solution procedure),其用一個 FSP 矩陣(特徵的內積)來表示不同層特徵之間的關係,計算公式如下:

自動模型壓縮與架構搜尋,這是飛槳PaddleSlim最全的解讀

大模型和小模型不同層之間分別獲得多個 FSP 矩陣,對於 Resnet 網路結構,每個 stage 可產生一個 FSP 矩陣,然後使用 L2 loss 讓小模型的對應層 FSP 矩陣和大模型對應層的 FSP 矩陣儘量一致。

自動模型壓縮與架構搜尋,這是飛槳PaddleSlim最全的解讀

整個過程如圖 13 所示。

自動模型壓縮與架構搜尋,這是飛槳PaddleSlim最全的解讀

圖 13

這種方法的優勢,通俗的解釋是,比如將蒸餾類比成 teacher(大模型)教 student(小模型)解決一個問題,傳統的蒸餾是直接告訴小模型問題的答案,讓小模型學習,而學習 FSP 矩陣是讓小模型學習解決問題的中間過程和方法,因此其學到的資訊更多,最終效果也更好。

下載最新版本的Paddle Fluid v1.5,請檢視以下連結:http://www.paddlepaddle.org.cn?fr=jqzx

ps:最後給大家推薦一個GPU福利-Tesla V100免費算力!配合PaddleHub能讓模型原地起飛~掃碼下方二維碼申請~

自動模型壓縮與架構搜尋,這是飛槳PaddleSlim最全的解讀

相關文章