前言
信息論是由克勞德·香農發展,用來找出信號處理與通信操作的基本限制,如數據壓縮、可靠的存儲和數據傳輸等。自創立以來,已被應用多個領域,例如自然語言處理(NLP)、機器學習等領域。
定長編碼(Block Codes)
讓我們從一個例子開始。小明酷愛動物,日常談吐中經常提及各種動物,包括:狗、貓、魚和鳥。一天,小明見到小紅(原諒我這麼俗的名字),兩個人決定用二進制的方式來交流。爲了交流方便,小明和小紅決定製定一套編碼規則
此時,若小明要發出“狗 貓 狗 鳥”的信息,需要完成以下過程:
通過以上三個過程,便可以將“狗 貓 狗 鳥”轉化爲二進制了。
變長編碼(Variable Codes)
實際中,通訊往往需要付費,假設通訊按位(bit)收費。爲了省錢,小明和小紅需要尋找合適的編碼策略。在設計編碼策略中,小紅統計了小明的說話
此時,若按照上面的定長編碼,每個字的平均編碼長度
若想進一步壓縮平均編碼長度,變長編碼是一種有效的手段。變長編碼的基本思想:出現頻率高的字符使用短編碼,出現頻率低的字符使用長編碼。(你可能會問,爲什麼不讓所有的編碼都使用短編碼?嘿嘿,都使用短編碼,還能實現一一對應嗎?)基於上述思想,小明和小紅重新指定了一套新的編碼策略:
此時,每個字的平均編碼長度爲
顯然,新的策略能夠幫小明和小紅省很多錢。那麼,小明和小紅是如何設計的呢?
無損編碼(lossless compression)
爲了便於接下來的描述,以下圖爲例介紹幾個名稱
其中狗、貓、魚等稱爲源符號,
無損編碼
小明和小紅的交流中,首先要保證信息的無損性,即保證編碼後的信息能夠無損的復原。若使用定長編碼,復原信息輕而易舉便可實現,而變長編碼則不同。假如使用上圖,此時小明給出的代號爲
根據約定好的碼錶,小紅既可以理解成“狗 狗 鳥 狗”,也可以理解成“狗 貓 魚”。顯然,這是小明和小紅不願意看到的。通過查閱資料,小明和小紅髮現他們遇到的問題是“無損編碼”問題:
無損編碼是一類數據壓縮算法,其壓縮的數據能夠無損的復原爲原始數據。
若
- 非奇異編碼(Non-singular code):
x1≠x2⟹C(x1)≠C(x2)
在實際中,我們往往需要一次編碼一系列字符,而不是一次編碼一個字符,因此它需要滿足:
- 可擴展編碼(Extension of a code):
C(x1,...,xn)=C(x1)...C(xn) - 唯一可譯解碼(Unique decodability):
xni≠xmj⟹C(xni)≠C(xmj)
儘管唯一可譯解碼已經足夠強了,但它並不能支撐“收到所有字符以後才進行解碼”的情況。例如,
1 | 2 | 3 | 4 | |
---|---|---|---|---|
10 | 00 | 11 | 110 |
當收到的代號是
x1≠x2⟹C(x1)≠Prefix(C(x2))
即任意符號的編碼都不是其他編碼的前綴。基於前綴編碼,
1 | 2 | 3 | 4 | |
---|---|---|---|---|
0 | 10 | 110 | 111 |
在上面的介紹中,分別介紹了“非奇異編碼”、“唯一編碼”、“前綴編碼”。這些編碼方式的相互關係可以通過下圖來描述:
通過上面的知識,前綴編碼是解決編碼復原最好的方式,下面就需要考慮如何優化編碼長度。
最優編碼
需要注意的是,本文討論的是源符號有限且已知的編碼。更多關於最優編碼的知識,可以參考Information Processing and Learning。
碼樹
在介紹最優編碼之前,首先介紹一下碼樹和Karft不等式。對於給定碼字的全體集合,可以使用碼樹來表示。對於
Karft不等式
對於
反之,若給定滿足以上不等式的一組碼字長度,則存在一個相應的前綴碼,其碼字長度就是給定長度。其中
正向證明
假設
考慮到前綴編碼的特性,子樹之間不存在葉節點交叉,即:
因此
其中
反向證明
假設
這時問題就轉化爲:不再考慮的節點個數是否比總的節點個數(
至此正向、反向證明均已完成。
最優編碼
隨機變量
當且僅當
上面的問題可以轉化爲
上面的問題可以轉化爲不等式約束下的拉格朗日數乘法,即
根據極值滿足的條件得:
顯然
從公式二可知:
故
經過上面的證明可知,小明只需要用前綴編碼,且碼長滿足
總結
通過上面的討論,我們找到了小明和小紅信息交流的理論依據。在後面的博客中,我會帶來更多知識!