# 什么是熵,交叉熵, KL Divergence, JS Divergence, f Divergence?

#

熵是信息的度量:

H(p)=ip(xi)logbp(xi)H(p) = -\sum_i p(x_i) log_b p(x_i)

# 交叉熵

交叉熵:

H(p,q)=ip(xi)logbq(xi)H(p,q) = -\sum_i p(x_i) log_b q(x_i)

其中pp是真实的概率分布,qq是预测的概率分布。 通常情况H(p,q)>H(p)H(p,q) > H(p)

# KL Divergence

KL Divergence就是:

DKL(PQ)=H(p,q)H(p)=ip(xi)logbq(xi)p(xi)D_{KL}(P||Q) = H(p,q) - H(p) = -\sum_i p(x_i) log_b \frac{q(x_i)}{p(x_i)}

参考: Hands-On Machine Learning with Scikit-Learn & Tensorflow的作者讲解熵,交叉熵,KL散度

# JS Divergence

JS Divergence是KL Divergence的一种变形:

DJS(pq)=12DKL(pp+q2)+12DKL(qp+q2)D_{JS}(p \| q)=\frac{1}{2} D_{KL}\left(p \| \frac{p+q}{2}\right)+\frac{1}{2} D_{KL}\left(q \| \frac{p+q}{2}\right)

  • 值域范围 JS散度的值域范围是[0,1],相同为0,相反则为1。相比较于KL,对相似度的判别更准确了。
  • 对称性 即 DJS(pq)=DJS(qp)D_{JS}(p \| q)=D_{JS}(q \| p), 而对称能让散度度量更准确。

参考: KL散度与JS散度

# f Divergence

ff Divergence 长下面这个样子:(这是f Divergence的定义)

Df(PQ)=xq(x)f(p(x)q(x))dxD_{f}(P \| Q)=\int_{x} q(x) f\left(\frac{p(x)}{q(x)}\right) d x

这里面要满足两个条件:

条件

  1. ff是凸函数,
  2. f(1)=0f(1)=0

ff取不同的函数,可以得到不同的Divergence:

例如, f(x)=xlogxf(x) = xlogx, 得到:

Df(PQ)=xq(x)p(x)q(x)log(p(x)q(x))dx=xp(x)log(p(x)q(x))dxD_f(P||Q) = \int_{x} q(x) \frac{p(x)}{q(x)} \log \left(\frac{p(x)}{q(x)}\right) d x=\int_{x} p(x) \log \left(\frac{p(x)}{q(x)}\right) d x

这其实就是KL Divergence;

又如, f(x)=logxf(x) = -logx, 得到:

Df(PQ)=xq(x)(log(p(x)q(x)))dx=xq(x)log(q(x)p(x))dxD_{f}(P \| Q)=\int_{x} q(x)\left(-\log \left(\frac{p(x)}{q(x)}\right)\right) d x=\int_{x} q(x) \log \left(\frac{q(x)}{p(x)}\right) d x

这其实就是Reverse KL Divergence;

再如, f(x)=(x1)2f(x) = (x-1)^2, 得到:

Df(PQ)=xq(x)(p(x)q(x)1)2dx=x(p(x)q(x))2q(x)dxD_{f}(P \| Q)=\int_{x}q(x)\left(\frac{p(x)}{q(x)}-1\right)^{2} d x=\int_{x} \frac{(p(x)-q(x))^{2}}{q(x)} d x

这其实就是Chi Square Divergence.

也就是是说,f Divergence是各种Divergence的总称。

下面截取一张维基百科上不同Divergence对应的f函数的表:

要使用什么Divergence,就在这个表里面选择对应的f函数就可以了。就是这么回事。So easy。

参考:李宏毅老师的课程 GAN Lecture 5 (2018): General Framework

参考:维基百科F-divergence