關於資料壓縮、信源編碼、赫夫曼碼的一些研究,以及由此引出對決策樹模型的資訊理論本質的思考

鄭瀚Andrew.Hann發表於2019-08-13

1. 關於資料壓縮

0x1:什麼是資料壓縮?為什麼要進行資料壓縮?

從資訊理論的角度來看資料壓縮,本質上就是通過尋找一種編碼方案,在不損失或者儘量少損失原始信源訊號的前提下,將原始信源訊號對映到另一個D元碼字空間上。

在機器學習中,我們經常討論到的”模型訓練“,其本質上就是在尋找一個”信源對映函式“,例如線性迴歸的迴歸引數,就是一種信源對映函式,可以將輸入空間X,一一對映到Y空間,所以,得到了一組模型引數,本質上就是得到了一個信源對映函式,此後,就可以由模型引數代替原始的樣本資料。

回到資訊理論資料壓縮的話題,資訊理論資料壓縮討論和定義的是:在信源對映函式中,應該將哪些碼字分配給哪些信源,怎麼分配是最優的,即節省傳輸開銷的。

本文通過討論資訊壓縮的基本臨界值(即最短碼字長度),從另一個方面來看熵的定義和合理性。通過對資料來源中最頻繁出現的結果分配較短的描述,而對不經常出現的結果分配較長的描述,可達到壓縮資料的目的。

0x2:關於壓縮編碼的幾個例子

1. 信源編碼的定義

資料壓縮的的本質是找到一種高效的壓縮編碼方案,這小節我們先定義一下信源編碼的一些形式化定義與記號,然後一起來看幾個關於壓縮編碼的例子。

關於隨機變數X的信源編碼C是從X的取值空間X到D*的一個對映,其中D*表示D元字母表D上有限長度的字串所構成的集合,用C(x)表示x的碼字並用 l(x) 表示C(x)的長度。

設隨機變數X的概率密度函式為p(x),定義信源編碼C(x)的期望長度L(C)(expected length)為

,其中l(x)表示對應於x的碼字的長度

另外,不是一般性,可以假定D元字母表為D={0,1,....,D-1}

2. 等比例碼字編碼舉例

所謂等比碼字編碼,就是指對信源裡的所有訊號都採用相同長度的碼字,例如:

C(紅)=00,C(藍)=11,是X={紅,藍}關於字母表D={0,1}的一個信源編碼。

3. 對非等概隨機變數進行非等比例編碼舉例

設隨機變數X的分佈及其碼字分配如下:

可知X的熵H(X) = 1/2 * 1 + 1/4 * 2 + 1/8 * 3 + 1/8 * 3 = 1.75位元。而期望長度L(C) = El(X) = 1.75位元。

這裡,我們看到一個期望長度正好等於其熵值的編碼,仔細對比會發現在該編碼方案下,熵的計算公式和期望長度的計算公式是完全相同的。

另外,注意到這個編碼方案是可逆的,任何一個位元序列都可以唯一地解碼成關於X中的字元序列,例如,位元串010111100110解碼後為134213。

4. 對等概隨機變數機械能給你非等比例編碼舉例

繼續沿著上面那個例子的討論,假設這次隨機變數是一個均勻分佈,但這次不像第一個例子採用等比例編碼,而是採用變長編碼,如下:

正如前面的例子一樣,該編碼也是唯一可譯的,但這種的編碼方案的熵為log3 = 1.58位元,而編碼的期望長度為1.66位元,即此時

為什麼會這樣呢?發生了什麼事呢?

簡單的解釋就是:這個例子中的編碼方案不是最優的,之所以期望長度比熵要大,是因為使用了多餘的碼字來對信源訊號進行編碼。

5. 莫爾斯碼

莫爾斯碼是關於英文字母表的一個相當有效的編碼方案。

  • 使用四個字元的字母表:點、劃、字母間隔、單詞間隔
  • 使用短序列表示頻繁出現的字母(例如,用單個點表示E),而用長序列表示不經常出現的字母(例如,Q表示為”劃,劃,點,劃”)

需要注意的是,對於四字元的字母表來說,莫斯編碼並非最佳表示,因為依此方式,許多可能的碼字未被使用(碼字空間沒有被充分利用,這和前一個例子犯了同樣的錯誤)。

夏農在1948年的開創性論文中解決了對英文字母最佳編碼方案的搜尋問題,該問題也與磁記錄的編碼問題有聯絡,其中不允許出現一些長串的0。

# relative links about this topic
http://xueshu.baidu.com/usercenter/paper/show?paperid=2c9070b5bd7f5b00847480d94c9cfd7a&site=xueshu_se
http://xueshu.baidu.com/usercenter/paper/show?paperid=cac5df4cbee54e31c90ef560bf806712&site=xueshu_se

