当前位置:萬花小說>书库>都市青春>數學大帝> 第441章 格羅滕迪克穩和拓撲

第441章 格羅滕迪克穩和拓撲

  一張高清電視分辨率的照片,如果沒有經過壓縮,要占用600萬個字節的計算機內存(6MB,1個字節是8個比特)。


  可是如果這張照片照的是一麵單色的牆的話,它所含的信息量就很小,隻要用三個字節就可以描寫整張照片(3個字節描寫紅綠藍三種顏色的深淺)。


  所以單色牆的照片的文件大小,可以從600萬個字節壓縮到3個字節,大大減少了占用計算機內存的空間和傳輸照片所需的時間。


  但一般一張照片的信息量要比三個字節大很多,那麽如何量化照片所含的信息量?照片的壓縮最多能有多少倍?

  香農是量化信息的第一人。


  有趣的是,他量化信息的公式早就出現在了玻爾茲曼的墓碑上。


  當然玻爾茲曼得到這個公式,不是為了研究信息,而是為了研究熱力學中的混亂度(所以玻爾茲曼的公式和香農的公式差了一個負號)。


  熱力學的一個中心概念——溫度,就是混亂度隨著能量的增加而增加的速率。我們的世界真是處處相通。


  南加州大學(Uy of Southern California)電子工程係教授巴特·磕死磕(Bart Kosko)說:“愛因斯坦相對論之革命性在於它顛覆了之前的牛頓力學,而香農信息論之革命性在於它前無古人。”


  香農當年創建信息論的時候是為了探討信息的本質和通信的理論極限問題,比如什麽是信息,怎樣從數學上定義衡量信息,數據壓縮和數據傳輸可達到的極限在哪裏,等等。


  但信息論的應用遠不止於通信領域。在香農之後,信息論被當作一套通用的數學工具,在很多信息科學領域都有應用。


  比如信息論可以用來做統計分析,可以用來開發人工智能,可以用來優化投資策略等。


  先從一個貌似不相幹的西方曾經流行的遊戲“二十個問題”說起。遊戲是這樣的:俺心裏想一樣東西,你可以問俺二十個問題,然後猜俺心裏想的東西。你的問題必須是“是不是”這種形式的。比如,這個東西是不是可以放進冰箱裏?這個東西是不是活的?這個東西是不是能吃?諸如此類。對於你問的每一個問題,俺必須如實地回答“是”或者“不是”。你在二十個問題之內猜到了我想的東西就算贏。


  這個遊戲的關鍵是在於如何有效地問你的問題。如果你問“明天是不是下雨”,那你肯定腦子進水了,可以不用往下看了。如果你第一個問題問的是“這東西是不是 iPhone 6”,這樣的問法顯然也效率不高,因為俺一旦說“NO”,你隻從大量的可能性中排除了一種可能,還是要麵對剩下巨大的猜測空間。


  這個遊戲可以大致等價於這樣一個數字遊戲。假設M是個大於1的正整數,俺倆在玩遊戲之前就商議確定好。俺在1到M之間任意想一個整數,你的任務是用最少的“是不是”形式的問題問出這個數是多少。


  對於這個數字版的“二十個問題”遊戲,聰明的寶寶都會發現類似這樣的結論:M的數值越大,需要的問題越多。但愛鑽研的同學可能會想到另一個問題:對於一個給定的問問題策略,所需問題的“多”或“少”又是用什麽來衡量的呢?比方說,M=8,而你的問法是依次問如下問題:“這個數是不是1”,“這個數是不是2”,“這個數是不是3”,一直到“這個數是不是7”(如果問完“這個數是不是7”你覺得還需要問“這個數是不是8”的話,那請你去看韓劇吧)。在這種情況下,如果俺想的數字是1,你隻需要一個問題就可以知道答案;而如果俺想的數字是8,你必須在問完7個問題之後才能知道答案。換句話說,即使問問題的策略確定,因為俺心裏那個神秘數字的不確定性,你所需要的問題數目也是不確定的。因此我們需要把這個數字版“二十個問題”遊戲更準確地描述出來,或者說,把在什麽意義上“最少”定義出來。


  讓俺先喘口氣,喝口水,扯點概率論,回頭再看這個問題。


  咱們也別講究數學的嚴謹了吧,直接講這個叫隨機變量的東東。


  隨機變量描述的是一個隨機實驗可能出現的結果以及每種可能結果的可能性,也就是概率。先看一個例子。


  例[老千擲硬幣]:假設某老千每次投擲硬幣的結果有1/3可能性出正麵,2/3的可能性出反麵。那麽擲一次硬幣就是一個隨機實驗,擲硬幣的結果就是一個隨機變量,我們這裏記作大寫的 X。如果把正麵記作1,反麵記作0,那麽這個隨機變量 X 可以通過一個函數P(x)來描述:函數的變量(小寫的)x的取值範圍是集合{0,1},這個集合此後記作 S;函數在0和1的取值分別為:P(1)=1/3,P(0)=2/3。


  從這個例子可以看出,一個隨機變量 X 無非是通過在某個集合S上定義的一個函數P(x)來描述的,而這個函數不能取負值,而且必須在對其變量 x 求和的時候結果為1(在老千擲硬幣的例子中即:P(0)+P(1)=1)。這個函數通常被稱為隨機變量X的概率分布。


  當然,同樣是擲硬幣,可以定義出很多不同的隨機變量(即不同的概率分布函數P(x))來。普通人擲硬幣對應的隨機變量基本就是P(0)=P(1)=1/2。賭神擲硬幣對應的隨機變量可能是P(0)=1, P(1)=0。


  生活中的隨機變量比比皆是。比如,在擲骰子的時候,骰子擲出的結果這個隨機變量對應於一個定義在S={1,2,.……,6}上的概率分布函數 P(x),通常認為P(1)=P(2)=……=P(6)=1/6。再比如明天會不會下雨(天氣預報不準的啦),會有幾個人給俺這篇吐血之作點讚或轉發(不曉得多少人更喜歡韓劇的啦)這些不確定的事情裏都可以定義出隨機變量來。記得不知道哪一位偉人曾經說過,“隨機變量是到處都有的。對於我們的腦袋,不是缺少隨機變量,而是缺少發現。”


  在前麵說的那個數字版“二十個問題”遊戲中,俺心裏想的神秘數字對你來說也是一個隨機變量,它的概率分布P(x)是定義在S={1,2,.……,M}上的函數。如果我選數字是“完全隨機的”,那麽,這個函數就是P(1)=P(2)=……=P(M)=1/M。這種分布通常被稱為均勻分布。當然,取決於俺按什麽偏好選數字,這個函數也可以取其他形式:如果俺就是喜歡2,也許俺會以更高的概率取2。


  假設有個隨機變量 X,它的取值範圍 S={1, 2,…, M},它的概率分布函數是某個定義在S上的函數 P(x)。那麽這個隨機變量的均值(更文化點的說法叫數學期望值)就是這樣一個東東:

  1*P(1)+2*P(2)+3*P(3)+…+M*P(M).

  在上麵老千擲硬幣的例子中,隨機變量 X 的均值就是 1*(1/3)+0*(2/3)=1/3。簡單吧。


  很多同學可能都有直覺的認識,能感覺到如果把產生這個隨機變量 X 的隨機實驗做很多次,把得到的數字取平均,那麽這個平均數差不多就是 X 的均值。這個概念,叫做大數定理,跟俺要講的熵有著本質的聯係,俺這裏不敢唐突,稍後會帶同學們仔細品味。


  很多時候俺們關心的不止一個隨機變量,而是很多隨機變量。比如,俺們同時關心兩個隨機變量 X 和 Y,X 的取值範圍是{1, 2}, Y 的取值範圍是{1, 2, 3}。那麽俺們可以把這兩個隨機變量看作一個隨機變量對,寫作(X, Y),而把它的取值範圍理解為所有可能的(X,Y)取值的組合,也就是{(1, 1),(1, 2),(1, 3),(2, 1),(2, 2),(2, 3)}。把這個集合叫作S,那麽這對隨機變量就是通過一個定義在S上的概率分布函數 P(x, y)來描述的。當這個隨機變量對的分布滿足 P(x, y)=P(x)P(y)的時候,俺們就稱這兩個隨機變量是相互獨立的。


  P(0, 0)= P(0)P(0)=(2/3)(2/3)=4/9

  P(0, 1)= P(0)P(1)=(2/3)(1/3)=2/9

  P(1, 0)= P(1)P(0)=(1/3)(2/3)=2/9

  P(1, 1)= P(1)P(1)=(1/3)(1/3)=1/9

  獨立隨機變量的概念當然可以推廣到更多的隨機變量上。如果有 n 個隨機變量,它們的取值無非就對應了一個長度為 n 的序列。所有這樣序列的集合就是這組隨機變量的取值範圍。如果這些隨機變量是相互獨立的,那麽每個序列出現的概率無非就是把這個序列中每個數出現的概率乘在一起。比如,上麵的老千連續擲了10次硬幣,那麽出現1101011110的概率就是:

  (1/3)(1/3)(2/3)(1/3)(2/3)(1/3)(1/3)(1/3)(1/3)(2/3)=(1/3)^7 *(2/3)^3.

  哎,累死俺了,這個也要講,學霸們可能要打瞌睡了。不好意思,俺怕講得太快,有的同學要去看韓劇了。哎,致敬也是體力活啊!

  大數定理的英文是,它的中文翻譯通常是“大數定律”而不是大數定理。但俺卻偏要叫它大數定理!


  定律或是英文裏的 law 都是指不需要證明但可以被驗證的理論假設。比如牛頓的萬有引力定律。從數學上說,不需要證明就被接受的假設被認為是公理。但是這個大數定理並非公理,它是被嚴格證明出來的(證明也不複雜,隻要用馬爾可夫不等式或切比曬夫不等式就行了),因此準確的數學語言應該叫它“定理”。管他叫“定律”會讓人以為這個東東就是假設出來的公理,從而產生歧義,當年也不知道誰這麽沒涵養管它叫“law”。所以,不管你們服不服,俺都要管它叫大數定理。


  大數定理大概說了這樣一個意思。假設有某個隨機實驗會產生一個隨機變量 X。如果你重複做這個隨機實驗 n 次,你就會得到一個隨機變量序列 X1, X2, X3,…, Xn。這裏假定這些隨機變量相互獨立(即這些隨機實驗互不影響)而且 n 是個很大的數(比如,一萬,十萬,百萬),那麽把這 n 個數加起來除以 n (即取平均),得到的數(即(X1+X2+…+Xn)/n )幾乎總是很接近隨機變量 X 的均值。同學們注意一下俺這裏“幾乎總是”和“很接近”的用詞哈。雖然俺是個馬虎的人,這裏的遣詞造句是極其考究,極負責任,極具情懷的。


  咱們用老千擲硬幣的例子先看看大數定理到底說了些啥子嘛。假設那個老千擲了 n 次硬幣,那麽他就得到了 n 個在{0, 1}裏取值的數。因為這 n 個數都是隨機的,這 n 個數的均值當然也是個隨機變量,就是說也有一個概率分布函數,有一定的不確定性。大數定理告訴俺們,當 n 很大的時候,這 n 個數的平均值“幾乎總是很接近”1/3。“幾乎總是”和“很接近”是可以在數學上嚴格定義的,不過當俺講完它們的定義的時候,估保守,但俺碼字已經快要吐血,正在後悔俺為什麽要攬下這麽個差事,所以就隨便套了一下切比曬夫不等式得出下麵這些“至少有”的結論):

  當 n=1000 時,至少有 91.1%的概率這個平均值很接近1/3。


  當 n=10000 時,至少有 99.1%的概率這個平均值很接近1/3。


  當 n=100000 時,至少有 99.9%的概率這個平均值很接近1/3。


  如果把“很接近1/3”理解為跟 1/3 相差不到 0.02,那麽:

  當 n=1000 時,至少有 44.4%的概率這個平均值很接近1/3。


  當 n=10000 時,至少有 94.4%的概率這個平均值很接近1/3。


  當 n=100000 時,至少有 99.4%的概率這個平均值很接近1/3。


  當 n=1000000 時,至少有 99.9%的概率這個平均值很接近1/3。


  現在展開你想象的翅膀,你應該看到當 n 變成無窮大的時候,這個平均值就不再是“幾乎總是很接近1/3”,而是“就是1/3”了!


  至此同學們可能已經體會出俺極其考究、極負責任的“幾乎總是很接近”了吧。這裏的情懷還是讓俺帶你們領略一下吧。老千擲出的序列當然是隨機的、不確定的、沒有規律的。這個序列的平均數雖然也在1/3周圍隨機跳動,但卻隨著 n 的增大越發確定起來。當n很小、她就在你跟前的時候,變化多端、捉摸不定的她讓你無法看清;當 n 增大的時候,她漸行漸遠,但她在風中顫動的身影卻在你記憶的相機裏慢慢聚焦,越來越清晰;直到她消逝在無限的遠方,她竟定格成一幅永恒而又無比真切的畫麵.……

  學霸們可能會覺得俺太矯情了:不就一個簡單的大數定理嗎,有必要這麽忽悠嗎?其實俺也覺得自己有些矯情。但看完本文之後,俺請你再回頭體會一下大數定理的情懷。


  “二十個問題”遊戲的準確規則及特例


  用概率論武裝一下之後,同學們應該已經認識到,在“二十個問題”遊戲中俺心裏想的神秘數字其實就是一個隨機變量 X。我們可以假設它的取值範圍S={1, 2,…, M}和概率分布函數 P(x)都已知。當然在實際情況下我們未必真知道 P(x),但往往可以大致估計這個函數。如果對這個分布函數我們一無所知,我們不妨認為 P(x)是個均勻分布。


  對於任意一個給定的問問題策略,如果俺心裏的神秘數字是 x,我們把所需的問題個數記作 L(x)。比如 M=8,而我們用前麵提到的那個從1問到7的策略問問題,我們就會得到:

  L(1)=1, L(2)=2, L(3)=3, L(4)=4,


  L(5)=5, L(6)=6, L(7)=7, L(8)=7。


  (對,L(8)=7,俺沒敲錯。)

  因為俺心裏想的是個隨機變量 X,在這個策略下所需要的問題數目 L(X)就也是個隨機變量。這個隨機變量 L(X)也有一個分布,在知道 P(x)的前提下,如果想算也是可以算出來的。但是俺懶得算它。


  既然 L(X)是個隨機變量,一個最自然的方式定義這個策略所需要的問題個數就是用這個隨機變量的均值,或者說用平均所需要的問題個數。如果你的數字直覺好,應該可以看到,即使不求 L(X)的分布,這個隨機變量的均值其實就是


  L(1)*P(1)+L(2)*P(2)+…+L(M)*P(M).

  用 L(X)的均值定義一個問問題策略所需要的問題個數除了“自然”,還有什麽物理意義嗎?當然!前麵的大數定理告訴咱們,如果你用這個策略玩這個遊戲很多次,你所用問題個數的平均值“幾乎總是很接近”L(X)的均值。而當你玩了這個遊戲無數次之後,你平均每次用的問題數就正好是這個 L(X)的均值。


  由此可見,如果俺們準備玩這個遊戲很多次,那麽用 L(X)的均值定義所需要問題的個數,用金星老師的話說就是一個動作兩個字:完美。


  至此,俺們已經確定這個“二十個問題”遊戲的準確規則,即:你要設計一種問問題的策略,當用這個策略跟俺玩很多次(更準確的說,無數次)這個遊戲之後,平均每次用的問題個數要越少越好!換句話說,我們希望尋找一個最好的問問題策略,同時確定最少需要多少個問題(平均意義上)。


  其實在一些特殊的情況下,確定最優的問問題策略和最少需要的問題個數並不困難。


  考慮這樣一個特例:俺心裏的神秘數字 X 的取值範圍是 S={1, 2,…, 8},而且 X 的概率分布函數是個均勻分布。那麽最優的問問題方法就是所謂的“二分法”:每問一個問題要把這個神秘數字的可能範圍縮減一半。比如這樣的問法:

  問題1:把集合{1, 2,…, 8}分成左右兩份,左邊的是{1, 2, 3, 4},右邊的是{5, 6, 7, 8}。然後問:你想的數是不是在左邊啊?


  問題2:根據俺的答案,你可以確定這個神秘數字隻剩下四種選擇。你再類似地把四種選擇分成左右兩份,然後問:你想的數是不是在左邊啊?

  問題3:根據俺的答案,你現在可以確定這個神秘數字隻有兩種選擇,再把它們一個放左邊,一個放右邊。你再問:你想的數是不是在左邊啊?


  如此問完三個問題,你一定知道了俺的神秘數字。相信你的直覺也應該告訴你,這就是最優問法!那麽在這個例子裏,所需的最少問題個數就是 3。從咱們用每個問題把猜測空間一切兩半的問法,同學們應該也已經認識到,這裏得出的最少問題數 3 正是因為 8=2^3,或者說,2= log 8.(本文中所有的對數操作均以2為底數)。


  在這個例子中有個現象也值得注意一下:不管俺心裏想的是個什麽數字,使用二分法所需的問題數字都是3,一個完全確定,毫無隨機性的數字。


  這個特例顯然可以推廣:如果神秘數字 X 的概率分布函數是在 2^K 種可能性上的均勻分布,那麽“二十個問題”遊戲的最優策略可以通過二分法實現;在這種策略下,不論神秘數字是什麽,問出它所需要的問題數都是 K,因此所需要的平均問題數也是 K。同學們請用紅筆圈下這個結論(小心別把手機觸摸屏劃壞了),咱麽晚點要用到這個結論。


  當然,這個二分法隻適合於這樣的特例,當神秘數字的可能性總數不是2的多少次方的時候,或者當神秘數字的分布不均勻的時候,這種問法顯然不是最優的。這個問題任意形式的最優解法曾讓一個叫大衛·霍夫曼(David Huffman)的年輕學生在1951年一夜成名。不過,那已經是在香農提出信息論三年之後了。


  在香農獨特的視角裏,這個問題並不至關重要。在俺的想象中,當香農看到滿屋子小朋友們嘰嘰喳喳地玩這個遊戲的時候,他笑了笑,說:你們慢慢玩吧。然後他點起一支煙,凝視著窗外的遠方。在落霞與孤鶩齊飛的秋色裏,他看到了這個遊戲的另一種設計。


  既然用 L(X)的均值定義所需要問題的個數依賴於把這“二十個問題”遊戲玩很多次,那麽考慮一下這個遊戲的一個變種,就是把這很多次遊戲攢起來一起玩:俺拿出一張很長很長的紙條,然後隨機想 n 個相互獨立的神秘數字,X1, X2,…, Xn (每個數字的分布都是同一個定義在 S={1, 2,…, M}上的概率分布函數,P(x))。俺把這些數字一個一個地寫到紙條上。這裏 n 很大很大,所以紙條很長很長。然後你再來問俺“是不是”台或一百台電腦來。你問俺的問題要是計算太複雜,俺也可以去搬電腦來算。總之,咱們不用管計算有多複雜,俺倆都有無限的計算能力。在這個攢著玩的“二十個問題”遊戲中,怎樣的問問題策略才最優呢?最優的策略所需要的平均問題數目又是多少呢?

  暫且先不討論這個問題的答案,咱們先審視一下這個新的遊戲設計的應用意義吧。


  想象一下,俺寫在紙條上的序列其實是俺剛寫好的長篇小說(俺寫下的每一個數其實對應於新華字典裏的一個字),又或者俺寫在紙條上的序列其實對應於俺長期夜觀星象的結果,記錄了不為人知的宇宙奧秘(俺寫的每個數字都是對觀測到的宇宙狀態的描述)。在你問俺問題的時候,俺的回答將是一個長長的由Yes/No 組成的序列。如果把 Yes 記作 1,No 記作 0,俺的回答其實就是一個0/1組成的序列。


  一個可以取 0/1 兩個值的變量,或者一個可以儲存 0/1 兩種不同狀態的存儲單元,就是人們常說的比特(bit)。所以俺的回答其實就是一個比特序列。你希望用最少的問題就等同於要求這個比特序列最短,或者說要求用最少的比特數表示俺紙條上的內容。這個問題其實就是通信中的數據壓縮問題!


  數據壓縮,又叫“信源編碼”,大約是幹這樣一件事。假設有個信息源,就是一個能不停往外蹦信息的東西,比如一直在想神秘數字的俺,夜觀星象的俺,寫小說的俺,等等等等。信息源產生的信息從數學上說就是一個隨機變量序列(更有文化的說法叫隨機過程)。這個隨機變量序列可以有很多種形式,最簡單形式就是其中的隨機變量都相互獨立而且服從相同的分布。對這個信息源進行數據壓縮包括了兩個環節,編碼和解碼。編碼就是把從信息源蹦出來的隨機序列表示成比特序列,而且越短越好;解碼就是從比特序列中還原出信息源蹦出來的隨機序列。數據壓縮可以大幅度降低數據存儲和通訊需要的資源,已經是現代通信技術的一個重要組成部分。


  現在回到“二十個問題”遊戲。如果這個遊戲一個一個分開玩,其實就是在數據壓縮的時候,對信息源裏蹦出的每個隨機變量單獨做壓縮。如果這個遊戲攢 n 個一起玩,其實就是對隨機序列中的 n 個隨機變量同時進行壓縮。顯然,對每個隨機變量單獨進行壓縮一定不會比對整個隨機序列同時做壓縮效率更高(這裏的效率是用平均每個隨機變量壓縮後的比特數來衡量的,比特數越低,效率越高)。這裏的道理是這樣的:比如俺倆攢 n 個“二十個問題”遊戲一起玩,但你設計問題的時候,每個問題隻是針對序列中的一個隨機變量,而不是針對整個序列。這樣的問問題策略顯然等同於把每個遊戲分開玩。也就是說,這個遊戲一個一個分別玩可以認為是攢起來一起玩的一種特例。因而分別玩能達到的效率,攢起來玩也可以達到。因為同樣的道理,如果這個遊戲攢 2n 個一起玩,其效率也一定不比攢 n 個一起玩低。也就是說,為了提高效率,n 應該越大越好。


  那麽攢起來玩的效率到底最高可以達到多少呢?或者說,對一個給定的信息源,平均每個蹦出來的隨機變量最少需要多少個比特來表示呢?這個數字通常跟序列的長度 n 相關,而且對於任意一個給定的 n,即使俺們能夠確定最優的壓縮方法,精確地確定這個數字也是一件很棘手的事。不過既然俺們已經認識到 n 越大越好,那不妨考慮 n 取無窮大吧。


  當 n 取無窮大時,如果俺們能夠計算出信息源裏平均每個蹦出的隨機變量最少需要多少比特來表示,這個數字不僅標記了最優的壓縮效率,它同時還有著更深刻的物理意義:它跟序列的長度 n 無關,也跟編碼方法無關;換言之,這個比特數隻取決於信息源本身(即隨機變量X或其分布 P(x))。因為這個比特數是由最優編碼/解碼方法實現的,它同時說明了兩件事:

  1.隻要解碼端接收到的平均比特數不到這個數字(平均到每個隨機變量上),不論用什麽編碼/解碼方法都一定無法重建信息源裏蹦出的隨機序列。


  2.隻要解碼端接收到的平均比特數超過這個數字,就一定有一種編碼/解碼方法可以使解碼端重建這個序列。


  這就是說,在平均意義上,你一定需要這麽多比特來表達信息源裏蹦出的每一個隨機變量,而且隻要這麽多比特就夠了!因此,這個比特數實際上就標注了這個信息源在以什麽樣的“速率”釋放“信息”,或者說標注了這個信息源裏蹦出的每個隨機變量平均包涵了多少“信息”!

  下麵俺們就來看看是否可以導出這個最小比特數。


  嗯,沒錯,終於要掀開她的紅蓋頭了。等不及了吧。


  最小比特數

  還是二十個問題攢著玩吧。不過這次俺也不去想什麽隨機數了。俺就把之前例子裏的那個老千找來,讓他躲在俺身後不停地擲硬幣。俺就把他擲出的0/1結果寫在紙條上。等俺寫完 n 個數的時候,就讓你開始問問題。前麵說過,這無非就是把這個老千擲硬幣的結果當作一個信息源,對這個信息源做壓縮。


  因為 n 很大很大,讓我們先回顧一下大數定理的情懷:


  老千擲出的硬幣序列的平均值幾乎總是很接近1/3。


  根據俺之前對這句話不辭勞苦的解釋,這句話也可以換一種說法,而且這種說法很重要(重要的事情說三遍!)

  老千擲出的序列幾乎可以肯定有差不多 n/3 個1 和 2n/3 個0!


  老千擲出的序列幾乎可以肯定有差不多 n/3 個1 和 2n/3 個0!


  老千擲出的序列幾乎可以肯定有差不多 n/3 個1 和 2n/3 個0!


  同學們再好好體會一下俺極其考究、極負責任、極具情懷的用詞:“幾乎可以肯定”和“差不多”。


  這個重要結論很容易推廣到擲硬幣之外的任意隨機變量:假設隨機變量 X 是通過一個在集合 S={1, 2,…, M}上定義的概率分布函數 P(x)描述的。那麽當俺們產生 n 個相互獨立的這樣的隨機變量的時候,如果 n 是個很大的數字而 a 是 S 中的任意一個數,那麽:

  產生的隨機序列幾乎可以肯定有差不多 n*P(a)個 a !


  產生的隨機序列幾乎可以肯定有差不多 n*P(a)個 a !


  產生的隨機序列幾乎可以肯定有差不多 n*P(a)個 a !


  也就是說,雖然得到的序列本身是隨機的,不確定的,但是當 n 很大的時候,這個序列的組成“幾乎”是“差不多確定的”!而且可以想象,當 n 無窮大的時候,這裏的“幾乎”和“差不多”都可以刪去!


  在老千擲硬幣這個例子裏,如果一個硬幣的序列有差不多 n/3 個1 和 2n/3 個0,那麽俺就管這種序列叫“典型序列”。在更普遍的意義上,相對於一個在S 上定義的分布 P(x),一個由 S 裏的數字組成的長度為 n 的序列俺也管它叫典型序列,如果 S 裏的每個數 a 在這個序列中出現了差不多 n*P(a)次。在典型序列定義中的“差不多”是差多少?嗬嗬,跟前麵的邏輯一樣,如果 n 很大,差不多就是差一丁點,如果 n無窮大,差不多可以是“一點不差”!

  那麽上麵重要的說了三遍的話用這個語言重新說,就是:


  老千擲出的序列幾乎可以肯定是典型的!

  老千擲出的序列幾乎可以肯定是典型的!

  老千擲出的序列幾乎可以肯定是典型的!

  當 n 無窮大的時候,這句話裏的“幾乎”當然也是可以刪掉的。也就是說,在 n 無窮大的時候,不典型的序列根本不會出現!那麽,你問問題的時候豈不是隻需要針對典型序列問問題就行了?

  正是如此!


  那咱們看看典型序列一共有多少個。把這個要算的數記作 T。


  首先注意一下每個典型序列有多大的概率被老千擲出來。因為每個典型序列“差不多”由 n/3 個1 和 2n/3 個0 組成,而這個序列中的所有隨機變量又是相互獨立的,那麽,每個典型序列被擲出來的概率“差不多”就是(1/3)^(n/3)*(2/3)^(2n/3)。不知道同學們注意到沒有,每個典型序列被擲出來的概率“差不多”都是這個數。同時注意到隻有典型序列才可能被擲出來,也就是說,所有典型序列出現的概率之和“差不多”就是 1。這樣俺們就可以得出,典型序列的數目 T “差不多”就是 1 除以每個典型序列出現的概率,也就是

  1/((1/3)^(n/3)*(2/3)^(2n/3))=(1/3)^(-n/3)*(2/3)(-2n/3).

  針對這 T 個序列問問題,就“差不多”等同於俺跟你玩一次這樣的“二十個問題”遊戲:俺從{1, 2,…, T}裏取一個數,而且這個數服從均勻分布;然後你問俺“是不是”問題來猜這個數。那麽你最少需要多少問題呢?現在回頭找到之前讓你們用紅筆圈出的結論:最優解是二分法;你最少需要的問題總數是 log T!而且不管俺取的是哪個數,你都需要這麽多問題!

  認真的同學可能會叫板說,哎,這個 T 也未必是 2 的整數次方啊,二分法能用嗎?!嗯,這個問題不錯。但可以這樣想,隻要把 n 弄得足夠大,總可以讓 T 非常接近 2 的某個整數次方。而且,即使 T 真的不是 2 的整數次方,還可以換一個角度得到我們後麵要得到的結論,比如,一定存在一個整數K 使得 T 是在 2^K 和 2^(K+1)之間……總之,當 n 無窮大的時候,淩亂的世界都變整齊了,這個問題不再是問題了。


  這個最少問題數 log T 是用來問這個長度為 n 的硬幣序列的。平均到每次擲硬幣,平均需要的最少問題數就是(log T)/n。稍微整理一下這個表達式就應該可以看到,這個數字正好等於-(1/3) log(1/3)-(2/3) log (2/3)。


  這也就是壓縮這個“老千擲硬幣”信息源所需要的最少比特數。


  把這種推演用到任意信息源。如果一個信息源往外蹦的隨機變量都獨立而且服從同一個定義在S={1, 2,…, M}上的分布P(x),那麽以下結論依次成立。


  信息源裏蹦出的隨機序列幾乎可以肯定是典型的!

  每個典型序列出現的概率差不多就是 P(1)^(nP(1))*P(2)^(nP(2))*…*P(M)^(nP(M))!

  典型序列的個數 T 差不多就是P(1)^(-nP(1))*P(2)^(-nP(2))*…*P(M)^(-nP(M))!

  壓縮這個信息源蹦出的每個隨機變量平均所需要的最少比特數就是(logT)/n!


  這個數字(logT)/n 就等於:-P(1)log P(1)- P(2) log P(2)-…- P(M)log P(M).

  這個數字,就是熵。


  從熵的表達式看,熵是通過一個概率分布函數 P(x)來定義的。因為概率分布函數 P(x)都對應於它所描寫的隨機變量 X,所以俺們也可以認為熵是對隨機變量 X 的某種特性的度量,而把它記作 H(X)。從壓縮的角度講,熵值 H(X)是對產生隨機變量 X 的信息源編碼所需要的平均最小比特數,或隨機變量 X 中固有的平均信息量。


  如果隨機變量 X 是在 S={1, 2,…, M}裏取值,那麽可以證明,熵值 H(X)的取值必定在 0 和 logM 之間。當隨機變量 X 在 S 上均勻分布的時候,H(X)取最大值 logM;當 X 以百分之百的概率取 S 中的某個數值的時候,H(X)取最小值 0。前者對應於“不確定性”最大的 X,而後者對應於“不確定性”最小的(即完全可以確定的)X。所以,也可以把熵值 H(X)理解為對隨機變量 X 的“不確定性“(或“不可預測性”)的度量。


  因此,隨機變量所包含的“信息量”和它的“不確定性”其實是同一個概念。一個隨機變量越難以確定,它所包含的信息量越多。這種認識對初次接觸熵的人來說或許不夠自然。但仔細體會一下,確實是有道理的。如果俺想告訴你的事你很容易猜到,或者說你不用問幾個問題就能知道,那俺要說的話對你來說就沒多少信息量。


  在熵的定義裏-logP(a)又是什麽物理意義呢?當然這個數字可以理解為 a 編碼所需要的比特數(在前麵例子裏,我們能看到以1/8概率出現的事件,需要用3個比特來編碼)。換一個角度理解,-logP(a)可以理解為 a 的“驚奇度”。一個出現概率極低的事件 a,比如世界末日,它一旦出現就會令人非常驚奇,所以對應的-logP(a)就會很大;而如果 a 出現的概率很大,它的出現就不會太令人吃驚,所以對應的-logP(a)就會很小。因此,熵值 H(X)也可以理解為隨機變量 X 的“平均驚奇度”。


  用不確定性,信息量,或平均驚奇度來理解熵,都隻是給它賦予一個直覺的解釋。平均最小編碼長度才是對熵的數學理解。但這種理解並不能體現出大數定理在熵的定義裏所起的決定性作用以及“二十個問題”遊戲必須攢著玩才能實現最短問題數等於熵值的深刻認識。在大數定理的情懷下,熵值 H(X)還有另一個數學解釋: H(X)是典型序列的總數隨序列長度的“翻倍速率”。看,長度為 n 的典型序列總數 T 差不多是 2^(nH(X));也就是說,每當序列長度 n 增加 1, T 就增大 2^(H(X))倍,或者說,翻倍翻了 H(X)次。所以把熵理解為典型序列總數的翻倍速率才能真正體現熵的數學本質。當然,這樣的理解就離韓劇更加遙遠了。


  熵,或英文裏的entropy,本來源於物理中的熱力學,用來描寫係統的“混亂度”。香農在定義信息熵的時候借用了這個詞。雖然俺經常夜觀星象,也能在夜空沒有霧霾的時候認出北鬥星,但對宇宙、相對論,或是熱力學,都一竅不通。所以俺就不試圖解釋物理熵和信息熵的聯係了。


  但在通信的範疇,熵是人類第一次對信息有了數學的認識。人類剛剛開始研究數字通信的時候基本就是瞎子摸象,直到1948年香農在貝爾實驗室發表了那篇著名的文章,“通信的數學理論”。倚天劍一出,天下皆驚。香農一針見血地指出,通信的問題可以分解成兩個的問題,即信源編碼和信道編碼。信源編碼的目的是盡可能高效的表示信息源,即數據壓縮;信道編碼的目的則是盡可能高效的讓數據可靠無誤地通過信道。在他1948年的文章裏,香農證明了信源編碼的極限是信源的熵,而信道編碼的極限則是個叫信道容量的東東,標注著信道可以支持的最大通信速率。(信道容量的概念是在熵的基礎上的對信息論的進一步發展,故事更長,更精彩,不過俺還是不講了吧。)香農說,隻有當信源的熵低於信道的容量的時候,可靠的通信才可能實現;而且隻要在這個條件下,可靠的通信就一定可以實現!香農的證明是存在性證明,就是說,他告訴俺們:反正這事兒一定可以實現,至於怎麽實現,你們自己想辦法吧。


  信源編碼的問題很快被香農的追隨者和逐步解決。基於算術編碼(arithmetic g)和 LZ 編碼(Lampel-Ziv g)的信源編碼方法在上世紀七八十年代已經日漸成熟,實現了香農預測的壓縮極限並在實踐中被廣泛采納。而香農預測的信道編碼的極限,信道容量,卻花費了人類半個世紀掙紮。業外人士未必了解,對信道編碼的研究結晶了人類最高的智慧和前赴後繼的努力。然而香農預測的信道容量直到上世紀九十年代中葉才終於被實現。今天我們的手機裏也終於承載了香農在1948年的預言!


  熵的提出是信息論起點,也是人類對信息認知的開始,而香農在他1948年文章裏提出的數學工具正是信息論的骨架。在我們今天生活的信息時代,香農和信息論存在於我們的手機,我們的電腦,我們的電視,我們的藍光播放器,我們的inte,我們的facebook,我們的韓劇……

  大約七十年前,當人們還在黑暗中摸索數字通信的時候,香農說,要有熵。於是,就開啟了信息時代。

上一章目录+书签下一章