對於很多事情,千萬別因為自己的眼界將自己困在井底。你不知道?基本上並不代表沒有!只是你不知道而已。——坤鵬論
一、信息熵為了讓信息壓縮得更小
通過前面幾天坤鵬論的分享學習,相信大家已經明白了信息熵在通信系統中的核心作用之一——如何把信息量最大化。
香農在他的《通信的數學理論》論文中指出:
任何信息都存在冗餘,冗餘大小與信息中每個符號(數字、字母或單詞)的出現概率或者說不確定性有關。
因此,信息熵公式可以視為——第一次用數學語言闡明了概率與信息冗餘度的關係。
所以,信息熵的作用顯而易見,就是為了讓信息壓縮得更小。
怎麼變得更小,信息熵提供了方法和度量。
香農研究的重點是,在通信中,信息以多長的一組編碼為合理,太短,無法正確還原,太長,就有冗餘,損失效率。
所以信息熵公式不是文字效率公式,是碼長的節約或冗餘,而不是信息本身的節約或冗餘。
就像前面文章舉過的香農本人設計的例子:
Most people have little difficulty in reading this sentence.
他說,這句話有很多冗餘字符。
如果你的英文比較好,就算把其中所有元音字母都去掉,你也能猜出來這句話是什麼,比如:
Mst ppl hv lttl dffclty n rdng ths sntnc.
這個去除一句話中冗餘字符的過程,就是「壓縮」。
當然,你還可以把其中的介詞——in和定冠詞——this也去掉,照樣能明白什麼意思。
這不僅讓坤鵬論想到了咱們古人的文言文,那簡直就是一種完美的、古老的高度壓縮文體。
而我們常用的成語、諺語等也是。
香農認為,英語是冗餘度比較高的語言,內在的冗餘度約為50%。
如果考慮更大範圍的統計效應,擴展到句和段落的層面,他估計冗餘度會進一步升高到約75%。
漢字的信息熵比英文字母的高很多,而信息熵表示的是可以輸入的信息量。
因此,同樣長度的一句中文和英文,中文的信息量就會高出許多。
同樣一本書,如果翻譯成中文,就會薄出許多。
很有趣的是,正因為英文字母的信息熵相對小,可輸入信息少。
所以,英語更勤於把意思表達得更清楚、準確,減少歧義。
而中文的信息熵高,可輸入信息多,很少的字就能使信息的確定性增強。
於是,中文更傾向於精煉。
所以,中國人學起英語的語法來,會覺得難。
很可惜,雖然香農為資訊時代提出了革命性的理論,但他並沒有很好應用信息熵。
因為當時的通信主要是發電報、打電話,客觀講,字符壓縮的意義並不大。
但是,網際網路時代,特別是音視頻的壓縮,成為了關鍵。
沒有壓縮算法,我們就不可能在電腦和手機上聽音樂、看電影。
雖然香農沒有發明具體的壓縮算法。
但是,所有壓縮算法的理論源頭都是香農的理論。
正如他的同事羅伯特·法諾在多年後回憶道:
「使得錯誤概率任意小?從來沒有人這樣想過!我不知道他是如何得到了這個洞見,而他又是如何使自己相信這件事是可能的。但現如今,幾乎所有的現代通信理論都是基於他的這項工作。」
二、最好的壓縮實踐之一——霍夫曼編碼
1.什麼是Unicode編碼?
如今的計算機系統的字符一般採用的是等長的編碼方式,也就是每個字符的編碼長度相等。
比如:Unicode編碼系統,它的中文名稱為統一碼,又叫萬國碼、單一碼。
它是計算機科學領域裡的一項業界標準,包括字符集、編碼方案等。
我們都知道計算機只能處理數字,要處理文本的話,就必須先把文本轉換為數字,這樣計算機才能處理。
前面坤鵬論在講比特時提到過,8個比特(bit)=1個字節(byte),一個字節能表示的最大的整數是255(2-1=255)。
按道理講,任何人都可以約定一套文本與二進位數字對應的編碼表,比如:0=A,B=1……
不過,這樣的結果只能讓互相通信時一片混亂,就是雞同鴨講的翻版。
所以,美國國家標準學會制定了一種標準的單字節字符編碼方案,用於基於文本的數據,它就是著名的ASCII (American Standard Code for Information Interchange)——美國信息交換標準代碼。
ASCII編碼發表於1967年,最後一次更新是1986年。
一共定義了128個字符,佔用0~127來表示大小寫英文字母、數字和一些符號,比如大寫字母A的編碼是65,小寫字母z的編碼是122。
但是,如果要表示字符眾多的中文,一個字節顯然是不夠,至少需要兩個字節,並且還得保證不能和ASCII編碼衝突。
於是中國制定了GB2312編碼,用來把中文編進去。
類似情況也發生在日文和韓文等其他語言。
為了解決ASCII編碼的局限,達到統一全世界所有文字編碼的目的,Unicode應運而生。
1990年開始研發,1994年正式公布。
它把所有語言都統一到一套編碼裡面,為每種語言中的每個字符設定了統一併且唯一的二進位編碼。
也就是說,世界所有語言都統一成了一種編碼語言,從而可以跨語言、跨平臺進行文本轉換、處理。
最直觀的體現就是,亂碼問題變成了歷史問題,不再困擾我們。
Unicode編碼用雙字節表示一個字符,因此每個字符用16bit的二進位位來編碼。
而原有的英文編碼從單字節變成雙字節,只需要把高字節全部填為0即可。
理論上,Unicode編碼可以對2^16=65536種字符進行編碼,足夠編碼世界上所有文字符號,甚至包括不斷增加表情符。
2.什麼是霍夫曼編碼?
Unicode編碼實現了一統全世界語言的編碼標準。
但是,如果你的目標是使目標文本的編碼總長度最短,這種等長編碼方式顯然不是最優方案。
此時,香農的信息熵就可以大顯神威了,最簡單的方法就是,對出現概率高的字符用比較短的長度進行編碼。
世界上第一套以香農信息熵為理論的編碼是香農-法諾編碼。
法諾就是前面提到的法諾,他的全名為羅伯特·馬利歐·法諾。
義大利裔美籍計算機科學家。
是麻省理工學院電機工程與計算機科學榮譽教授。
也曾在貝爾實驗室工作,是香農的同事,專長於資訊理論。
香農-法諾編碼是他與香農共同開發出來的,發表時間為1949年。
話說,時間到了1951年。
當時一個名叫大衛·霍夫曼的年輕人在麻省理工學院攻讀博士學位。
他選修了法諾的資訊理論課程。
期末時,法諾給出的學期報告題目是:查找最有效的二進位編碼。
霍夫曼發現自己無法證明哪個已有編碼最有效,於是就轉向了創造最有效的編碼。
就這樣,世界上誕生了霍夫曼編碼(Huffman Coding)。
它的核心同樣依據信息熵——通過符號出現概率編碼。
道理也不複雜:
出現概率高的字母用較短的編碼;出現概率高的使用較長的編碼。
這就使得編碼後的字符串能夠達到無損壓縮數據的目的。
由於霍夫曼每個編碼的長度不像Unicode那樣固定不變,會隨著符號概率的長度變化,所以,這類編碼表也被稱變長(chang)編碼表。
舉個簡單例子說明一下。
比如:在英文中,e的出現概率最高,而z的出現概率最低。
利用霍夫曼編碼對一篇英文進行壓縮時,e極有可能用一個比特來表示,而z則可能花去25個比特。
用普通的編碼方法時,每個英文字母都要佔用一個字節,即8個比特。
兩種方法相比,霍夫曼編碼的e使用了一般編碼的1/8的長度,z則使用了3倍多。
顯然,如果能夠對英文中各個字母出現概率的準確估算,就可以大幅度提高無損壓縮的比例。
1952年,霍夫曼發表論文《一種構建極小冗餘編碼的方法》,在其中講了這個編碼方法。
他後來成為了計算機科學家。
霍夫曼編碼效率高,運算速度快,實現方式靈活,從 20世紀60年代直到現在,在數據壓縮領域得到了廣泛的應用。
許多知名的壓縮工具和壓縮算法裡(如WinZip、gzip、MP3、JPEG等),都有霍夫曼編碼的身影。
不過,霍夫曼編碼再牛也跑不出香農信息熵的手掌心,因為那是幾乎所有編碼方法的理論源泉。
並且,霍夫曼編碼所得的編碼長度只是對信息熵計算結果的一種近似,並不能真正逼近信息熵的極限。
正應了香農的資訊理論中所說,任何一個文件被無損壓縮後的結果不可能小於其熵,超過了必然有損。
比如:如果一個文件有20GB,其信息熵只有20MB,那麼實現一個1000倍的壓縮完全可能。
反之,如果一個文件只有100MB,其信息熵高達90MB,該文件無論如何也不可能無損壓縮到20MB。
讓我們聯繫信息熵琢磨一下為什麼?
信息熵代表著不大確定性的程度。
在二元概率中,知道了不確定性的程度,也意味知道了"還能說多少",這就是資訊理論的信息量。
如果壓縮超過了信息熵,就意味著丟失了"還能說多少"的一部分,必然使信息量不完整,也就是有損失了。
三、為什麼總是提高帶寬,卻不研究怎麼壓縮得小?
坤鵬論看到有人說,為什麼我們努力提高網絡帶寬,而不是去想辦法壓縮文件尤其是視頻文件的大小呢?
這個問題要分成兩部分回答。
第一,其實,人們並沒有停止研發更好壓縮方案的不懈努力。
之前在文章中講過,人類,特別是西方科學界有個傳統——追求極限。
(註:為什麼?可看坤鵬論前面的文章,也可看《從一到無窮大》這本書)。
因此,對於很多事情,千萬別因為自己的眼界將自己困在井底。
你不知道?
基本上並不代表沒有!
只是你不知道而已。
最典型的表現就是,在公司中,經常會有員工抱怨別的部門的員工太清閒,不公平。
第二,壓縮有極限。
這個問題中最大的原因還是香農在資訊理論中所揭示的,壓縮有極限,極限是信息熵,超過了必有損失。
而且,現在確實有在特定條件下的數據壓縮已經達到了理論極限。
所以,除了人們不知道的原因外,還有就是樹上低垂的果實都被摘了,再往上應該還有果實,但是很難攀上去,且果實越來越少。讓人感覺壓縮技術貌似停止不前的樣子。
因此,相對來說,帶寬和存儲容量的提升雖然也有極限,但目前看來還有很大的空間,暫時觸碰不到極限。
四、為什麼圖像影音文件可以有損壓縮?
當然,上面所說的是僅限於無損壓縮,對於有損壓縮,壓縮了多少倍都有可能。
最典型的有損壓縮就是MP3、JPG、RM等圖像影音文件。
它們背後的原因在於,人類的視覺和聽覺的敏感程度是有限的。
也就是,人類可以天然地容納一些視聽方面的信息損失,而沒什麼感覺。
於是,這也給多媒體信息的壓縮帶來了可能。
就像人耳感受聲音的頻率範圍是20~20kHz,於是,MP3去掉了大量的冗餘信號和無關信號,比如:那些人耳不太敏感的高頻分量,然後再經過量化,將其轉換成霍夫曼編碼,形成MP3位流。
視頻呢?
我們小時候都應該玩過走馬燈,或是在書的一角,相同位置一頁頁畫上動作慢慢有變化的小人,然後,用手指按住讓書頁快速翻動,小人就動了起來。
其實,視頻就是這樣連續的圖像序列,由連續的幀構成,一幀即為一幅圖像。
由於人眼具有視覺暫留效應,當幀序列以一定速率播放時,我們看到的就是動作連續的視頻。
正因為連續的幀之間相似性極高,不確定性低,信息熵低,通過前一幀更容易猜出下一幀,所以也就有了壓縮的可能。
視頻壓縮就是對視頻進行編碼壓縮,去除空間、時間維度的冗餘。
本文由「坤鵬論」原創,轉載請保留本信息
請您關注本百家號,坤鵬論自2016年初成立至今,創始人為封立鵬、滕大鵬,是包括百度百家、頭條、雪球、搜狐、網易、新浪等多家著名網站或自媒體平臺的特約專家或特約專欄作者,目前已累計發表原創文章與問答6000餘篇。