Relevant Link: 

《資訊理論基礎》阮吉壽著 - 第五章

 

2. 信源編碼

這一節開始我們討論信源編碼,逐步對編碼的條件進行定義,設xn表示信源序列(x1,x2,....,xn)。C(x1)C(x2)....C(xn)表示相應碼字的串聯,我們稱之為編碼C的擴充套件(extension)

0x1:非奇異編碼

如果編碼將X的取值空間中的每個元素對映為D*中不同的字串,即

則稱這個編碼是非奇異的(nonsigular)

0x2:唯一可譯碼

如果一個編碼的擴充套件編碼是非奇異的,也即整個序列可以一一對應一個信源序列,則稱該編碼是唯一可譯的(uniquely decodable)

唯一可譯碼的任一編碼字串只來源於唯一可能的信源字串。儘管如此,仍然可能需要通觀整個編碼字串,才能最終確定信源字串。有時甚至是第一個碼字也同樣。

可以看到,非奇異性雖然保證表示X的每個碼字值明確性。但是,如果我們需要傳送一段序列,就需要在兩個碼字之間新增一個特殊符號(例如“逗號”),才可以確保其可譯性。但如此使用特殊的分割符號會降低編碼的效率。

一個很自然的想法是,如果能利用碼的自我間斷性或即時碼的思想,就可以同時兼顧效率與一一對應精確性這兩個目的。這就是接下要來討論的字首碼。

0x3:字首碼(prefix code)

若碼中無任何碼字是其他碼字的字首,則稱該編碼為字首碼(prefix code)即時碼(instantaneous code)自我間斷碼

在字首碼中,每一個碼字何時結束可以瞬時判斷出來,因而無需參考後面的碼字就可以譯出即時碼,每一次bit進行一次碼字表查表,當命中某個碼字序列時立即停止,因為不可能存在該碼字同時由是其他碼字的字首,因此可以100%斷定該序列為某個確定的碼字。

因此,對即時碼來講,一旦分配給字元xi的碼字結束,無需再等待後面的碼字,就可以立即譯出字元xi

例如前面例子中的編碼方案

這就是一個字首碼,如果得到一個二元串,010111100110,我們可將其譯碼為,0,10,111,110,10。

0x4:信源編碼各種編碼之間的關係

關於信源編碼的幾種編碼方式之間的關係圖如下:

用一個具體的例子來說明各個信源編碼方案的區別,下表分別列舉了在碼字分配在各個編碼方案中的情況。

  • 對於非奇異碼,碼串010可能對應3個信源序列:2、14、31,因此,該編碼不是唯一可譯的。
  • 唯一可譯碼也不一定是要無字首的。關於碼的唯一可譯性,Sardinas和Patterson已經設計出一個有效檢驗的方法,其主要步驟是形成所有碼字的可能字尾集,同時系統地刪除它們
  • 表中最後一個是即時碼,所有碼字中無一碼字是其他任一碼字的字首

Relevant Link: 

《資訊理論基礎》阮吉壽著 - 第五章

  

3. Kraft不等式

為了描述一個給定的信源,我們的目標是構造期望長度最小的即時碼。接下來最大的問題是,顯然不可能將短的碼字分配給所有的信源字元而扔保持是無字首的,那應該是按照什麼約束條件來尋找所有可能的碼字分配方案呢,因為可能滿足期望長度最小的碼字分配方案並不唯一。Kraft不等式定義了這個約束條件。

0x1:Kraft不等式形式化定義

即時碼的一組可能的碼字長度滿足如下不等式,即kraft不等式。

對於D元字母表上的即時碼(字首碼),碼字長度必定滿足不等式

反之,若給定滿足以上不等式的一組碼字長度,則存在一個相應的即時碼,其碼字長度就是給定的長度。

考慮一個每一節點均含D個子節點的D叉樹,

  • 樹枝代表碼字的一個字元,例如,源於根節點的D條樹枝代表著碼字的第一個字元的D個可能值
  • 樹葉代表每個碼字,始於根節點的路徑可描繪出碼字中所有字元

從上圖中可以看出,碼字的字首條件表明樹中無一碼字是其他任一碼字的祖先。因而,在這樣的編碼樹中,每一碼字都去除了它的可能成為碼字的所有後代。從建樹過程上看,有點啟發式優化的影子,後面我們會討論到,我們最熟悉的決策樹的建樹過程,本質上就是一個字首碼的尋優與構建過程。

為碼字集中最長碼字長度,考慮在樹中層的所有節點,可知其中有些是碼字,有些是碼字的後代,而另外的節點既不是碼字,也不是碼字的後代。

