# 從計算機編碼的角度看Entropy
- [blog version](https://meetonfriday.com/posts/216f7e20/)
## Shannon Entropy
### 簡介
Entropy概念最早被用於熱力學,在1948年由Shannon將此概念引入[information theory](https://zh.wikipedia.org/wiki/%E4%BF%A1%E6%81%AF%E8%AE%BA)中,被用來**計算根據訊息的機率分布對訊息編碼所需要的平均編碼長度**,也因此Entropy也被稱之Shannon Entropy。
### 情境思考
在早期計算機設備昂貴的年代,如果需要傳遞一段由26個英文字母組成的英文文本,按照[ASCII code的編碼](https://zh.wikipedia.org/wiki/ASCII)每一個字元共需要8個bit進行編碼,但實際上並不是每個字母出現的頻率(或機率)都是相等的,因此,**如果可以讓越常出現的字元使用較少的bit數,而較不常出現的字元使用較多的bit數,就有機會整體傳送的bits數較少。**
- 你說節省傳送的bit數量有什麼好處? cost is money阿孩子
- 根據鴿籠原理,任何無損壓縮技術不可能縮短任何訊息,如果有一些訊息變短,則至少有一條訊息變長。
- 在實際使用中,由於我們通常只關注於壓縮特定的某一類訊息,一些編碼技術恰好使用了這特性。
- 對於壓縮編碼的技術,可以參考[霍夫曼編碼](https://zh.wikipedia.org/wiki/%E9%9C%8D%E5%A4%AB%E6%9B%BC%E7%BC%96%E7%A0%81)
對於上述的敘述,實際上,英文文本的平均編碼長度大約在4.7bits,也就是說,給予一段長度為10的英文文本:
- 不使用任何編碼壓縮技術,直接使用ASCII傳送的話需要 $8\times10 = 80$ bits
- 使用Entropy的編碼技術來傳送的話平均只要$4.7\times10 = 47$ bits
所以要怎麼知道對於某些訊息,應該要用多少bit來編碼呢? Entropy可以幫助你
### Entropy formula
先完整看一次Entropy的公式$$Entropy = -\sum_ip_ilog_b(p_i)$$
- 注意這裡log的底沒有限定是什麼,不同的b對應到不同單位,不過為了從information theory的角度出發,下面會用b=2來講解,此時的單位為**bit**
### 理解公式
這鬼東西跟編碼長度到底有什麼鬼關係?
簡化一下剛剛提到的情境來思考這個問題,現在假設需要傳遞一個由$S=\{S_1, S_2, S_3, S_4\}$組成的字串,使用ASCII的話每個字元需要8 bits來進行傳遞,但實際上只有四種可能,也就是說我們只需要 $$log_2(4)$$
2個bit就可以來進行四個答案的編碼了: {00, 01, 10, 11}
而我們又可以將上述的式子改寫一下$$log_2(4) = log_2(\frac{1}{\frac{1}{4}}) = -log_2(\frac{1}{4})$$
這裡的1/4可以看成是一個隨機變數的機率,並且1/4其實對應到了上面這個例子沒有提到的一個假設: **4個字元出現的機率是相等的**,基於機率相等的假設下,$S_1, S_2, S_3, S_4$都可以透過上述的公式算出需要2個bit的編碼。
不過並不是每個case都這麼是機率相等的,**為了可以套用在機率不同的情況下,需要引入期望值的概念**,也就是說式子變成了 $$\sum_ip_i\times S_i總共需要的編碼長度 = -\sum_ip_ilog_2(p_i)$$
- 實際上,將 $p_1 = p_2 = p_3 = p_4 = 1/4$ 帶入Entropy的公式也會得到2
- 在information theory中,$-log_2(\frac{1}{p})$也稱之為資訊本體(self-information),也就是說,**越不常出現的訊息往往帶著越大的資訊含量**。
所以到這裡我們可以說,**Entropy在算的是對於每個編碼,所需要長度的期望值**。
---
接下來繼續考慮上述問題,但是這次$S=\{S_1, S_2, S_3, S_4\}$的機率並不相等了,假設:
- $P(S_1)=1/4$
- $P(S_2)=1/8$
- $P(S_3)=1/2$
- $P(S_4)=1/8$
在這種情況下,各別需要的編碼數為:
- $S_1$需要2 bits編碼
- $S_2$需要3 bits編碼
- $S_3$需要1 bits編碼
- $S_4$需要3 bits編碼
我們可以隨便編,例如給$S_1$:10、$S_2$:011、$S_3$:0、$S_4$:111之類的,只要沒有衝突到就好了,然後算一下編碼長度的期望值$$-\sum_ip_ilog_b(p_i) = 1/4\times2+1/8\times3+1/2\times1+1/8\times3 = 1.75$$
所以平均編碼長度總共是1.75個bit。
你說小數是什麼鬼?阿不都說了是平均==,如果還覺得哪裡怪怪的話,那接下來來個實際情境想一下。
---
接續上述問題,假設由$S=\{S_1, S_2, S_3, S_4\}$組成的字串長度為200個字元,並且字元出現的次數恰好完全符合上述的機率分布,也就是說
- $S_1$出現了50次
- $S_2$出現了25次
- $S_3$出現了100次
- $S_4$出現了25次
所以傳遞這個字串總共需要$50\times2+25\times3+100\times1+50\times2=375$個bit,平均每個字元只用了375/200 = 1.75個bit。
### 結論
簡介了從Information Theory的Encoding角度去看待Entropy這件事,並透過簡單的例子回顧公式的意義。
重申一次,所以Entropy在Information Theory中的用途是**計算根據訊息的機率分布對訊息編碼所需要的平均編碼長度**。
### 延伸討論: Entropy必不能為負?
1. 從數學的角度講,因為$0<p_i<1$,所以$-p_ilog_bp_i>=0$
2. 從資訊意義的角度,取自[为什么信息量不能为负值?](https://www.zhihu.com/question/263824964)
> 因为,信息值为负的已经不能叫做信息,而被叫做干扰。
>
> 香农的理论是很简朴而典型的,A想要把某个信息a传递给B,但传播信息的信道存在种种异常,比如,A站在山顶喊话“我喜欢你”,结果因为风太大,B只听到“我喜欢”,虽然信息量丢失,但仍有一部分信息传达了,那就是“我(A)”和“喜欢(L)”。
>
> 第二次,A还对B说,“我喜欢你”,但因为风太大,B听成了,“我喜欢隔壁老王”。那么B所得到的信息是什么呢?“我(A)”和“喜欢(L)”这两个信息的置信度提高了,而“你(B)”的置信度降低了。
>
> 但是当A说,“我喜欢你”,B可能会因为风太大而听成“老李讨厌隔壁老王”么?可能性很低。
## Cross Entropy
知道Entropy在information theory的意義後,後面就很好介紹了。
先說結論,Cross Entropy可以這樣理解: **使用了估計出來的編碼後所得到的平均編碼長度**。
### Cross Entropy formula
先完整看一次Entropy的公式$$Cross Entropy = -\sum_ip_ilog_b(q_i)$$
- 注意儘管公式很像Shannon Entropy,但不同的地方在於log裡面用的是q(x)
### 理解公式
對於上述公式我們可以這麼理解:
對於某個需要被傳遞的資料,$p$是真正的機率分布,但這個機率分布我們事實上不知道,所以我們透過了神奇的Machine Learning / Deep Learning等黑技術去學習到了一個我們以為的機率分布$q$。
所以接下來我們使用$-\sum_ilog_b(q_i)$來進行編碼,但事實上資料真正的機率分布是$p$,所以我們得到的平均編碼長度就變成了$-\sum_ip_ilog_b(q_i)$。
也就是說,當$q$估計的越準(越接近p),平均編碼長度才會是最短的(接近Shannon Entropy)。
### 總結
- 實際上從ML/DL的角度來看,Cross Entropy Loss的概念就是,今天有一個資料真正的機率分布以及透過model學習出來的分布,我們希望這兩個機率分布越接近越好。
### 延伸討論: Cross Entropy遇到$log0$?
- 這在training中常常會遇到,implement上通常會採用$log(x+ \epsilon)$來handle這個狀況。
## KL-Divergence
接下來來介紹KL-Divergence,一樣先說結論: KL-Divergence實際上是**當估出來的編碼方式和理想上的編碼有差時,而導致平均編碼差度的誤差值**。
- 實際上,這很常發生,因為我們不知道理想上的編碼方式應該是如何(不知道機率分布),所以我們使用model估出來的編碼方式可能會產生誤差。
### KL-Divergence formula
公式如下: $$KL-Divergence = \sum_ip_ilog_b(\frac{p_i}{q_i})$$
### 理解公式
再看一遍Cross Entropy的公式和它的定義: 使用了估計出來的編碼後所得到的平均編碼長度$$Cross Entropy = -\sum_ip_ilog_b(q_i)$$
那這個估計出來的編碼長度到底理想上的編碼長度差了多少?我們可以來算算看$$Cross Entropy-Shannon Entropy \\=-\sum_ip_ilog_b(q_i) -(-\sum_ip_ilog_b(p_i)) \\=\sum_ip_ilog_b(p_i)-\sum_ip_ilog_b(q_i) \\=\sum_ip_ilog_b(\frac{p_i}{q_i})$$
驚!這不就是KL-Divergency的公式嗎,再仔細看...
又驚!這不就是KL-Divergency的定義嗎
### 結論
- 實際上KL-Divergence算的就是兩個機率分布的距離。
### 延伸討論: 為何DL常使用Cross Entropy而不是KL?
簡單來說,在ML的task裡面,KL和CE是等價的,只是算KL的話還必須多算一個Entropy,所以大家都只算CE。
詳細的解釋可以看下面這篇,取自[Why has cross entropy become the classification standard loss function and not Kullbeck Leibler divergence?](https://ai.stackexchange.com/questions/3065/why-has-cross-entropy-become-the-classification-standard-loss-function-and-not-k)
> When it comes to classification problem in machine learning, the cross entropy and KL divergence are equal. As already stated in the question, the general formula is this:$$H(p,q)=H(p)+DKL(p||q)$$
> Where p a “true” distribution and q is an estimated distribution, H(p,q) is the cross-entropy, H(p) is the entropy and D is the Kullback-Leibler divergence.
> Note that in machine learning, p is a one-hot representation of the ground-truth class, i.e.,$$p=[0,...,1,...,0]$$
> which is basically a delta-function distribution. But the entropy of the delta function is zero, hence KL divergence simply equals the cross-entropy.
> In fact, even if H(p) wasn't 0 (e.g., soft labels), it is fixed and has no contribution to the gradient. In terms of optimization, it's safe to simply remove it and optimize the Kullback-Leibler divergence.
### 延伸討論: 為何DL常使用CE而不是LSE?
在gradient更新上速度的不同,有機會下次再說。
## 總結
從計算機編碼的角度來介紹Shannon Entropy的意義,並延伸介紹了Cross Entropy以及KL-Divergence,最後在總結三者之間的關係$$Cross Entropy = Shannon Entropy + KL-Divergence$$
我們常常在做的Min Cross Entropy實際上就是是在Min KL-Divergence,當KL-Divergence = 0時,這代表這兩個機率分布是沒有差異的。
## Reference
- [ASCII](https://zh.wikipedia.org/wiki/ASCII)
- [Shannon entropy(weki)](https://en.wiktionary.org/wiki/Shannon_entropy)
- [霍夫曼編碼](https://zh.wikipedia.org/wiki/%E9%9C%8D%E5%A4%AB%E6%9B%BC%E7%BC%96%E7%A0%81)
- [熵(wiki)](https://zh.wikipedia.org/wiki/%E7%86%B5_(%E4%BF%A1%E6%81%AF%E8%AE%BA))
- [self-information](https://zh.wikipedia.org/wiki/%E8%87%AA%E4%BF%A1%E6%81%AF)
- [熵和编码长度](https://www.cnblogs.com/frombeijingwithlove/p/5931750.html)
- [为什么信息量不能为负值?](https://www.zhihu.com/question/263824964)
- [交叉熵(Cross Entropy)](https://www.cnblogs.com/ljy2013/p/6432269.html)
- [如何通俗的解释交叉熵与相对熵?](https://www.zhihu.com/question/41252833)
- [Why has cross entropy become the classification standard loss function and not Kullbeck Leibler divergence?](https://ai.stackexchange.com/questions/3065/why-has-cross-entropy-become-the-classification-standard-loss-function-and-not-k)
- [分类问题中损失函数为什么交叉熵用的多,而不是KL?](https://www.zhihu.com/question/336677048/answer/760789081)