熵方法

信息熵

不同的話語包含的信息量是不一樣的。一句短小的話可能包含着很大的信息量,而一句冗長的話可能只含有一點點信息量。因此我們想知道一句話所包含的信息量,但看它的長度肯定是不對的,而是應該看它以最好的方式被壓縮以後長度是多少

我們把一句話看作一個二進制串,更一般地,一句話應當是一個隨機生成的二進制串,也就是說,一個“隨機變量”。一句話所包含的信息量與生成這句話的隨即方式有關:假如我們就生成長度爲\(n\)的二進制串,如果一種方式是始終輸出全0串,那麼這句話包含的信息量是很小的,因爲我們只得到了“全0”以及“長度”這兩個信息,我們很容易把這個串壓縮成一個很短的串;而另一種方式是每一位都均勻隨機的生成0或1,在這種情況下不同隨機狀態下我們會得到完全不一樣的串,我們幾乎無法對它進行任何的壓縮,因此這句話的信息量是很大的。

香農提出了一個定量描述信息量的方法,稱爲“信息熵”。假設我們關注的隨機變量\(X\)是從一個\(1,\cdots,n\)上的概率分佈,\(\Pr[X=i]=p_i\),那麼\(X\)的信息熵定義爲

\[H(X)=\sum\limits_{i=1}^{n}p_i \log_2\dfrac{1}{ p_i} \]

事實上,這個表達式是可以被公理化的。通過四條公理我們就能唯一確定信息熵的表達式必須呈現這樣的形式。分別是:①對稱性, 對\(X\)的概率分佈做一個permutation不影響信息熵的大小;②連續性,當某個\(p_i\)發生微小變化時\(H(X)\)的變化也是微小的;③單調性,如果分佈是均勻隨機的,那麼\(n\)越大信息熵越大;④鏈式法則,設\(Z\)表示\((X,Y)\)(代表\(X,Z\)共同的信息),那麼\(H(Z)=H(X)+H(Y\mid X)\),表示兩個隨機變量的信息熵等於一個隨機變量的信息熵加上在已知一個隨機變量的前提下另一個隨機變量的信息熵(其中,\(H(Y \mid X)\)定義爲\(\sum\limits_{x}\Pr[X=x]H(Y\mid X=x)\))。

我們會看到,用熵方法來解決組合問題時,本質上是在用概率方法,而我們又已經看到概率方法本質上就是計數方法。所以這一切仍然只是計數方法而已。但計數方法是通用的底層的方法,熵方法和概率方法一樣,能爲我們解決問題提供更高的視角和更巧妙的手段。

壓縮編碼

現在就來看壓縮編碼問題。對於一個隨機變量,我們可以對它的每種可能的結果來用二進制編碼,而二進制編碼所需要的位數就是它最好能被壓縮的長度。我們將會看到,這個長度就是隨機變量的信息熵的大小。

比如我們的隨機變量就是在\([n]\)均勻分佈的,即恆有\(\Pr[X=i]=\dfrac{1}{n}\),那麼我們可以計算信息熵\(H(X)=\sum\limits_{i=1}^{n}\dfrac{1}{n}\log_2 \dfrac{1}{1/n}=\log_2 n\)——這很符合我們的直觀,因爲\(1,..,n\)的正整數直接用二進制表示就需要\(\log_2 n\)位,不可能做得比這更優了。我們嚴格地說明這件事。\(H(X)=\sum\limits_{i=1}^{n}p_i\log_2 \dfrac{1}{p_i}\)可以寫作“期望”:\(H(X)=E[\log_2 \dfrac{1}{p_i}]\)(把\(\log_2 \dfrac{1}{p_i}\)看作一個隨機變量而已),根據Jensen不等式,因爲\(\log_2(x)\)是上凸函數,所以有\(E[\log_2 \dfrac{1}{p_i}] \leq \log_2 \left(E\left[\dfrac{1}{p_i}\right]\right)\),而根據期望的定義\(E\left[\dfrac{1}{p_i}\right]=\sum\limits_{i=1}^{n}p_i\dfrac{1}{p_i}=n\),於是我們證明了\(H(X) \leq \log_2 n\)恆成立。這印證了“隨即均勻分佈”是信息量最大的語句。

那麼是不是所有的隨機變量,我們都能構造出期望長度爲\(H(X)\)的二進制串呢?我們來給出一種構造方法:首先不妨把\(p_1\)\(p_n\)從大到小排序,爲了使二進制串的期望長度爲\(H(X)\),我們就期待\(X=i\)時給出一個長度爲\(\ell_i=\left\lceil\log_2\dfrac{1}{p_i}\right\rceil\)的串,概率高的串就短,概率低的串就長,很符合直觀的“貪心要求”。爲了證明這樣真的是能夠做到的,我們現在來證明當我們要構造\(X=i\)對應的串的時候,我們能使用一個長度爲\(\ell_i\)的串,它不作爲任何串的前綴。這意味着,假如我們想象一棵二叉樹,左兒子邊對應0,右兒子邊對應1,那麼一個串就是一條從根節點到某個節點的路徑,爲了保證任何以這個串爲前綴的串都不再是合法的,我們需要刪掉末尾節點爲根節點的整個子樹。我們只需要證明,當我們想構造\(X=i\)對應的串時,樹上依然存在從根節點出發的長度爲\(\ell_i\)的串。我們計算來說明這一點:最初樹上有\(2^{\ell_i}\)條這樣的路徑,假如對於\(j<i\),我們刪除了以\(j\)爲根節點的子樹,那麼會導致消滅了\(2^{\ell_i-\ell_j}\)條我們想要的路徑。所以剩下的路徑條數至少有\(2^{\ell_i}-\sum\limits_{j=1}^{i-1}2^{\ell_i-\ell_j}=2^{\ell_i}\left(1-\sum\limits_{j=1}^{i-1}\dfrac{1}{2^{\ell_j}}\right) \geq 2^{\log_2 \frac{1}{p_i}}\left(1-\sum\limits_{j=1}^{i-1}\dfrac{1}{2^{\log_2 \frac{1}{p_j}}}\right)=\dfrac{1}{p_i}\left(1-\sum\limits_{j=1}^{i-1}p_j\right)>0\)。所以我們總能找到這樣的路徑。

現在我們要說明,別的編碼方法不可能更優。假設另一種編碼方法,把\(X=i\)編碼成\(\bar\ell_i\)。我們證明\(E[\bar \ell_i] \geq H(x)\),也就是證明\(E[\bar\ell_i]-E[\log_2 \dfrac{1}{p_i}] \geq 0\)。即證\(\sum\limits_{i}p_i\left(\bar \ell_i-\log_2 \dfrac{1}{p_i}\right)=\sum\limits_{i}p_i\left(\log_2 \dfrac{2^{\bar\ell_i}}{1/p_i}\right)=E[\log_2(2^{\bar\ell_i}p_i)] \geq 0\)。即證\(-E[\log_2 \left(\dfrac{1}{2^{\bar\ell_i}p_i}\right)] \geq 0\)。運用Jensen不等式,\(-E[\log_2 \left(\dfrac{1}{2^{\bar\ell_i}p_i}\right)] \geq\)\(-\log_2\left(E\left[\dfrac{1}{p_i \cdot 2^{\bar\ell_i}}\right]\right)\)。其中\(E\left[\dfrac{1}{p_i \cdot 2^{\bar\ell_i}}\right]=\sum\limits_{i=1}^{n}p_i \cdot \dfrac{1}{p_i \cdot 2^{\bar\ell_i}}=\sum\limits_{i=1}^{n}2^{-\bar\ell_i}\)。因此只需證\(\sum\limits_{i=1}^{n}2^{-\bar\ell_i} \leq 1\)。這個和式有個直觀意義:作爲一種編碼方式,每個\(\bar\ell_i\)都對應着二叉樹上某個點,我們給這些節點做上標記。我們想象一個人從根節點出發在二叉樹上隨機遊走,等概率走向左兒子和右兒子,如果碰到被標記的節點那麼就停止遊走。於是,它走到某個被標記的節點\(\bar\ell_i\)上的概率就恰好是\(2^{-\bar\ell_i}\),和式\(\sum\limits_{i=1}^{n}2^{-\bar\ell_i}\)是所有可能的停下來的情況之和,因此就代表“隨機遊走停下來”這一事件發生的概率。有相當的可能性,如果被標記節點沒有封鎖所有往下的路徑的話,那麼隨機遊走有可能永遠停不下來,此時這個和式的值就小於1,如果封鎖了全部路徑,這個概率就等於1。不管怎麼樣,我們通過這個隨機遊走的組合意義看到\(\sum\limits_{i=1}^{n}2^{-\bar\ell_i} \leq 1\)一定成立,這樣證明就結束了。

所以我們看到,一個隨機變量的熵真的能夠代表對它進行二進制編碼的最少位數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章