在樹中層的碼字擁有層中的個後代,所有這樣的後代集不相交。而且,這些集合中的總節點數必定小於或等於。因此,對所有碼字求和,則可得:

,這就是Kraft不等式。

反之,若給定任意一組滿足Kraft不等式的碼字長度,總可以構造出上圖結構類似的編碼樹。將第一個深度為的節點(依字典序)標位碼字1,同時除去樹中屬於它的所有後代。然後在剩餘的節點中找出第一個深度為的節點,將其標為碼字2,同時除去樹中所有屬於它的所有後代,等等,依次方法繼續下去,即可構造出一個碼字長度為的字首碼。

Relevant Link: 

《資訊理論基礎》阮吉壽著 - 第五章

 

4. 最優碼

0x1:最優碼期望長度條件

Kraft不等式解決的是,定義出了字首碼必須滿足的約束條件問題,滿足字首條件的任何一個碼字集均滿足Kraft不等式。

接下來考慮求解字首碼的最小期望長度問題,該問題等價於求解滿足Kraft不等式的長度集合,使得它的期望長度不超過其他任何字首碼的期望長度。這是一個標準的最優化問題,在所有整數上,最小化

其約束條件為

利用拉格朗日(Lagrange)乘子法,將帶約束的最小化問題轉化為下式的最小化問題:

關於求微分,可得

令偏導數為0,得:

將此式代入約束條件中以求得合適的λ,可得,因而,即最優碼長為

若可以取碼字長度為非整數,則此時的期望碼字長度為:

隨機變數X的任一D元即時碼的期望長度必定大於或等於熵,即

,當且僅當(即對所有的i,-logDpi為整數),等號成立。

對於某個n,如果概率分佈的每一個概率值均等於D-n,則稱這個概率分佈是D進位制的(D-adic),因此,當且僅當X的分佈是D進位制的,上述定理等號成立。

0x2:最優碼長的界

1. 最優碼長界形式化定義

上一小節中,我們討論了最優碼長期望,即最小化,其約束條件為整數且。我們已經證明若碼長選取

,有L = H。但是由於未必為整數,所以該式只是一個理論值。

為了能使該式具有實際意義,通過取整運算,就可以給出整數碼字長度的分配

,其中表示向上取整。這組整數滿足kraft不等式,因為

如此選取的碼字長度滿足

在上式中乘pi,並且關於 i 求和,可得:

上面討論可總結為如下定理:

是關於信源分佈p和一個D元字母表的一組最優碼長,L*為最優碼的相應期望長度(),則

上式表明,實際最優碼長的期望比熵大,但不會超出1位元的附加位。這是由於最優碼長的理論值並非總是整數造成的

2. 多字元分組編碼的最優碼期望長度界

前面介紹了對碼字的串聯(編碼的擴充套件),即通過對多字元進行分組可以減小信源序列的熵,進而減少最優碼期望長度。

考慮一個序列傳送系統,其中的序列都是來自於X的n個字元,假定序列中的字元是i.i.d.,服從p(x),此時可將這n個字元看成是字母表中的超字元。

定義Ln為每個輸入字元期望碼字長度,設是與(x1,x2,....,xn)相應的二進位制碼字長度,則

將上一小節推導的界應用於此時的編碼,有

由於X1,X2,...,Xn是i.i.d.,因此

帶入上面不等式,同時兩邊同除以n,得:

因此,通過使用足夠大的分組長度,可以獲得一個編碼,可以使其每字元期望碼長任意地接近熵。

即使隨機過程不是i.i.d.的,對來自該隨機過程的字元序列也可以作同樣的討論,此時仍然有:

將上式兩邊同除以n,且定義Ln為沒字元期望描述長度,可得:

如果隨機過程是平穩的,則,當n->∞時,每字元期望描述長度趨於該隨機過程熵率H(X)。

該定理從另一方面說明了熵率概念的必要性,熵率是最簡潔描述隨機過程所需的每字元期望位元數

0x3:非真實分佈的期望碼長和最優碼長之間的距離度量

這裡先解釋一下什麼是真實分佈與非真實分佈。

  • 真實分佈:目標過程的真實概率分佈,是永恆的真值,但也是我們不可知的,但可以通過訓練樣本無限逼近(大數定律)。
  • 非真實分佈:基於通過對真實過程的觀測得到了組觀測結果序列,並基於該觀測結果生成對應的概率估計分佈,這樣得到的概率估計分佈可能和真實分佈之間存在一定的差距。

