淺談模型壓縮之量化、剪枝、權重共享

深度學習模型的應用必然要面對模型壓縮的問題,訓練出來的原始模型直接放到服務器或終端上跑是不明智的,因為有大量的算力可以省略!

首先明確下模型壓縮的概念,就是在儘可能不改變模型效果的情況下,減少模型的體積,使得模型在使用的時候有更快的速度。

01

業務視角去看模型壓縮的意義

模型壓縮這個概念貌似是最近兩年突然火了起來,究其原因,是因為整個機器學習領域正在逐漸從理論派向工程派延伸。什麼是理論派呢?從業務的角度看,理論派就是做一些理論驗證工作,通過建模證明機器學習在哪個業務能落地。而工程派指的是如何能讓機器學習應用的更高效,模型壓縮就是工程派的一個重要落地方向。

模型壓縮更多地是應用到複雜的深度模型上,並且越來越受到重視,因為當模型的準確度達到一定程度後,如何用更少的硬件成本去做模型服務變的有意義。

舉個例子,比如用深度學習變臉這樣的業務。

淺談模型壓縮之量化、剪枝、權重共享

假設在模型優化前,原始模型處理每個視頻要30秒,那麼一張GPU卡一分鐘只能處理2個視頻。假設APP的使用峰值是1000人同時使用,那麼這家公司至少要有500張GPU卡才能滿足需求,不然就會出現服務排隊現象,500張卡的成本大約在3000萬每年。

如果模型壓縮技術能讓模型變小許多,使得每個視頻處理只需要10秒,那麼這個客戶可能只需要150張卡就能滿足業務需求,每年成本也能控制在1000萬左右。省下的2000萬,就是模型壓縮技術的價值。

02

模型壓縮技術有哪些

目前我自己瞭解到的的模型剪枝技術包含以下幾個方向,

淺談模型壓縮之量化、剪枝、權重共享

(模型構成)

  1. 剪枝 :深度學習模型可以看作是一個複雜樹狀結構,如果能減去一些對結果沒什麼影響的旁枝,就可以實現模型的減小
  2. 量化 :模型由大量的浮點型權重組成,如果能用float32替代原有的float64表示,模型就近乎減小一倍的體積,量化也是最容易實現的一種壓縮方式
  3. 共享權重 :有點像提取公因數,假設模型的每一層都有公用的公因數,是否可以提取出來在結果處做一次運算,而不是每一層都算一次

接下來會針對以上三點逐個介紹。

03

模型剪枝

模型的構成是由許多浮點型的神經元相連接,每一層根據神經元的權重將信息向下傳遞。但是有一些神經元的權重非常小,這類神經元對整個模型的加載的信息的影響也就微乎其微。如果可以把這些權重較小的神經元刪減掉,既減少了模型大小,也不會對模型的效果帶來大的影響。

簡單理解的話如下圖所示:

淺談模型壓縮之量化、剪枝、權重共享

每一層把數值小的神經元去掉,但是究竟剪枝粒度維持到多大是很有講究的,比如可以把每層最小的5個減掉,也可能只剪3個,或者每層有每層不同的策略,也可以用L1/L2正則的方式去做。

剪多了,模型精度影響會比較大,剪少了沒有效果。所以這裡面需要大量的嘗試和迭代,在實踐中,剪枝是一個迭代的過程,這通常叫做「迭代式剪枝」(Iterative Pruning):修剪-訓練-重複(Prune / Train / Repeat)。

既然有大量的迭代驗證工作,是否可以引入AutoML機制,可以通過NAS(神經網絡搜索)的方式探索出剪枝候選集,然後自動的剪枝-》驗證-》迭代。從NAS的角度去實現還是有許多工作可以去做,也是一個熱點話題。

0 4

模型量化

模型的精度量化並不是簡單的將高精度的權重用低精度權重表示就好了,這裡面涉及到許多適配硬件的因素。先來看下神經元權重是如何在計算機裡表示的。 目前DL中大部分都是用32bit float類型進行計算的,bit位數的多少直接限制了數據類型能夠表達的數據範圍,比如float 32的數據是由1bit表示符號,8bit表示整數部,23位表示分數部組成(計算機課都學過的)。

淺談模型壓縮之量化、剪枝、權重共享

用更低位的數值類型意味著更小的數據表示範圍和更稀疏的數值,量化的時候就會造成數值精度損失。比如要把float數值量化 到int類型,那麼首先小數部分會損失,而那些超過int類型能夠表達的範圍的值也會被壓縮到int能夠表達的最大或最小值。

淺談模型壓縮之量化、剪枝、權重共享

所以,如果要壓縮模型,從float32壓縮到多少變的關鍵,目前主流的方式是壓縮到int8。壓縮到int8意味著內存的節省,節約了3/4,同時也提升了計算效率,因為在GPU這樣的硬件上,低位的浮點計算速度會遠遠高於高位浮點計算速度。

淺談模型壓縮之量化、剪枝、權重共享

So,why int 8?有相關的人士分析過,從概率分佈角度去看,int8的字符長度可以較完整的覆蓋大部分的模型權重值。float 32到int8的轉變,只需要一個係數乘積將原有的小數部分變為整數。int 8量化效果在許多論文上可以看到,是目前最主流的模型壓縮方式。

0 5

模型共享權重

共享權重的概念指的是模型在構建的過程中是否有些局部的信息在全局是多次出現並重復使用的,舉一個卷積神經網絡的例子。當CNN模型在識別以下這個圖像的時候,

淺談模型壓縮之量化、剪枝、權重共享

需要卷積核去全圖掃描這個圖像,找出每個邊緣的特點,但是這種對稱圖像一定存在一些形狀的重複性,比如下圖我框出的這些結構。

淺談模型壓縮之量化、剪枝、權重共享

這些重複結構意味著卷積核在計算權重的時候會有部分權重的相似性,這些相似性是全局可共享的。那麼如果可以通過聚類的方式挖掘出這些可以共享的權重係數,並且以類別的方式讓它們共享一些權重,就可以實現模型的壓縮。

下圖表示的就是卷積核中的部分權重是有共享關係的,可以將他們分為4個種類,然後針對類別去更新權值即可。

淺談模型壓縮之量化、剪枝、權重共享

0 6

總結

因為業務需要,最近學習和總結了這篇文章,寫的很簡單,有不清晰或者不正確的地方請指正。另外,從根客戶接觸的情況看,目前模型優化還沒有特別好的自動化工具,很多方法應用到業務中都會造成大規模的模型精度損失,所以目前很多模型壓縮工作需要大量人力介入和反覆調試,希望日後有真正工業級別的壓縮工具誕生。


分享到:


相關文章: