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