舉一個具體的例子,我們基於有標註訓練樣本訓練一個線性迴歸模型,通過MSE得到了一個最優擬合模型,但是該線性模型並沒有完全擬合,依然存在一個大於0的損失函式值。這個時候,我們就稱我們得到的線性迴歸模型代表了一個非真實分佈,而原始訓練樣本代表了真實分佈(基於大數定律)。

理解了基本概念之後,現在讓我們拋開具體的演算法形式場景,回到抽象思維領域,思考一個問題。當面對的物件是非真實分佈時,用於描述這個非真實分佈的期望描述長度會變得怎樣。

假定真實分佈的概率密度函式是p(x),而非真實分佈的概率密度函式是q(x),相應的碼長為

下面將證明,由於不正確的分佈所引起的期望描述長度的增加值等於相對熵D(p || q)。於是,D(p || q)可以具體解釋為由於使用不正確的資訊而引起的描述性複雜度的增加量

將非真實概率分佈的碼字編碼定義為偏碼(wrong word),碼字長度分配為

關於p(x)的期望碼長滿足如下公式:

證明過程如下:

於是,若真實分佈為p(x),而編碼使用的是非真實分佈q(x),則會導致期望描述長度增加D(p || q)

這個定理也從碼長期望的角度解釋了線性迴歸模型擬合誤差以及擬合模型和真實分佈之間相關係數的關係等話題,關於這部分的討論,可以參閱另一篇文章

0x4:最優碼搜尋程式

前面兩小節討論的最優碼期望長度條件的證明過程,其實也間接提供了尋求最優碼的理論步驟:

  • 找到與X的分佈最接近的D進位制分佈(在相對熵意義下),由該D進位制分佈可提供一組碼字長度。
  • 選取首次達到的節點(按照Kraft不等式證明過程的方法),構造出該編碼
  • 逐次進行,最終得到一個關於X的最優碼

上述是一個理論上指導方法,要具體實現這個程式並不容易,因為要搜素出與X的分佈最接近的D進位制分佈並不容易。

在後面的討論中,我們會進入到具體演算法細節層面的討論,分別介紹尋求最優碼的次優程式,夏農-費諾編碼,以及赫夫曼編碼。

Relevant Link: 

《資訊理論基礎》阮吉壽著 - 第五章

  

5. 赫夫曼碼

關於給定分佈構造最優(最短期望長度)字首碼,赫夫曼給出了一個簡單的演算法。我們將證明,對於相同信源字母表的任意其他編碼,不可能比赫夫曼法所構造出的編碼具有更小的期望長度。

在開始具體的討論前,我們先通過對20問題遊戲的討論,來切入對赫夫曼碼的討論。 

0x1:赫夫曼碼和20問題遊戲的等價性討論

1. 20問題遊戲說明

假定要設計一套最有效的”是/否問答系統“,以便從目標群中識別出其中一個目標。假設目標的概率分佈已知,那麼是否能找到最有效的問題序列,保證該序列能夠將一個目標從一群可能的目標中唯一地區分出來。

這類遊戲在日常生活中非常常見,它就是我們熟悉的決策樹,通過不斷進行二元提問,將輸入逐步分類,最終落到某個具體的型別桶中。

2. 20問題抽象

首先,我們要找的目標可能不止一種人,我們將其設為X={X1,X2,....,Xn},Xi代表了我們要找的某一種目標人群。設計整套提問序列,本質上就是尋找一個目標編碼方案,將X中所有Xi都對映為一個對應的碼字。

在提問過程中,當前所要提出的問題僅依賴於前面提出的若干問題的答案而定,由於答案序列唯一確定該目標,因而所有目標對應著不同的答案序列,

並且,如果用0表示”是“,用1表示”否“,那麼可獲得目標集的一個二元碼。該編碼的期望長度即是提問方案所需的期望問題數。

反之,若給定目標集的一個二元編碼,可以求得與該編碼相對應的問題序列,使其期望問題數等於編碼的期望碼長,如果提問方案中的第一個問題是:”目標的對應碼字的第一位是1嗎?“

考慮下面這個虛構的例子:

一個隨機變數X,其取值空間為X={1,2,3,4,5},對應的概率分別是{0.25,0.25,0.2,0.15,0.15}。

為獲得X的一個最優二元碼,需要將最長的碼字分配給字元4和5。一般地,我們可以將該編碼構造稱為其中的兩個最長碼字僅差最後一位有所不同。

對於這樣的編碼,可將字元4和5組合成單個信源字元,其相應的概率值為0.3。按此思路繼續下去,將兩個最小概率的字元組合成一個字元,直至僅剩下一個字元為止,然後對字元進行碼字分配,最終我們得到如下表格:

