OpenHarmony啃論文俱樂部—一種深度神經網壓縮算法
【技術DNA】
【智慧場景】
********** | ******************** | ******************** | ******************** | ******************** | ******************** | ******************** | ******************** | ******************** | ******************** | ******************** | ******************** | ******************** | ******************** | ******************** | ***************** | ***************** |
場景 | 自動駕駛 / AR | 語音信號 | 流視頻 | GPU 渲染 | 科學、云計算 | 內存縮減 | 科學應用 | 醫學圖像 | 數據庫服務器 | 人工智能圖像 | 文本傳輸 | GAN媒體壓縮 | 圖像壓縮 | 文件同步 | 數據庫系統 | 通用數據 |
技術 | 點云壓縮 | ?稀疏快速傅里葉變換? | 有損視頻壓縮 | 網格壓縮 | 動態選擇壓縮算法框架 | 無損壓縮 | 分層數據壓縮 | 醫學圖像壓縮 | 無損通用壓縮 | 人工智能圖像壓縮 | 短字符串壓縮 | GAN 壓縮的在線多粒度蒸餾 | 圖像壓縮 | 文件傳輸壓縮 | 快速隨機訪問字符串壓縮 | 高通量并行無損壓縮 |
開源項目 | ??SFFT?? | ??Ares?? | ??LZ4?? | ??DICOM?? | ??Brotli?? | ??RAISR?? | ??AIMCS?? | ??OMGD?? | ??rsync?? | ??FSST?? | ??ndzip?? |
引言
- 近年來,為了追求讓深度神經網絡(DNNs)在復雜的機器學習任務中能夠表現出更良好的性能,采取了不斷擴大 DNNs 尺寸的方式,這就使模型在內存方面變得越來越復雜,不僅意味著更大的內存需求,還很可能造成更慢的運行時和更多的能量消耗,因此便需要對它們進行有效的壓縮已滿足多方面要求。DeepCABAC 是一種用于 DNN 的通用壓縮算法,它基于應用于 DNN 參數的上下文自適應二進制算術編碼器(CABAC)。CABAC 最初是針對于 H.264 / AVC 視頻編碼標準而設計的,并且成為了視頻壓縮無損壓縮部分的最先進技術。DeepCABAC 運用了一種新的量化方案,實現了最小化信息率失真函數,同時也考慮了量化對 DNN 性能的影響。
- 深度神經網絡成功可以歸因于三個現象:(1)獲得大量數據(2)研究人員設計了新的優化算法和模型架構,允許訓練非常深入的神經網絡(3)增長計算資源的可用性。
- 在資源受限的設備(如移動可穿戴設備)和分布式學習場景(如聯邦學習)上部署深度模型的需求也越來越大。這些方法在隱私、延遲和效率問題上有直接的優勢。然而,這些模型所需參數數量不斷增長,這意味著模型在內存方面變得越來越復雜。高內存復雜性極大地增加了神經網絡在用例中的適用性,特別是在聯邦學習中,因為網絡的參數是通過帶寬有限的通信信道傳輸的。
- 而引出模型壓縮顯得尤為重要:只留下解決任務所需的內存,降低通信和計算成本,壓縮算法有利于生成更高的熵,因為它們使數據更加緊湊。我們使用一個基礎數據集,用各種算法壓縮每個文件。
信源編碼
- 通常所謂的編碼,更確切地說是“壓縮”,即去掉一些多雜的信息一保留必要的信息,再進行傳輸,因此在傳輸前要進行多種處理。其中為 了提高傳輸效率的有效性編碼叫做信源編碼。信源編碼是信息論的一個分支,研究所謂碼的性質。 通常由編碼器和解碼器兩部分組成。
- 如圖,首先,編碼器通過兩個過程將概率源 P(w)的輸入樣本 w 映射到二進制表示b,將輸入量化,將其映射為整數 i = Q(w)。然后,通過一個二值化過程將該整數映射為其對應的二進制表示形式 b = b (i)。 解碼器通過應用逆函數 B?1(B) = i 類比地將二進制表示映射回其整數值,并為其分配一個重構值(或量化點)Q?1(i) = Q。我們強調 Q - 1 不一定是 Q 的倒數。
簡單地說,源編碼研究的是查找最大限度地壓縮一組輸入樣本的代碼,同時在容錯約束下保持輸入值和重構值之間的誤差。我們同時還可以分為兩種類型的碼,所謂的無損碼和有損碼(往期的文章里講述過,感興趣可以回顧,篇幅原因只做簡述)。
無損編碼
- 無損碼也稱熵編碼或可逆編碼:Huffman 編碼、算術編碼、字典編碼。
有損編碼
- 有損碼也稱不可逆碼:標量量化、向量量化、預測編碼、變換編碼、JPEG、子帶編碼、小波編碼、JPEG2000、分析-綜合編碼。
信道編碼
信道是指傳輸信號的通道,但信號在傳輸過程中往往由于各種原因,在傳輸中會產生誤碼,只要接收設備能判別出1碼和0碼,信號就不會丟失,因此,在散字信號傳輸中最重要的,也就是防止誤碼,也就是要盡量降低誤碼率,因此,要在信號源的原數碼序列中用某些編碼,以實現自動糾錯或檢錯的目的,進就是信道編碼或糾錯編碼。
- 人類在信道編碼上的第一次突破發生在1949年。R.Hamming和M.Golay提出了第一個實用的差錯控制編碼方案——漢明碼。
CABAC
CABAC的發展
- 比較早流行的是 H.264/AVC ,CABAC(上下自適應二進制算術編碼Context-adaptive binary arithmetic coding )是一種用于 H.264/AVC 和 HEVC 的熵編碼形式。高效視頻編碼 (HEVC)由視頻編碼聯合協作團隊 (JCT-VC) 開發,它的編碼效率有望比 H.264/AVC 提高 50%。HEVC 使用幾種新工具來提高編碼效率,包括更大的塊和變換大小、額外的環路濾波器和高度自適應的熵編碼。
CABAC的優勢
- 算術編碼是一種熵編碼,它可以通過有效地將符號(即語法元素)映射到具有非整數位數的碼字來實現接近序列熵的壓縮。 在 H.264/AVC 中,CABAC 比基于 Huffman 的 CAVLC 提高了 9% 到 14%。 在 HEVC (HM-3.0) 的早期測試模型中,CABAC 比 CAVLC 提高了 5%–9%。
CABAC涉及三個主要功能
- CABAC 涉及三個主要功能:二值化、上下文建模和算術編碼。
二值化
- 二值化將語法元素映射到二進制符號(bins)。二值化的方案共有7種:
- 一元碼(Unary)。
- 截斷一元碼(TU,Truncated Unary)。
- k階指數哥倫布編碼(kth order Exp-Golomb,EGk)。
- 定長編碼(FL,Fixed-Length)。
- mb_type與sub_mb_type特有的查表方式。
- 4位FL與截斷值為2的TU聯合二值化方案。
- TU與EGk的聯合二值化方案(UEGk,Unary/kth order Exp-Golomb)。
上下文建模
- 以JM中的上下文結構體為例。
//! struct for context management
struct bi_context_type
{
unsigned long count;
byte state; //uint16 state; // index into state-table CP
unsigned char MPS; // Least Probable Symbol 0/1 CP
};
- 上下文包含兩個變量:MPS,pStateIdx(count只是用于計數)。在CABAC編碼的過程中會碰到需要修改這兩個值的情況(如上面的狀態變換),這些修改都是以上下文為單位的。
算術編碼
- 該過程可分為5個步驟
1.通過當前編碼器區間范圍R得到其量化值ρ作為查表索引,然后利用狀態索引pStateIdx與ρ進行查表得出RLPS的概率區間大小。
2.根據要編碼的符號是否是MPS來更新算術編碼中的概率區間起點L以及區間范圍R。
3.pStateIdx==0表明當前LPS在上下文狀態更新之前已經是0.5的概率,那么此時還輸入LPS,表明它已經不是LPS了,因此需要進行LPS、MPS的轉換。
4.更新上下文模型概率狀態。
5.重歸一化,輸出編碼比特。
由上文, 編碼器希望用盡可能少的數據樣本找到一個(本地)解決方案。Deep- CABAC被提出。
Deep- CABAC
Deep- CABAC 的編碼程序
- Deep- CABAC 按行長順序掃描網絡各層的權值參數。
- 選擇一個特定的超參數β,將定義量化點集。
- 對權重值應用量化器,以最小化各自的加權率失真函數。
- 通過應用改編版本的 CABAC 壓縮量化參數。
- 對網絡進行重構,并對網絡的精度進行測量。對于不同的超參數β重復這個過程,直到在精度和網絡大小之間達到預期的平衡。
- 對一組超參數β重復該過程,直到所需的精度 vs。實現了-size 權衡。
Deep-CABAC 編碼器
Deep-CABAC 無損編碼器
- 第一個SigFlag 決定權重元素是否是一個重要元素,即表示權值是否為 0。然后使用二進制算術編碼器對這個 bin 進行編碼,根據其各自的上下文模型(用灰色顏色編碼)。上下文模型最初設置為 0.5(因此,權重元素為 0 或不為 0 的概率為 50%),但隨著 DeepCABAC 編碼更多的元素,將自動適應權重參數的本地統計數據。
- 如果元素不為 0,則根據其各自的上下文模型對符號庫或 SignFlag 進行類似的編碼。
- 一系列容器被類比編碼,確定元素是否大于 1,2,…,n∈n。數字 n 成為編碼器的超參數。
- 剩余部分使用指數-Golomb 編碼代碼,其中一元部分的每個 bin 也相對于它們的上下文模型進行編碼。只有固定長度的代碼部分沒有使用上下文模型進行編碼(用藍色顏色編碼)。
Deep-CABAC 有損編碼器
- 找到將量化點(或聚類中心)最優分配給每個權重參數的量化器 Q。
- 量化點:因為為大量的點找到正確的映射 Q - 1 是非常復雜的,我們用一個特定的步長Δ來約束它們彼此之間的等距離。即,每個點 qk 可以改寫為 qk = ΔIk, ik∈Z。這不僅極大地簡化了問題,而且也鼓勵了定點表示,可以利用定點表示以較低的復雜度執行推理。
- 賦值:因此,量化器有兩個可配置的超參數β = (Δ, λ),前者定義量化點的集合,后者定義量化強度。一旦給定一個特定的元組,量化器 Qβ將通過最小化加權率失真函數 將每個權重參數賦給對應的量化點 qk。
- DeepCABAC-版本1 (DC-v1):在 DC-v1 中,我們首先利用可擴展貝葉斯技術估計 FIM 的對角線。得到了每個參數的平均值μj 和標準差 σj,其中前者可以解釋為其(新的)值(即 wi→μi),而后者則是它們對擾動的“魯棒性”的度量。在估算完 fim -對角線后,我們將考慮的步長集定義如下:
- 其中σmin 為最小標準差,wmax 為幅度值最大的參數。然后 S 是量化器的超參數,控制量化點的 “粗糙程度”。
- DeepCABAC-版本2 (DC-v2):因為版本1需要估計 FIM 的對角線,成本還是很高。考慮對整個 網 絡 直 接 嘗 試 尋 找 一 個 好 的 候 選 集 合 Δ∈{Δ0 , … , Δm?1}。通過應用第一輪網格搜索算法,同時應用最近鄰量化方案(即λ = 0)來實現這一點。在有限的計算預算下,這種方法的優點是我們可以直接搜索更優步長集Δ。
實驗
將標量 huffman、csr-huffman和 bzip2無損編碼算法應用于量化網絡后獲得的最佳壓縮結果。括號內是結果的top-1精度,括號內是通過非零參數的數量除以參數總數所獲得的稀疏比。
深度壓縮包括應用稀疏化技術,然后是k-Means算法,然后是CSR-Huffman熵編碼器,最后是將聚類中心微調到損失函數。相比之下,我們可以通過簡單地 應用DeepCABAC 獲得更高精度的壓縮性能,而無需對量化點進行任何后先驗微調。
使用三種不同的量化器對Small-VGG網進行量化,然后使用不同的通用無損編碼器對它們進行壓縮。具體地,我們利用 DC-v2、加權Lloyd算法和最近鄰量化器對模型進行量化。然后應用標量Huffman代碼、CSR- Huffman代碼 、bzip2算法和DeepCABAC的cabac組件。此外,我們還計算了量化網絡的一階熵,從而測量了網絡的熵無損壓縮所獲得的壓縮比不同。
輕易看到,CABAC 能夠在所有量化版本的 Small-VGG16 網絡中獲得更高的壓縮增益。使用 CABAC 的好處在于其固有的靈活性,它可以用于獲取權重參數的先驗統計數據。DeepCABAC通過定義前文所述的二值化過程,能夠快速捕獲最大值接近于0的單峰分布和非對稱分布的統計信息。此外,也方便CABAC捕獲一行中元素之間的相關性。這也很重要,因為 CABAC的估計是以自回歸的方式更新的,因此,它的壓縮性能也取決于掃描順序。如上表所示,CABAC能夠捕捉權重參數之間的相關性,從而將它們壓縮到參數分布的一階熵之外。與之前提出的通用熵編碼器(如標量 Huffman、CSR-Huffman)相比,由于其平均碼長受到一階熵的限制,因此不可能獲得比 CABAC更低的碼長,因此該特性更加突出了它的優越性。
總結
- H.264/HEVC 和 H.265/HEVC 視頻編碼標準中采用的最先進的通用無損編碼器——上下文的自適應二進制算術編碼器 (CABAC),論文中提出了一種新的深度神經網絡壓縮算法DeepCABAC,碼長更短更靈活,減少訓練次數和大量數據的訪問。技術一代一代更新,后浪奔涌,前浪不是沉舟或病樹,而是巨人的肩膀,引領后輩,奔向更神秘的新世界。