為什麼 Kullback-Leilbler 散度比平方誤差更能衡量兩個概率分佈之間的距離?[複製]
我知道當我們想要測量概率形式的數字之間的距離時,KL-divergence 是一個更合適的度量。但是,我仍然很困惑使用 KL 散度而不是概率數之間的平方誤差有什麼好處。
如果有人能用簡單的語言解釋這一點,我將不勝感激。
概述:
- KL-Divergence 源自香農熵。
- 香農熵是信號 X 中包含的信息量 P(X) .
- 交叉熵是當我們用估計分佈對信號 X 進行編碼時包含在信號 X 中的信息 Q(X) 而不是它的真實分佈 P(X) .
- KL-Divergence 是“真實”香農熵和“編碼”交叉熵之間的信息差異。
- KL-Divergence 是不對稱的,因為如果我們通過編碼獲得信息 P(X) 使用 Q(X) ,那麼在相反的情況下,如果我們編碼,我們會丟失信息 Q(X) 使用 P(X) . 如果將高分辨率 BMP 圖像編碼為較低分辨率的 JPEG,則會丟失信息。如果將低分辨率 JPEG 轉換為高分辨率 BMP,您將獲得信息。當您對概率分佈進行編碼時,這同樣適用 P(X) 使用 Q(X) ,或者做相反的事情。所以屬性: DKL(P∥Q)≠DKL(Q∥P)
實際上是可取的,因為它表達了當我們使用 KL-Divergence 作為相似性度量時信息以一種方式丟失並以另一種方式獲得的事實。- 另一方面,平方誤差是對稱的: SSE(P,Q)=SSE(Q,P)
因此,如果我們使用 SSE 作為相似度的度量。
細節:
要了解 KL-divergence,首先需要了解香農熵的概念:
I(X)=−n∑i=1P(xi)logP(xi)
香農熵 I(X) 衡量一個信號中包含多少信息 X∈x1,x2,…,xn 其特點是分佈 P(xi) .
換句話說,知道概率分佈 X 是 P(xi) 我學習或獲得了多少信息,在進行實驗後,我發現結果是 X=xi .
要看到這一點,請考慮以下情況 P(xi)=1 對於一些 xi , 和 0 對於所有其他人。所以事件 X=xi 總是預期的(這是一個特定的事件),我們從執行實驗中什麼也沒學到,因此在這種情況下 X 信息為零。如果你做數學,你會看到在這種情況下, I(X)=0 .
另一方面,如果 P(xi)=1n 對於所有 i,即我們有一個均勻分佈和任何值 X=xi 同樣可能,我們有最大可能值 I(X) ,給定集合 X .
現在讓我們定義交叉熵,即有多少信息在 X ,如果我建模 X 具有模擬分佈 Q(xi) 而不是真實分佈 P(xi) :
H(P,Q)=−n∑i=1P(xi)logQ(xi)
為了簡化,我們將寫 I(P) 代替 I(X) , 因為集合 X 沒有改變。現在你可以看一下KL-divergence,這是我們使用真實分佈的情況下的信息差異 P(xi) 來表示我們的信號和模擬分佈 Q(xi) :
DKL(P∥Q)=H(P,Q)−I(P)
現在讓我們填寫條款:
DKL(P∥Q)=−n∑i=1P(xi)logQ(xi)+n∑i=1P(xi)logP(xi)
然後簡化:
DKL(P∥Q)=−n∑i=1P(xi)(logQ(xi)−logP(xi))
這反過來導致:
DKL(P∥Q)=−n∑i=1P(xi)log(Q(xi)P(xi))
這與使用平方誤差有何不同?考慮我們估計時的平方誤差 P(xi) 使用 Q(xi) :
SSE(P,Q)=n∑i=1(P(xi)−Q(xi))2
這個量是對稱的:
SSE(P,Q)=SSE(Q,P)
KL-Divergence 不對稱:
DKL(P∥Q)≠DKL(Q∥P)
R中的數值示例:
library(LaplacesDemon) #Use this library for the KLD function n=10 p=1/2 x=0:10 P=dbinom(x,size=n,prob=p) plot(x,P,type="h",xlim=c(-1,11),ylim=c(0,0.5),lwd=2,col="blue",ylab="P(X)") points(x,P,pch=16,cex=2,col="dark red")
Q = dunif(x, min=0, max=10, log = FALSE) plot(x,Q,type="h",xlim=c(-1,11),ylim=c(0,0.5),lwd=2,col="blue",ylab="Q(X)") points(x,Q,pch=16,cex=2,col="dark red")
> P [1] 0.0009765625 0.0097656250 0.0439453125 0.1171875000 0.2050781250 [6] 0.2460937500 0.2050781250 0.1171875000 0.0439453125 0.0097656250 [11] 0.0009765625 > Q [1] 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 > KLD(P,Q) ... $sum.KLD.px.py #This is KL-D(P||Q) [1] 0.5219417 $sum.KLD.py.px [1] 1.077474 #This is KL-D(Q||P)