對於上面的信源編碼方案,對應的問題序列可以反推出來。

  • 第一個問題應該是”X等於2或3嗎?“:因為只有2或3的碼字第一位是1,對此問題的回答可以確定碼的第一位
  • 假定第一個問題的回答是”對“,那麼下一個問題應該是”X=3嗎?“:這可以確定碼的第二位 
  • 同時要注意,對於第二個問題,也可以是”X等於1或3嗎?“,它獨立於第一個問題:由此可確定碼的第二位

在最優的提問方案中,期望問題數EQ滿足:

,這符合最優碼期望長度界定理。

3. 加權碼字的赫夫曼編碼

最小化的赫夫曼演算法其實對任意一組都成立的,而無需考慮的大小。此時,赫夫曼編碼演算法最小化的是碼長加權和,而非平均碼長。

4. 赫夫曼編碼與”切片“問題(字母碼)

我們已經說明了信源編碼與20問題遊戲的等價性。對於給定的隨機變數,最優問題序列對應於一個最優的信源編碼。然而,由赫夫曼編碼確定的最優問題方案要求對於對於任一問題,存在某個集合,使該問題具有形式”X∈A嗎?“。

接下來考慮一個帶約束的20問題遊戲,具體說就是,假定X={1,2,....,m}中的元素降序排列為,並且要求所有的提問只能是唯一形式”X>a嗎?“,其中a是某個數。

由赫夫曼演算法所構造出的赫夫曼編碼可以不與切片集(形如{x:x<a}的集合)相對應。如果選取由赫夫曼編碼所得到的碼字長度(),並且用它們來分配字元到編碼樹上,使得每個碼長對應著編碼樹的一個層,在對應的層上,將首達節點處標識上對應的字元,由此方法可構造出另一個最優碼。

然而與赫夫曼編碼不同的是,該編碼是一個切片碼(slice code),這是因為與此最優碼等價的最優問題方案中的每個問題(對應該碼的一位)將該樹分裂成一系列 {x:x>a} 與 {x:x<a} 的集合形式。

上面說的有些抽象,還是繼續用前面的一個例子來說明一下,對隨機變數的赫夫曼編碼方案如下

可知由赫夫曼編碼程式所構造出的赫夫曼碼並不是切片碼,但若使用由赫夫曼編碼程式獲得的碼字長度,即{2,2,2,3,3},同時將相應碼字分配給編碼樹中相應層的首達節點,就可得到隨機變數的如下一組新的編碼:

  • 1 -> 00
  • 2 -> 01
  • 3 -> 10
  • 4 -> 110
  • 5 -> 111

可以證明上述編碼是個切片碼,由於碼字是按字母序排列的,故我們將這類片段碼稱作字母碼(alphabetic code)。

0x2:赫夫曼碼的最優性討論

1. 赫夫曼碼最優性所具有的性質

利用歸納法可以證明二元赫夫曼碼是最優的,為了證明赫夫曼碼的最優性,首先來證明特定最優碼所具有的性質。

假定隨機變數的概率分佈依次排列為,當達到最小時,編碼是最優的。

對任意一個分佈,必然存在滿足如下性質的一個最優即時碼:

  • 其長度序列與按概率分佈列排列的次序相反,即,若,則
  • 最長的兩個碼字具有相同長度。
  • 最長的兩個碼字僅在最後一位上有所差別,且對應於兩個最小可能發生的字元。

用歸謬法來證明二元赫夫曼碼的最優性,證明需要的步驟是通過一些列的交換、修剪、重排過程。考慮一個最優碼Cm,以及一個C'm(通過某種交換、修剪、重排)。

  • ,則。此時通過交換碼字即可得此結論。

設C'm為將Cm中的碼字 j 和 k 交換所得到的編碼,則

 

因為,且由於Cm是最優的,可得,故必有。從而最優碼本身Cm必定滿足性質1。

  • 最長的兩個碼字具有相同的長度 

通過修建碼字獲得該結論,如果兩個最長碼字長度不同,那麼將較長碼字的最後一位刪除,它仍可保持字首形式,但此時具有更短的期望碼字長。因此,最長的兩個碼字長度必定相等。

下圖展示瞭如何從任一編碼方案,通過交換、修剪、重排過程。考慮一個最優碼Cm

 

假定,a)給出可能的即時碼,通過修剪無兄弟的分枝,可將原碼改進為b),將編碼樹重排成如c)所示,使得從頂部到底部按照碼字長度的遞增排列。最後,交換概率匹配使得編碼樹的期望深度得到改進,如d)所示。

因此,任何一個最優碼都可以通過重排和交換最終具有如d)所示的典則碼形式。

