比較常見的有JPEG 也就是JPG的壓縮演算法GIF的索引色壓縮演算法PNG使用從LZ77派生的無損數據壓縮演算法TIFF用的是7z演算法這只是常用圖形文件的壓縮演算法 更詳細的就需要查資料了 我記不住。。
B. 多媒體數據壓縮算術研究 論文筆記
多媒體圖像壓縮技術
姓名:Vencent Lee
摘要:多媒體數據壓縮技術是現代網路發展的關鍵性技術之一。由於圖像和聲音信號中存在各種各樣的冗餘,為數據壓縮提供了可能。數據壓縮技術有無損壓和有損壓縮兩大類,這些壓縮技術又各有不同的標准。
一、多媒體數據壓縮技術
仙農(C.E.Shannon)在創立資訊理論時,提出把數據看作是信息和冗餘度的組合。早期的數據壓縮之所以成為資訊理論的一部分是因為它涉及冗餘度問題。而數據之所以能夠被壓縮是因為其中存在各種各樣的冗餘;其中有時間冗餘性、空間冗餘性、信息熵冗餘、先驗知識冗餘、其它冗餘等。時間冗餘是語音和序列圖像中常見的冗餘,運動圖像中前後兩幀間就存在很強的相關性,利用幀間運動補興就可以將圖像數據的速率大大壓縮。語音也是這樣。尤其是濁音段,在相當長的時間內(幾到幾十毫秒)語音信號都表現出很強的周期性,可以利用線性預測的方法得到較高的壓縮比。空間冗餘是用來表示圖像數據中存在的某種空間上的規則性,如大面積的均勻背景中就有很大的空間冗餘性。信息熵冗餘是指在信源的符號表示過程中由於未遵循資訊理論意義下最優編碼而造成的冗餘性,這種冗餘性可以通過熵編碼來進行壓縮,經常使用的如Huff-man編碼。先驗知識冗餘是指數據的理解與先驗知識有相當大的關系,如當收信方知道一個單詞的前幾個字母為administrato時,立刻就可以猜到最後一個字母為r,那麼在這種情況下,最後一個字母就不帶任何信息量了,這就是一種先驗知識冗餘。其它冗餘是指那些主觀無法感受到的信息等帶來的冗餘。
通常數據壓縮技術可分為無損壓縮(又叫冗餘壓縮)和有損壓縮(又叫熵壓縮)兩大類。無損壓縮就是把數據中的冗餘去掉或減少,但這些冗餘量是可以重新插入到數據中的,因而不會產生失真。該方法一般用於文本數據的壓縮,它可以保證完全地恢復原始數據;其缺點是壓縮比小(其壓縮比一般為2:1至5:1)。有損壓縮是對熵進行壓縮,因而存在一定程度的失真;它主要用於對聲音、圖像、動態視頻等數據進行壓縮,壓縮比較高(其壓縮比一般高達20:1以上。最新被稱為「E—igen—ID」的壓縮技術可將基因數據壓縮1.5億倍)。對於多媒體圖像採用的有損壓縮的標准有靜態圖像壓縮標准(JPEG標准,即『JointPhotographicExpertGroup』標准)和動態圖像壓縮標准(MPEG標准,即『MovingPictureExpertGroup』標准)。
JPEG利用了人眼的心理和生理特徵及其局限性來對彩色的、單色的和多灰度連續色調的、靜態圖像的、數字圖像的壓縮,因此它非常適合不太復雜的以及一般來源於真
實景物的圖像。它定義了兩種基本的壓縮演算法:一種是基於有失真的壓縮演算法,另一種是基於空間線性預測技術(DPCM)無失真的壓縮演算法。為了滿足各種需要,它制定了四種工作模式:無失真壓縮、基於DCT的順序工作方式、累進工作方式和分層工作方式。
MPEG用於活動影像的壓縮。MPEG標准具體包三部分內容:(1)MPEG視頻、(2)MPEG音頻、(3)MP系統(視頻和音頻的同步)。MPEG視頻是標準的核心分,它採用了幀內和幀間相結合的壓縮方法,以離散余變換(DCT)和運動補償兩項技術為基礎,在圖像質量基不變的情況下,MPEG可把圖像壓縮至1/100或更MPEG音頻壓縮演算法則是根據人耳屏蔽濾波功能。利用音響心理學的基本原理,即「某些頻率的音響在重放其頻率的音頻時聽不到」這樣一個特性,將那些人耳完全不到或基本上聽到的多餘音頻信號壓縮掉,最後使音頻號的壓縮比達到8:1或更高,音質逼真,與CD唱片可媲美。按照MPEG標准,MPEG數據流包含系統層和壓層數據。系統層含有定時信號,圖像和聲音的同步、多
分配等信息。壓縮層包含經壓縮後的實際的圖像和聲數據,該數據流將視頻、音頻信號復合及同步後,其數據輸率為1.5MB/s。其中壓縮圖像數據傳輸率為1.2M壓縮聲音傳輸率為0.2MB/s。
MPEG標準的發展經歷了MPEG—I,MPEG一2、MPEG一4、MPEG-7、MPEG一21等不同層次。在MPEG的不同標准中,每—個標准都是建立在前面的標准之上的,並與前面的標准向後的兼容。目前在圖像壓縮中,應用得較多的是MPEG一4標准,MPEG-是在MPEG-2基礎上作了很大的擴充,主要目標是多媒體應用。在MPEG一2標准中,我們的觀念是單幅圖像,而且包含了一幅圖像的全部元素。在MPEG一4標准下,我們的觀念變為多圖像元素,其中的每—個多圖像元素都是獨立編碼處理的。該標准包含了為接收器所用的指令,告訴接收器如何構成最終的圖像。
上圖既表示了MPEG一4解碼器的概念,又比較清楚地描繪了每個部件的用途。這里不是使用單一的視頻或音頻解碼器,而是使用若干個解碼器,其中的每一個解碼器只接收某個特定的圖像(或聲音)元素,並完成解碼操作。每個解碼緩沖器只接收屬於它自己的靈敏據流,並轉送給解碼器。復合存儲器完成圖像元素的存儲,並將它們送到顯示器的恰當位置。音頻的情況也是這樣,但顯然不同點是要求同時提供所有的元素。數據上的時間標記保證這些元素在時間上能正確同步。MPEG一4標准對自然元素(實物圖像)和合成元素進行區分和規定,計算機生成的動畫是合成元素的一個例子。比如,一幅完整的圖像可以包含一幅實際的背景圖,並在前面有一幅動畫或者有另外一幅自然圖像。這樣的每一幅圖像都可以作最佳壓縮,並互相獨立地傳送到接收器,接收器知道如何把這些元素組合在一起。在MPEG一2標准中,圖像被看作一個整體來壓縮;而在MPEG一4標准下,對圖像中的每一個元素進行優化壓縮。靜止的背景不必壓縮到以後的I幀之中去,否則會使帶寬的使用變得很緊張。而如果這個背景圖像靜止10秒鍾,就只要傳送一次(假設我們不必擔心有人在該時間內切人此頻道),需要不斷傳送的僅是前台的比較小的圖像元素。對有些節目類型,這樣做會節省大量的帶寬。MPEG一4標准對音頻的處理也是相同的。例如,有一位獨唱演員,伴隨有電子合成器,在MPEG一2標准下,我們必須先把獨唱和合成器作混合,然後再對合成的音頻信號進行壓縮與傳送。在MPEG一4標准下,我們可以對獨唱作單獨壓縮,然後再傳送樂器數字介面的聲軌信號,就可以使接收器重建伴音。當然,接收器必須能支持MIDI放音。與傳送合成的信號相比,分別傳送獨唱信號和MIDI數據要節省大量的帶寬。其它的節目類型同樣可以作類似的規定。MPEG一7標准又叫多媒體內容描述介面標准。圖像可以用色彩、紋理、形狀、運動等參數來描述,MPEG一7標準是依靠眾多的參數對圖像與聲音實現分類,並對它們的資料庫實現查詢。
二、多媒體數據壓縮技術的實現方法
目前多媒體壓縮技術的實現方法已有近百種,其中基於信源理論編碼的壓縮方法、離散餘弦變換(DCT)和小波分解技術壓縮演算法的研究更具有代表性。小波技術突破了傳統壓縮方法的局限性,引入了局部和全局相關去冗餘的新思想,具有較大的潛力,因此近幾年來吸引了眾多的研究者。在小波壓縮技術中,一幅圖像可以被分解為若干個叫做「小片」的區域;在每個小片中,圖像經濾波後被分解成若干個低頻與高頻分量。低頻分量可以用不同的解析度進行量化,即圖像的低頻部分需要許多的二進制位,以改善圖像重構時的信噪比。低頻元素採用精細量化,高頻分量可以量化得比較粗糙,因為你不太容易看到變化區域的雜訊與誤差。此外,碎片技術已經作為一種壓縮方法被提出,這種技術依靠實際圖形的重復特性。用碎片技術壓縮圖像時需要佔用大量的計算機資源,但可以獲得很好的結果。藉助於從DNA序列研究中發展出來的模式識別技術,能減少通過WAN鏈路的流量,最多時的壓縮比率能達到90%,從而為網路傳送圖像和聲音提供更大的壓縮比,減輕風絡負荷,更好地實現網路信息傳播。
三、壓縮原理
由於圖像數據之間存在著一定的冗餘,所以使得數據的壓縮成為可能。資訊理論的創始人Shannon提出把數據看作是信息和冗餘度(rendancy)的組合。所謂冗餘度,是由於一副圖像的各像素之間存在著很大的相關性,可利用一些編碼的方法刪去它們,從而達到減少冗餘壓縮數據的目的。為了去掉數據中的冗餘,常常要考慮信號源的統計特性,或建立信號源的統計模型。圖像的冗餘包括以下幾種:
(1) 空間冗餘:像素點之間的相關性。
(2) 時間冗餘:活動圖像的兩個連續幀之間的冗餘。
(3) 信息熵冗餘:單位信息量大於其熵。
(4) 結構冗餘:圖像的區域上存在非常強的紋理結構。
(5) 知識冗餘:有固定的結構,如人的頭像。
(6) 視覺冗餘:某些圖像的失真是人眼不易覺察的。
對數字圖像進行壓縮通常利用兩個基本原理:
(1) 數字圖像的相關性。在圖像的同一行相鄰像素之間、活動圖像的相鄰幀的對應像素之間往往存在很強的相關性,去除或減少這些相關性,也就去除或減少圖像信息中的冗餘度,即實現了對數字圖像的壓縮。
(2) 人的視覺心理特徵。人的視覺對於邊緣急劇變化不敏感(視覺掩蓋效應),對顏色分辨力弱,利用這些特徵可以在相應部分適當降低編碼精度,而使人從視覺上並不感覺到圖像質量的下降,從而達到對數字圖像壓縮的目的。
編碼壓縮方法有許多種,從不同的角度出發有不同的分類方法,比如從資訊理論角度出發可分 為兩大類:
(1)冗餘度壓縮方法,也稱無損壓縮,信息保持編碼或熵編碼。具體講就是解碼圖像和壓縮 編碼前的圖像嚴格相同,沒有失真,從數學上講是一種可逆運算。
(2)信息量壓縮方法,也稱有損壓縮,失真度編碼或熵壓縮編碼。也就是講解碼圖像和原始圖像是有差別的,允許有一定的失真。
應用在多媒體中的圖像壓縮編碼方法,從壓縮編碼演算法原理上可以分類為:
(1)無損壓縮編碼種類 •哈夫曼編碼 •算術編碼 •行程編碼 •Lempel zev編碼
(2)有損壓縮編碼種類 •預測編碼:DPCM,運動補償 •頻率域方法:正文變換編碼(如DCT),子帶編碼 •空間域方法:統計分塊編碼 •模型方法:分形編碼,模型基編碼 •基於重要性:濾波,子采樣,比特分配,矢量量化
(3)混合編碼 •JBIG,H261,JPEG,MPEG等技術標准
衡量一個壓縮編碼方法優劣的重要指標
(1)壓縮比要高,有幾倍、幾十倍,也有幾百乃至幾千倍;
(2)壓縮與解壓縮要快,演算法要簡單,硬體實現容易;
(3)解壓縮的圖像質量要好。
四、JPEG圖像壓縮演算法
1..JPEG壓縮過程
JPEG壓縮分四個步驟實現:
1.顏色模式轉換及采樣;
2.DCT變換;
3.量化;
4.編碼。
2.1.顏色模式轉換及采樣
RGB色彩系統是我們最常用的表示顏色的方式。JPEG採用的是YCbCr色彩系統。想要用JPEG基本壓縮法處理全彩色圖像,得先把RGB顏色模式圖像數據,轉換為YCbCr顏色模式的數據。Y代表亮度,Cb和Cr則代表色度、飽和度。通過下列計算公式可完成數據轉換。
Y=0.2990R+0.5870G+0.1140B
Cb=-0.1687R-0.3313G+0.5000B+128
Cr=0.5000R-0.4187G-0.0813B+128
人類的眼晴對低頻的數據比對高頻的數據具有更高的敏感度,事實上,人類
的眼睛對亮度的改變也比對色彩的改變要敏感得多,也就是說Y成份的數據是比較重要的。既然Cb成份和Cr成份的數據比較相對不重要,就可以只取部分數據來處理。以增加壓縮的比例。JPEG通常有兩種采樣方式:YUV411和YUV422,它們所代表的意義是Y、Cb和Cr三個成份的資料取樣比例。
2.2.DCT變換
DCT變換的全稱是離散餘弦變換(Discrete Cosine Transform),是指將一組光強數據轉換成頻率數據,以便得知強度變化的情形。若對高頻的數據做些修飾,再轉回原來形式的數據時,顯然與原始數據有些差異,但是人類的眼睛卻是不容易辨認出來。
壓縮時,將原始圖像數據分成8*8數據單元矩陣,例如亮度值的第一個矩陣內容如下:
JPEG將整個亮度矩陣與色度Cb矩陣,飽和度Cr矩陣,視為一個基本單元稱作MCU。每個MCU所包含的矩陣數量不得超過10個。例如,行和列采樣的比例皆為4:2:2,則每個MCU將包含四個亮度矩陣,一個色度矩陣及一個飽和度矩陣。
當圖像數據分成一個8*8矩陣後,還必須將每個數值減去128,然後一一代入DCT變換公式中,即可達到DCT變換的目的。圖像數據值必須減去128,是因為DCT轉換公式所接受的數字范圍是在-128到+127之間。
DCT變換公式:
x,y代表圖像數據矩陣內某個數值的坐標位置
f(x,y)代表圖像數據矩陣內的數個數值
u,v代表DCT變換後矩陣內某個數值的坐標位置
F(u,v)代表DCT變換後矩陣內的某個數值
u=0 且 v=0 c(u)c(v)=1/1.414
u>0 或 v>0 c(u)c(v)=1
經過DCT變換後的矩陣數據自然數為頻率系數,這些系數以F(0,0)的值最大,稱為DC,其餘的63個頻率系數則多半是一些接近於0的正負浮點數,一概稱之為AC。
3.3、量化
圖像數據轉換為頻率系數後,還得接受一項量化程序,才能進入編碼階段。
量化階段需要兩個8*8矩陣數據,一個是專門處理亮度的頻率系數,另一個則是
針對色度的頻率系數,將頻率系數除以量化矩陣的值,取得與商數最近的整數,
即完成量化。
當頻率系數經過量化後,將頻率系數由浮點數轉變為整數,這才便於執行最
後的編碼。不過,經過量化階段後,所有數據只保留整數近似值,也就再度損失
了一些數據內容,JPEG提供的量化表如下:
2.4、編碼
Huffman編碼無專利權問題,成為JPEG最常用的編碼方式,Huffman編碼通常是以完整的MCU來進行的。
編碼時,每個矩陣數據的DC值與63個AC值,將分別使用不同的Huffman編碼表,而亮度與色度也需要不同的Huffman編碼表,所以一共需要四個編碼表,才能順利地完成JPEG編碼工作。
DC編碼
DC是彩採用差值脈沖編碼調制的差值編碼法,也就是在同一個圖像分量中取得每個DC值與前一個DC值的差值來編碼。DC採用差值脈沖編碼的主要原因是由於在連續色調的圖像中,其差值多半比原值小,對差值進行編碼所需的位數,會比對原值進行編碼所需的位數少許多。例如差值為5,它的二進製表示值為101,如果差值為-5,則先改為正整數5,再將其二進制轉換成1的補碼即可。所謂1的補碼,就是將每個Bit若值為0,便改成1;Bit為1,則變成0。差值5應保留的位數為3,下表即列出差值所應保留的Bit數與差值內容的對照。
在差值前端另外加入一些差值的霍夫曼碼值,例如亮度差值為5(101)的位數為3,則霍夫曼碼值應該是100,兩者連接在一起即為100101。下列兩份表格分別是亮度和色度DC差值的編碼表。根據這兩份表格內容,即可為DC差值加上霍夫曼碼值,完成DC的編碼工作。
AC編碼
AC編碼方式與DC略有不同,在AC編碼之前,首先得將63個AC值按Zig-zag排序,即按照下圖箭頭所指示的順序串聯起來。
63個AC值排列好的,將AC系數轉換成中間符號,中間符號表示為RRRR/SSSS,RRRR是指第非零的AC之前,其值為0的AC個數,SSSS是指AC值所需的位數,AC系數的范圍與SSSS的對應關系與DC差值Bits數與差值內容對照表相似。
如果連續為0的AC個數大於15,則用15/0來表示連續的16個0,15/0稱為ZRL(Zero Rum Length),而(0/0)稱為EOB(Enel of Block)用來表示其後所
剩餘的AC系數皆等於0,以中間符號值作為索引值,從相應的AC編碼表中找出適當的霍夫曼碼值,再與AC值相連即可。
例如某一組亮度的中間符為5/3,AC值為4,首先以5/3為索引值,從亮度AC的Huffman編碼表中找到1111111110011110霍夫曼碼值,於是加上原來100(4)即是用來取[5,4]的Huffman編碼1111111110011110100,[5,4]表示AC值為4的前面有5個零。
由於亮度AC,色度AC霍夫曼編碼表比較長,在此省略去,有興趣者可參閱相關書籍。
實現上述四個步驟,即完成一幅圖像的JPEG壓縮。
C. 序列比對BWA(Burrows-Wheeler Aligner)
BWA主要是將reads比對到大型基因組上,主要功能是:序列比對。首先通過 BWT (Burrows-Wheeler Transformation, BWT壓縮演算法 )為大型參考基因組建立索引,然後將reads比對到基因組。特點是快速、准確、省內存。由三種類似演算法組成:BWA-backtrack,BWA-SW和BWA-MEM。首推BWA-MEM。
0.6版本以來,BWA可以處理長度在4G以上的基因組。這樣有可能將正負鏈互補的基因組序列整合到一個索引(FM-index)中去,可以使BWA-short和BWA-SW更快。
最新版本BWA-SW同樣可以處理長度大於100bp的pair-end reads。與BWA-short相比,BWA-SW對高度唯一的reads准確性更高和相對更長的插入與結構突變時更穩健。盡管如此,從許多次優比對中選取最優比對時,BWA-short更好。
本文主要參考 BWA官方說明文檔 及 BWA手冊
D. 模型壓縮:剪枝演算法
過參數化主要是指在訓練階段,在數學上需要進行大量的微分求解,去捕抓數據中的微小變化信息,一旦完成迭代式的訓練之後,網路模型推理的時候就不需要這么多參數。而剪枝演算法正是基於過參數化的理論基礎而提出的。
剪枝演算法核心思想就是減少網路模型中參數量和計算量,同時盡量保證模型的性能不受影響。
那在AI框架中,實際上剪枝主要作用在右下角的端側模型推理應用場景中,為的就是讓端側模型更小,無論是平板、手機、手錶、耳機等小型IOT設備都可以輕松使用AI模型。而實際在訓練過程更多體現在剪枝演算法和框架提供的剪枝API上面。
實際上大部分剛接觸剪枝演算法的時候,都會從從宏觀層面去劃分剪枝技術,主要是分為Drop Out和Drop Connect兩種經典的剪枝演算法,如下圖所示。
1)Drop Out:隨機的將一些神經元的輸出置零,稱之為神經元剪枝。
2)Drop Connect:隨機將部分神經元間的連接Connect置零,使得權重連接矩陣變得稀疏。
下面會把剪枝的更多種方式呈現出來,可能會稍微復雜哈。從剪枝的粒度來劃分,可以分為結構化剪枝和非結構化剪枝,2個剪枝結構方法。下面來看看具體的剪枝方法有4種:
細粒度剪枝、向量剪枝、核剪枝在參數量與模型性能之間取得了一定的平衡,但是網路模型單層的神經元之間的組合結構發生了變化,需要專門的演算法或者硬體結構來支持稀疏的運算,這種叫做 結構化剪枝(Unstructured Pruning) 。
其中,非結構化剪枝能夠實現更高的壓縮率,同時保持較高的模型性能,然而會帶來網路模型稀疏化,其稀疏結構對於硬體加速計算並不友好,除非底層硬體和計算加速庫對稀疏計算有比較好的支持,否則剪枝後很難獲得實質的性能提升。
濾波器剪枝(Filter-level)主要改變網路中的濾波器組和特徵通道數目,所獲得的模型不需要專門的演算法和硬體就能夠運行,被稱為 結構化剪枝(Structured Pruning) 。結構化剪枝又可進一步細分:可以是channel-wise,也可以是filter-wise,還可以是在shape-wise。
結構化剪枝與非結構化剪枝恰恰相反,可以方便改變網路模型的結構特徵,從而達到壓縮模型的效果,例如知識蒸餾中的student網路模型、NAS搜索或者如VGG19和VGG16這種裁剪模型,也可以看做變相的結構化剪枝行為。
雖然剪枝演算法的分類看上去很多,但是核心思想還是對神經網路模型進行剪枝,目前剪枝演算法的總體流程大同小異,可以歸結為三種:標准剪枝、基於子模型采樣的剪枝、以及基於搜索的剪枝,如下圖所示。
標准剪枝是目前最流行的剪枝流程,在Tensorflow、Pytroch都有標準的介面。主要包含三個部分:訓練、剪枝、以及微調。
1) 訓練 :首先是對網路模型進行訓練。在剪枝流程中,訓練部分主要指預訓練,訓練的目的是為剪枝演算法獲得在特定基礎SOTA任務上訓練好的原始模型。
3) 微調 :微調是恢復被剪枝操作影響的模型表達能力的必要步驟。結構化模型剪枝會對原始模型結構進行調整,因此剪枝後的模型參數雖然保留了原始的模型參數,但是由於模型結構的改變,剪枝後模型的表達能力會受到一定程度的影響。實現上,微調網路模型,參數在計算的時候先乘以該Mask,Mask為1的參數值將繼續訓練通過BP調整梯度,而Mask為0的部分因為輸出始終為0則不對後續部分產生影響。
4) 再剪枝 :再剪枝過程將微調之後的網路模型再送到剪枝模塊中,再次進行模型結構評估和執行剪枝演算法。目的是使得每次剪枝都在性能更優的模型上面進行,不斷迭代式地進行優化剪枝模型,直到模型能夠滿足剪枝目標需求。
最後輸出模型參數儲存的時候,因為有大量的稀疏,所以可以重新定義儲存的數據結構, 僅儲存非零值以及其矩陣位置。重新讀取模型參數的時候,就可以還原矩陣。
除標准剪枝之外,基於子模型采樣的剪枝《EagleEye: Fast sub-net evaluation for efficient neural network pruning》最近也表現出比較好的剪枝效果。得到訓練好的模型之後,進行子模型采樣過程。一次子模型采樣過程為:
1)對訓練好的原模型中可修剪的網路結構,按照剪枝目標進行采樣,采樣過程可以是隨機的,也可以按照網路結構的重要性或者通過KL散度計算進行概率采樣。
2)對采樣後的網路結構進行剪枝,得到采樣子模型。子模型采樣過程通常進行 次,得到 個子模型( ≥1), 之後對每一個子模型進行性能評估。子模型評估結束之後,選取最優的子模型進行微調以得倒最後的剪枝模型。
基於搜索的剪枝主要依靠強化學習等一系列無監督學習或者半監督學習演算法,也可以是神經網路結構搜索相關理論。
給定剪枝目標之後,基於搜索的剪枝在網路結構中搜索較優的子結構,這個搜索過程往往伴隨著網路參數的學習過程,因此一些基於搜索的剪枝演算法在剪枝結束後不需要再進行微調。
這幾年神經網路剪枝pruning作為模型壓縮技術的四小龍之一,正在受到越來越多的關注。當然,各種更好的pruning參數選取方法一定還會層出不窮。另外,從趨勢來看,以下幾個方向值得關註:
打破固定假設 :挑戰已有的固有的假設,例如ICLR2019會議的best paper彩票假說《The Lottery Ticket Hypothesis: Finding Sparse, Trainable Neural Networks 》的出現。還有一開始提到的對於over-parameterization,與重用已有參數是否有有益的反思非常有意思。這樣的工作會給剪枝演算法非常大的啟發,從而根本改變解決問題的思路。
自動化剪枝 :隨著AutoML的大潮,越來越多的演算法開始走向自動化。模型壓縮能拉下嗎?當然不能。經過前面的介紹我們知道,像ADC,RNP,N2N Learning這些工作都是試圖將剪枝中部分工作自動化。如量化中的《HAQ: Hardware-Aware Automated Quantization》考慮網路中不同層信息的冗餘程度不一樣,所以自動化使用混合量化比特進行壓縮。
與NAS融合 :如前面模型剪枝流程中提到,剪枝演算法與神經網路搜索NAS的界限已經模糊了。NAS有針對結構化剪枝進行搜索方法,如One-Shot Architecture Search是先有一個大網路,然後做減法。NAS與模型壓縮兩個一開始看似關系不是那麼大的分支,在近幾年的發展過程中因為下游任務和部署場景的需求,最後似乎會走到一塊去。這兩個分支今天有了更多的交集,也必將擦出更多的火花。
與GAN融合 :這幾年機器學習最火熱的分支之一GAN,正在不斷滲透到已有領域,在pruning中也開始有它的身影。如2019年《Towards Optimal Structured CNN Pruning via Generative Adversarial Learning》讓generator生成裁剪後網路,discrimintor來判別是否屬於原網路還是裁剪後網路,從而進行更有效的網路結構化裁剪。
硬體稀疏性支持 :剪枝會給神經網路模型帶來稀疏性特徵,參數稀疏性在計算中會有大量的索引,所以並不能加速。現在雖然有像cuSPARSE這樣的計算庫,但底層硬體AI晶元本身設計並不是專門為稀疏數據處理打造的。如果能將稀疏計算和處理能力做進晶元那必將極大提高計算效率。僅2021年中國就推出了10+款基於ASIC的AI加速晶元,相信針對稀疏性場景的支持在未來會有所突破。
模型壓縮演算法中針對已有的模型,有:張量分解,模型剪枝,模型量化。針對新構建的網路,有:知識蒸餾,緊湊網路設計等方法。
剪枝只是模型壓縮方法中的一種,它與其它模型壓縮方法並不沖突,因此會與量化、蒸餾、NAS、強化學習等方法慢慢融合,這些都是很值得研究的方向。另外在上面的發展來看,打破固有的假設定義,與NAS、GAN、AutoML、RL等技術進行相互的融合,可能到最後會模糊purning方式,出現新的範式或者壓縮模式也是很吸引的。
E. Elasticsearch之數據壓縮演算法
Lucene使用FST演算法以位元組的方式來存儲所有的Term,重復利用Term Index的前綴和後綴,使Term Index小到可以放進內存,減少存儲空間,不過相對的也會佔用更多的cpu資源。FST在Lucene4.0以後的版本中用於快速定位所查單詞在字典中的位置。
Finite StateTranscers,簡稱 FST,通常中文譯作 有窮狀態轉換器 ,在語音識別和自然語言搜索、處理等方向被廣泛應用。
FST的功能類似於字典,可以表示成FST<Key, Value>的形式。其最大的特點是,可以用 O(length(key)) 的復雜度來找到key對應的value,也就是說查找復雜度僅取決於所查找的key長度。
假設我們現在要將以下term index映射到term dictionary的block序號:
最簡單的做法就是定義個Map<string, integer="">,大家找到自己的位置對應入座就好了,但從內存佔用少的角度想想,有沒有更優的辦法呢?答案就是FST。
對於經典FST演算法來說,要求 Key必須按字典序從小到大加入到FST 中。上面的例子中key已經排好序了。
按照以下步驟建立FST:
最後加入 dogs ,得到最後的結果:
從上圖可以看出,每條邊有兩條屬性,一個表示label(key的元素),另一個表示Value(out)。注意Value不一定是數字,還可一是另一個字元串,但要求Value必須滿足疊加性,如這里的正整數2 + 8 = 10。字元串的疊加行為: aa + b = aab。
建完這個圖之後,我們就可以很容易的查找出任意一個key的Value了。例如:查找dog,我們查找的路徑為:0 → 4 → 8 → 9。 其權值和為: 2 + 0 + 0 + 0 = 2。其中最後一個零表示 node[9].finalOut = 0。所以「dog」的Value為2。
Lucene除了上面說到用FST壓縮term index外,對posting list也會進行壓縮。
有人可能會有疑問:「posting list不是已經只存儲文檔id了嗎?還需要壓縮嗎?」。設想這樣一種情況,Lucene需要對一千萬個同學的性別進行索引,而世界上只有男/女這樣兩個性別,每個posting list都會有數百萬個文檔id,這里顯然有很大的壓縮空間與價值,對於減少索引尺寸有非常重要的意義。
Lucene使用 Frame Of Reference 編碼來實現對posting list壓縮,其思路簡單來說就是: 增量編碼壓縮,將大數變小數,按位元組存儲 。
示意圖如下:
除此之外,Lucene在執行filter操作還會使用一種叫做 Roaring bitmaps 的數據結構來存儲文檔ID,同樣可以達到壓縮存儲空間的目的。
說到Roaring bitmaps,就必須先從bitmap說起。bitmap是一種很直觀的數據結構,假設有某個posting list:
對應的bitmap就是:
非常直觀,用0/1表示某個值是否存在,比如10這個值就對應第10位,對應的bit值是1,這樣用一個位元組就可以代表8個文檔id,舊版本(5.0之前)的Lucene就是用這樣的方式來壓縮的,但這樣的壓縮方式仍然不夠高效,如果有1億個文檔,那麼需要12.5MB的存儲空間,這僅僅是對應一個索引欄位(我們往往會有很多個索引欄位)。於是有人想出了Roaring bitmaps這樣更高效的數據結構。Roaring bitmaps壓縮的原理可以理解為,與其保存100個0,佔用100個bit,還不如保存0一次,然後聲明這個0有100個。
Bitmap的缺點是存儲空間隨著文檔個數線性增長,Roaring bitmaps需要打破這個魔咒就一定要用到某些指數特性:
將posting list按照65535為界限分塊,比如第一塊所包含的文檔id范圍在0 65535之間,第二塊的id范圍65536 131071,以此類推。再用<商,余數>的組合表示每一組id,這樣每組里的id范圍都在0~65535內了,剩下的就好辦了,既然每組id不會變得無限大,那麼我們就可以通過最有效的方式對這里的id存儲。
為什麼是以65535為界限呢?
程序員的世界裡除了1024外,65535也是一個經典值,因為它=2^16-1,正好是用2個位元組能表示的最大數,一個short的存儲單位,注意到上圖里的最後一行「If a block has more than 4096 values, encode as a bit set, and otherwise as a simple array using 2 bytes per value」,如果是大塊,用節省點用bitset存,小塊就豪爽點,2個位元組我也不計較了,用一個short[]存著方便。
那為什麼用4096來區分大塊還是小塊呢?
都說程序員的世界是二進制的,4096*2bytes = 8192bytes < 1KB, 磁碟一次尋道可以順序把一個小塊的內容都讀出來,再大一位就超過1KB了,需要兩次讀。
一種常見的壓縮存儲時間序列的方式是把多個數據點合並成一行。Opentsdb支持海量數據的一個絕招就是定期把很多行數據合並成一行,這個過程叫compaction。類似的vivdcortext使用mysql存儲的時候,也把一分鍾的很多數據點合並存儲到mysql的一行里以減少行數。
這個過程可以示例如下:
合並之後就變成了:
可以看到,行變成了列了。每一列可以代表這一分鍾內一秒的數據。
Elasticsearch有一個功能可以實現類似的優化效果,那就是Nested Document。我們可以把一段時間的很多個數據點打包存儲到一個父文檔里,變成其嵌套的子文檔。示例如下:
可以打包成:
這樣可以把數據點公共的維度欄位上移到父文檔里,而不用在每個子文檔里重復存儲,從而減少索引的尺寸。
在存儲的時候,無論父文檔還是子文檔,對於 Lucene 來說都是文檔,都會有文檔 Id。但是對於嵌套文檔來說,可以保存起子文檔和父文檔的文檔 id 是連續的,而且父文檔總是最後一個。有這樣一個排序性作為保障,那麼有一個所有父文檔的 posting list 就可以跟蹤所有的父子關系。也可以很容易地在父子文檔 id 之間做轉換。把父子關系也理解為一個 filter,那麼查詢時檢索的時候不過是又 AND 了另外一個 filter 而已。前面我們已經看到了 Elasticsearch 可以非常高效地處理多 filter 的情況,充分利用底層的索引。
使用了嵌套文檔之後,對於 term 的 posting list 只需要保存父文檔的 doc id 就可以了,可以比保存所有的數據點的 doc id 要少很多。如果我們可以在一個父文檔里塞入 50 個嵌套文檔,那麼 posting list 可以變成之前的 1/50。
F. linux zip和gzip的區別
zip是將文件打包為zip格式的壓縮文件
gzip是將文件打包為tar.gz格式的壓縮文件
unzip是從zip包中解壓出某個文件
gunzip從tar.gz包中解壓出某個文件
locate命令和find命令都用於查找文件,locate比find命令的搜索速度快,它需要一個資料庫,稱為「索引」,這個資料庫由每天的例行工作(crontab)程序來建立。當我們建立好這個資料庫後,就可以方便地來搜尋所需文件了。
find命令在目錄結構中搜索文件,並執行指定的操作。此命令提供了相當多的查找條件,功能很強大。 但搜索速度可能不如locate命令快
grep命令是用來列出符合指定樣式的那一行或者若干行內容
如ls |grep c 是列出當前目錄下中含有字母c的所有項
全部手敲出來的~望採納
G. 什麼是壓縮演算法
LZW壓縮演算法的基本概念:LZW壓縮有三個重要的對象:數據流(CharStream)、編碼流(CodeStream)和編譯表(String Table)。在編碼時,數據流是輸入對象(文本文件的據序列),編碼流就是輸出對象(經過壓縮運算的編碼數據);在解碼時,編碼流則是輸入對象,數據流是輸出對象;而編譯表是在編碼和解碼時都須要用藉助的對象。字元(Character):最基礎的數據元素,在文本文件中就是一個位元組,在光柵數據中就是一個像素的顏色在指定的顏色列表中的索引值;字元串(String):由幾個連續的字元組成; 前綴(Prefix):也是一個字元串,不過通常用在另一個字元的前面,而且它的長度可以為0;根(Root):一個長度的字元串;編碼(Code):一個數字,按照固定長度(編碼長度)從編碼流中取出,編譯表的映射值;圖案:一個字元串,按不定長度從數據流中讀出,映射到編譯表條目. LZW壓縮演算法的基本原理:提取原始文本文件數據中的不同字元,基於這些字元創建一個編譯表,然後用編譯表中的字元的索引來替代原始文本文件數據中的相應字元,減少原始數據大小。看起來和調色板圖象的實現原理差不多,但是應該注意到的是,我們這里的編譯表不是事先創建好的,而是根據原始文件數據動態創建的,解碼時還要從已編碼的數據中還原出原來的編譯表.
H. ETC1壓縮演算法詳解
ETCPACK
如何將一個 4x4 的像素塊編碼為 64 位數據呢?
以上就是編碼後的 64 位數據塊表示的意義
以RGB555基本色和RGB3333顏色差表示的編碼為例,每個4x4 像素塊經過ETC1 編碼後的 64 位數據的內存布局大概是這樣
假如編碼前像素塊表示為下圖
我們需要得到圖中編號2對應像素的顏色,需要進行如下的解碼步驟:
indivial 模式,直接將4位數復制到尾部,得到8位
differential 模式,將5位中的高3位復制到尾部,得到8位
differential 模式,一定是將子塊1基本色和子塊2偏移值相加後再進行補位
上面知道目標像素位於子塊2,這里還需要從編碼數據的34-36獲得子塊2的修正表索引,得到索引為(1,1,0)=6,根據上面的映射表,根據下標(6, -b) 可以索引到像素的顏色差值為-106
其實從上面的解壓過程可以推測出編碼的過程
參考:
UI圖集壓縮優化,以及對Dither和ETC1演算法的深入了解
幾種主流貼圖壓縮演算法的實現原理詳解
OES_compressed_ETC1_RGB8_texture