信息量和熵、KL散度、交叉熵损失函数

1.引言

在使用pytorch深度学习框架做多分类时,计算损失函数通常会使用交叉熵损失函数nn.CrossEntropyLoss()

2. 信息量和熵

信息量:
它是用来衡量一个事件的不确定性的;一个事件发生的概率越大,不确定性越小,则它所携带的信息量就越小。假设 X X X是一个离散型的随机变量,其取值集合为 X X X = x 0 , x 1 , , , x n x_0,x_1,,,x_n x0x1xn,其概率分布函数为 p ( x ) = P r ( X = x ) , x ∈ X p(x) = Pr(X = x),x\in X p(x)=Pr(X=x),xX,则定义事件 X = x 0 X = x_0 X=x0的信息量为:
I ( x i ) = − l o g ( p ( x i ) ) I(x_i) = -log(p(x_i)) I(xi)=log(p(xi))
p ( x 0 ) = 1 p(x_0) = 1 p(x0)=1 时,该事必定发生,其信息量为0。

熵:
熵用来衡量一个系统的混乱程度,代表系统中信息量的总和;熵值越大,表明这个系统的不确定性就越大。
信息量是衡量某个事件的不确定性,而熵是衡量一个系统(所有事件)的不确定性。
熵的计算公式:
H ( x ) = − ∑ i = 1 n p ( x i ) l o g ( p ( x i ) ) H(x) = -\sum_{i=1}^np(x_i)log(p(x_i)) H(x)=i=1np(xi)log(p(xi))
对连续性随机变量
H ( x ) = − ∫ a b p ( x ) l o g ( p ( x ) ) d x H(x)=-\int_{a}^{b}p(x)log(p(x))dx H(x)=abp(x)log(p(x))dx
其中, p ( x i ) 为 事 件 X = x i 的 概 率 , − l o g ( p ( x i ) ) 为 事 件 X = x i 的 信 息 量 。 p(x_i)为事件X = x_i的概率,-log(p(x_i))为事件X = x_i 的信息量。 p(xi)X=xilog(p(xi))X=xi
可以看出,熵是信息量的期望值,是一个随机变量(一个系统,事件所有可能性)不确定性的度量。熵值越大,随机变量的取值就越难确定,系统也就越不稳定;熵值越小,随机变量的取值也就越容易确定,系统越稳定。

3.KL散度

KL散度的数学定义:
对于离散事件我们可以定义事件A和B的差别为:
D K L ( A ∣ ∣ B ) = ∑ i n P A ( x i ) l o g ( P A ( x i ) P B ( x i ) ) = ∑ i n ( P A ( x i ) l o g ( P A ( x i ) ) − P A ( x i ) l o g ( P B ( x i ) ) ) D_{KL}(A||B) = \sum_{i}^nP_{A}(x_i) log\bigg(\frac{P_{A}(x_i)}{P_{B}(x_i)} \bigg) = \sum_{i}^n(P_{A}(x_i)log(P_{A}(x_i ))- P_{A}(x_i)log(P_{B}(x_i))) DKL(AB)=inPA(xi)log(PB(xi)PA(xi))=in(PA(xi)log(PA(xi))PA(xi)log(PB(xi)))
对于连续事件,那么我们只是把求和改为求积分而已(2.2)。
D K L ( A ∣ ∣ B ) = ∫ a ( x ) l o g ( a ( x ) b ( x ) ) D_{KL}(A||B) = \int a(x) log\bigg(\frac{a(x)}{b(x)} \bigg) DKL(AB)=a(x)log(b(x)a(x))
从公式中可以看出:
如果 P A = P B P_A=P_B PA=PB ,即两个事件分布完全相同,那么KL散度等于0。
观察上可看出,KL散度来计算两个分布A与B的时候是不是对称的,有“坐标系”的问题
D K L ( A ∣ ∣ B ) ≠ D K L ( B ∣ ∣ A ) D_{KL}(A||B)\ne D_{KL}(B||A) DKL(AB)=DKL(BA)

3.交叉熵 Cross Entropy
数学解释:

A和B的交叉熵 = A与B的KL散度 - A的熵
D K L ( A ∣ ∣ B ) = − S ( A ) + H ( A , B ) D_KL(A∣∣B)=−S(A)+H(A,B) DKL(AB)=S(A)+H(A,B)
对比一下这是KL散度的公式:
D K L ( A ∣ ∣ B ) = ∑ i P A ( x i ) l o g ( P A ( x i ) P B ( x i ) ) = ∑ i P A ( x i ) l o g ( P A ( x i ) ) − P A ( x i ) l o g ( P B ( x i ) ) D_{KL}(A||B) = \sum_{i}P_{A}(x_i) log\bigg(\frac{P_{A}(x_i)}{P_{B}(x_i)} \bigg) = \sum_{i}P_{A}(x_i)log(P_{A}(x_i ))- P_{A}(x_i)log(P_{B}(x_i)) DKL(AB)=iPA(xi)log(PB(xi)PA(xi))=iPA(xi)log(PA(xi))PA(xi)log(PB(xi))
这是熵的公式:
S ( A ) = − ∑ i P A ( x i ) l o g P A ( x i ) S(A) = -\sum_{i}P_A(x_{i})logP_A(x_{i}) S(A)=iPA(xi)logPA(xi)
这是交叉熵公式:
H ( A , B ) = − ∑ i P A ( x i ) l o g ( P B ( x i ) ) H(A,B)= -\sum_{i}P_{A}(x_i)log(P_{B}(x_i)) H(A,B)=iPA(xi)log(PB(xi))
此处最重要的观察是,如果 S ( A ) S(A) S(A)是一个常量,那么 D K L ( A ∣ ∣ B ) = H ( A , B ) D_{KL}(A||B) = H(A,B) DKL(AB)=H(A,B),也就是说KL散度和交叉熵在特定条件下等价
同时补充交叉熵的一些性质:
和KL散度相同,交叉熵也不具备对称性: H ( A , B ) ≠ H ( B , A ) H(A,B) \ne H(B,A) H(A,B)=H(B,A)
Cross(交叉)主要是用于描述这是两个事件之间的相互关系,对自己求交叉熵等于熵。即 H ( A , A ) = S ( A ) H(A,A) = S(A) H(A,A)=S(A),注意只是非负而不一定等于0。

机器学习中的方法:

交叉熵主要是用来判定实际的输出与期望的输出的接近程度,也就是交叉熵的值越小,两个概率分布就越接近。假设概率分布p为期望输出,概率分布q为实际输出, H ( p , q ) H(p,q) H(p,q)为交叉熵,则表达式:
(1)二分类
H ( p , q ) = 1 N ∑ i = 1 N H ( p ( x i ) , q ( x i ) ) = 1 N ∑ i = 1 N − ( p ( x i ) l o g ( q ( x i ) ) ) + ( 1 − p ( x i ) ) l o g ( 1 − q ( x i ) ) H(p,q) = \frac{1}{N}\sum_{i=1}^N H(p(x_i),q(x_i)) = \frac{1}{N}\sum_{i=1}^N -(p(x_i)log(q(x_i)))+(1-p(x_i))log(1-q(x_i)) H(p,q)=N1i=1NH(p(xi),q(xi))=N1i=1N(p(xi)log(q(xi)))+(1p(xi))log(1q(xi))
其中:
N表示一个batch的样本数
p ( x i ) p(x_i) p(xi) 表示样本i的label,正类为1,负类为0
q ( x i ) q(x_i) q(xi) 表示样本i预测为正的概率
(2)多分类
H ( p , q ) = 1 N ∑ i = 1 N H ( p ( x i ) , q ( x i ) ) = − 1 N ∑ i = 1 N ∑ j = 1 M p ( x i j ) l o g ( q ( x i j ) ) H(p,q) = \frac{1}{N}\sum_{i=1}^N H(p(x_i),q(x_i)) = - \frac{1}{N}\sum_{i=1}^N \sum_{j=1}^M p(x_{ij})log(q(x_{ij})) H(p,q)=N1i=1NH(p(xi),q(xi))=N1i=1Nj=1Mp(xij)log(q(xij))
其中:
M表示类别数
p ( x i j ) p(x_{ij}) p(xij) 表示变量(0或1),如果该类别和样本i的类别相同就是1,否则是0;
q ( x i j ) q(x_{ij}) q(xij) 表示对于观测样本i属于类别 j j j的预测概率。

5.交叉熵可以用作代价的原因

最小化模型分布 P ( m o d e l ) P(model) P(model)与 训练数据上的分布 P ( t r a i n i n g ) P(training) P(training)的差异 等价于 最小化这两个分布间的KL散度,也就是最小化 K L ( P ( t r a i n i n g ) ∣ ∣ P ( m o d e l ) ) KL(P(training)||P(model)) KL(P(training)P(model)).
比照第四部分的公式:
此处的A就是数据的真实分布: P ( t r a i n i n g ) P(training) P(training)
此处的B就是模型从训练数据上学到的分布: P ( m o d e l ) P(model) P(model)
训练数据的分布A是给定的。那么根据我们在第四部分说的,因为A固定不变,那么求 D K L ( A ∣ ∣ B ) D_{KL}(A||B) DKL(AB) 等价于求 H ( A , B ) H(A,B) H(A,B),也就是A与B的交叉熵。
得证,交叉熵可以用于计算“学习模型的分布”与“训练数据分布”之间的不同。当交叉熵最低时(等于训练数据分布的熵),我们学到了“最好的模型”。
但是,完美的学到了训练数据分布往往意味着过拟合,因为训练数据不等于真实数据,我们只是假设它们是相似的,而一般还要假设存在一个高斯分布的误差,是模型的泛化误差下线。

5.pytorch中的交叉熵
(待整理)
信息量和熵、KL散度、交叉熵损失函数_第1张图片

文章参考:
1.https://www.zhihu.com/question/65288314
2.https://segmentfault.com/a/1190000023336609?utm_source=tag-newest
3.https://blog.csdn.net/geter_CS/article/details/84857220?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-1.control
感谢大佬!

你可能感兴趣的:(机器学习)