至此,我已經證明:若,則存在長度列為的一個最優碼,且碼字僅最後一位有所區別。

綜上,我們可以到赫夫曼碼最優定理,即,如果C*為赫夫曼碼而C'是其他碼,則 L(C*) <= L(C')。

針對二元字母表的情況,可以推廣到D元字母表的情形,赫夫曼碼演算法的最優性也是成立的。

2. 最優赫夫曼碼的迭代式構建過程

上一小節我們討論了赫夫曼碼的性質引理,滿足引理的最優碼是存在的,我們稱這樣的碼為典則碼(canonical code)。對於m元字母表上的概率密度函式,我們定義其m-1元字母表上的赫夫曼合併(huffman reduction)為。用表示p'的最優碼,而用表示p的典則最優碼。

上圖中,令,a)給出一個典則最優碼。合併兩個最小概率得到b)中的編碼。按照降序方式重排概率值,得到c)所示的m-1個字元上的典則碼。

一般地,如果從m-1個字元熵的概率分佈p'的一個最優碼出發,通過擴充套件對應於的碼字,就可以獲得m個字元熵的編碼,且得到的新碼是最優的。

值得注意的是,在每一步合併兩個最小可能發生的字元時,赫夫曼編碼是一個”貪婪“演算法,前面的證明表明這樣的區域性最優性可以保證最終編碼的全域性最優性。

Relevant Link: 

《資訊理論基礎》阮吉壽著 - 第五章

 

6. 赫夫曼碼與夏農碼對比異同

0x1:赫夫曼碼和夏農碼在單個碼字長度上的長度對比

對於某個特定的字元,使用碼長為的編碼(稱為夏農碼)可能比最優碼更差。

例如,考慮一個由兩個字元組成的信源,其中一個發生的概率為0.9999,而另一個為0.0001。若使用碼字長度,則意味著他們的碼長分別為1位元和14位元。然而,用赫夫曼碼程式可以很容易得出,這兩個字元的最優碼長都是1位元。

因而,在香濃編碼中,不經常發生的字元的碼字長度一般比最優碼的碼字更長。

但是最優碼的碼字長度總是小於等於嗎?答案是否定的,考慮下面這個例子:

設隨機變數X的分佈為

赫夫曼編碼程式產生的碼字長度為(2,2,2,2)或(1,2,3,4),這兩個碼的期望碼字長相同。對第二個編碼,其第三個字母的長尾3,比大。

雖然總總體期望平均上,夏農碼和赫夫曼碼都是符合上下界定理的,即。但是在單個碼字上,因為概率分佈不均的緣故,夏農碼中某個字元的碼字長度可能小於最優(赫夫曼)編碼中的相應字元的碼字長。

同時這裡例子也說明了,最優碼的碼字長集合並不唯一,可能存在1個以上的具有相同期望值的碼長集。

0x2:夏農碼的競爭最優性

我們已經證明了赫夫曼碼是具有最小期望長度的最優碼。但是,對於某個特定的信源序列來說,赫夫曼碼的效能如何呢?對於所有序列來說,赫夫曼碼都優於其他編碼嗎?

顯然不是的,因為存在某些編碼,它們分配較短的碼字給不經常發生的信源字元,對於這些信源字元,這樣的編碼比赫夫曼碼更好。之所以出現這個現象是因為,期望長度最優並不一定代表區域性處處最優,這進一步導致期望長度最優並不一定是全域性競爭性最強,因為競爭性是所有區域性博弈的綜合結果

在正式敘述競爭最優性問題之前,我們通過一個具體的例子來引入話題,以便更好地理解這其中的博弈思維。

1. 從一個即時碼效率競爭零和遊戲說起

有兩個參與一個零和博弈遊戲,給定給一個屬於特定概率分佈的信源字元序列,要求他們各自設計一個即時碼。比賽的規則是:對此信源字元,如果參賽者A設計的碼字比參賽者B設計的短或長,則A相應的得分是1或-1,若平手,則A得分為0。

從博弈論的角度來看,這是一個田忌賽馬問題,即對於A來說,他可能從整體期望上弱於B,但A可以充分利用單輪博弈這個優勢,在儘量多的輪次中,分配稍微強於B的碼字上場進行博弈,而在餘下的少量輪次中,用大幅度弱於B的碼字去慘輸,這樣,從整體上看,比賽的最終結果還是A勝。這種策略的思想是:集中優勢力量贏得儘量多的區域性戰役,而在不重要的少量區域性戰役中幾乎不投或者投入很少的資源,從而博取全域性的總體勝勢。

2. 夏農碼單個碼字長度的界

夏農碼每個碼字長度,這裡設表示其他唯一可譯碼的相應碼字長度,則有:

例如,短5位元或更多的概率不超過1/16。

證明過程如下:

上面證明過程的最後一步,由Kraft不等式得到

因此,在大多數情況下,沒有其他碼能夠比夏農碼更為優越。但是上述過程實際上是證明了下界,事件成立的概率>= 1/2只是一個下界證明,即證明了最壞情況下,夏農碼也不會壞到哪裡去。

但這是不夠的,在博弈論架構中,人們通常希望證明,下面我們來證明這個更為嚴格的判斷準則下,夏農碼也是最優的。

如果概率密度函式p(x)是二進位制的,則均為整數。有如下定理:

對二進位制概率密度函式p(x),設為信源的二元夏農碼的碼字長度,為信源任何其他唯一可譯二元碼的碼字長度,則:

,當且僅當對所有的x,都有時,等號成立。於是,碼長分配唯一競爭最優的

證明過程如下:

定義階躍函式sgn(t)如下:

引入一個新的函式,如下圖所示:

由上圖可知,,對於,即僅對於所有整數成立,但對所有實值不成立。此時可以得到:

其中

  • (a)是由sgn(x)的上界得到
  • (b)是由於滿足Kraft不等式得到

由此,我們證明了在某類判別準則下,夏農碼是競爭最優的。

Relevant Link: 

《資訊理論基礎》阮吉壽著 - 第五章

  

7. Shannon-Fano-Elias編碼

0x1:基於累計概率分佈的編碼對映方案形式化定義

在本節中,我們介紹一個簡單的唯一可譯碼狗仔程式,基本思路是利用累計分佈函式來分配碼字。

不失一般性,假定取,假設對所有的x,有p(x)>0,定義累計分佈函式F(x)為:

考慮修正的累計分佈函式:

其函式圖如下圖所示:

其中,表示小於x的所有字元的概率和加上字元x概率的一半所得到的值。由於隨機變數是離散的(信源是離散的),故累計分佈函式所含的階梯高度為p(x),函式的值正好是與x對應的那個階梯的中點。

  • 由於所有的概率值是正的,若,則
  • 若已知,則可以確定x。

因此,只需通過觀察累計分佈函式的圖形,就可以找到相應的x,故可以作為x的編碼(本質上就是一種編碼對映函式)。這符合編碼的奇異性和唯一可譯性。

但是,根據離散概率分佈函式的性質,我們知道,需要無限多的位元才能表示實數,因為不可能完全相等而只能無限逼近。所以,使用的精確值作為對x的編碼不可行,轉而必須使用近似值來進行編碼,所以接下來的問題就是,這個近似值需要精確到什麼程度呢?

假定將舍入取位,記為,於是,取的前位作為x的碼,由舍入定義,可得:

若:,則

因而,位於對應x的階梯之中,那麼,使用位元足以表示x。

除了證明了碼字與字元一一對應之外,還需要證明碼字集是無字首的。

考慮每個碼字,注意到它實際上代表的不是一個點,而是一個概率區間,碼是無字首的當且僅當碼字對應的區間互不相交。這可以由累計概率分佈函式的性質來保證。

最後,由於使用位元來表示x,則編碼的期望長度為:

因此,該編碼方案的期望碼長不會超過熵值2位元。

0x2:Shannon-Fano-Elias編碼舉例說明

首先考慮下面的例子,其中所有概率值都是二進位制的,碼的構造如下表:

在此情形下,期望碼長尾2.75位元,而熵為1.75位元。

注意表格中的碼字,顯然存在著某些無效性,如果最後兩個碼字的最後一位刪除,那麼得到的碼就不再是無字首的了。

現在看Shannon-Fano-Elias碼的另一個例子,在該例中,由於分佈不是二進位制的,所以F(x)的二進位制表示可能有無窮位數字,用近似值來代替。

上述編碼的平均長度比該信源赫夫曼碼的長度大12位元。

Relevant Link: 

《資訊理論基礎》阮吉壽著 - 第五章

  

8. 決策樹(ID3、C4.5)演算法的赫夫曼編碼本質

0x1:決策樹模型和赫夫曼碼的一一對應關係

決策樹的建樹過程我們非常熟悉,它是一種層次迭代樹結構模型,從根節點開始,每次根據熵增益選擇一個最優的特徵作為分裂節點,直到將所有樣本都分配到某個葉節點上。

這裡我們用資訊理論中赫夫曼碼的理論框架,來重新看一下決策樹的建樹邏輯。

  • 決策樹面對的樣本特徵,可以理解為一組信源訊號X,信源訊號X的元素個數為特徵個數。決策樹要建立的樹結構本質,就是需要決定,哪些特徵放前面,哪些特徵放後面,即如何進行序列編碼。
  • 決策樹從根節點開始,逐層遞進,直到將所有樣本分配到某個葉節點上,這是在尋找一個赫夫曼編碼序列,將所有信源訊號進行編碼。
  • 決策樹在每層都尋找當前能帶來最大熵增益的特徵屬性,這裡隱含了一個資訊,實際上,決策樹是根據各個特徵屬性的概率大小進行了一次從大到小的排序,然後在每一層逐個取當前概率最大的特徵屬性作為分裂點(split point),這是一種字母碼的赫夫曼碼的構建過程。

0x2:從赫夫曼碼視角看決策樹的優缺點

從上述討論可以看到,決策樹模型的本質就是一個赫夫曼碼編碼方案,因此,我們可以藉助赫夫曼碼的定理和引理來看決策樹的演算法優缺點。

1. 決策樹的優點

因為決策樹的建樹過程,符合赫夫曼碼的貪婪搜尋演算法,每一次都是區域性最優的,且全域性也是最優的。所以,決策樹的樹結構代表了對資料特徵的一種最短編碼

怎麼理解這句話呢?簡單來說,決策樹能保證在用最短的步驟將資料對映為一個具體型別,即從一個信源編碼為一個序列訊號。再通俗一點說就是,將一個資料X對映為一個具體的Y。在具體的分類或者回歸任務中,Y指的就是離散型別或者回歸值。

2. 決策樹的缺點

成也蕭何敗蕭何,基於赫夫曼碼的堅實理論,決策樹獲得了高效的信源訊號描述能力的同時,也同樣面臨著赫夫曼碼的缺點,這是熵本身性質帶來的。

這就是我們前面說的,這就是像夏農碼/赫夫曼碼這種熵碼,對大量的小概率事件,不能及時停止,而會不斷地給其分配新的碼字,這樣的後果就是,當資料集特徵中,有大量的小概率特徵,決策樹的深度會變得很深,最終導致過擬合。

這樣說有些抽象,我們虛構一個例子來說明。

假設現在有一個資料集,我們已經完成了特徵工程,準備訓練一個決策樹模型,現在資料集各個特徵各自的概率分佈為,X={1/4,1/4,1/16,1/32,....,1/32}。

可以看到,前兩個特徵是高概率信源訊號,我們將最短的2個碼字分配給它們,這沒有問題,但是接下來,剩餘的特徵單個的概率都很低,而且數量很大,按照赫夫曼碼的構建過程,會按照概率的順序逐個分配其遞增長度的碼字,可以很容易想象,如果資料特徵的概率分佈越分散(小概率特徵越多),最後得到的赫夫曼碼期望長度就會越長。

接下來,還得再說明一個問題,為什麼說碼長越長,越容易引起過擬合呢?反正我都是按照赫夫曼編碼理論得到的最優碼,你管我長還是短。

問題的根源出在資料上,我們知道,資料中除了蘊含有用的資訊之外,還存在著大量的噪聲資料,包括:

  • 系統噪聲:目標事物本身就存在某種不確定性,例如該特徵和目標值之間根本就不存在相關關係
  • 取樣噪聲:資料採集過程中引入的噪聲

這些噪聲的存在,最終導致了樣本特徵中出現大量小概率特徵。這些包含噪聲的小概率特徵,在建模過程中是需要進行剔除的,不應該被納入到編碼範疇內。 

從上述討論中我們還得到一個工程實踐上的啟發,在做特徵工程的時候,不要一味地貪多,認為特徵越多越好,反正不管三七二十一,一頓操作,各種想得到的特徵都給你提出來,讓後一股腦丟給機器學習演算法,心想,反正我的工作就是提特徵,至於哪些特徵有用,哪些特徵沒用,是你演算法模型要決定的事情,我只管給模型喂海量高質量的資料就可以了。

這種做法在實踐中當然大概率也不會遇到很大的問題,但是我們得知道其中原因,這是因為模型通過剪枝、dropout、正則化等手段進行了提前停止,一定程度上破壞了原始的赫夫曼碼的構建過程,提前終止了樹的繼續增長,這才導致了過擬合的發生。

Relevant Link: 

https://www.cnblogs.com/LittleHann/p/7309511.html#_lab2_4_0

 

9. TODO

目前還無法徹底思考的問題,留待以後繼續深入研究 

  • 蒙特卡洛搜尋中蘊含的熵思想 
  • 怎麼樣從理論上定量分析一個問題域的熵,例如webshell惡意檔案檢測,將惡意檔案的文字表徵看做隨機變數,怎麼衡量其熵值。

 

相關文章