通俗理解交叉熵和KL散度(包括标签平滑的pytorch实现)

Posted 栋次大次

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通俗理解交叉熵和KL散度(包括标签平滑的pytorch实现)相关的知识,希望对你有一定的参考价值。

文章目录

语音识别系统中多数使用标签平滑的KL散度来计算loss,近期做了总结,系统学习了熵,交叉熵,KL散度的联系,以及标签平滑的原理并给出KL散度标签平滑的pytorch实现。

信息量

先上定义(不是很懂)

一个事件发生的概率越小,则其信息量越大。事件 X = x i X=x_i X=xi的信息量表示为:

I ( x i ) = − log ⁡ ( P ( x i ) ) I\\left(x_i\\right)=-\\log \\left(P\\left(x_i\\right)\\right) I(xi)=log(P(xi))

其中, P ( x i ) P\\left(x_i\\right) P(xi)为事件 X = x i X=x_i X=xi的发生概率,log通常表示为以e或2或10为底的对数。

熵是对一个事件中所有可能发生情况的度量,即表示一个事件所有信息量的期望,表示为:

H ( x ) = − ∑ i = 1 n P ( x i ) log ⁡ ( P ( x i ) ) H(x)=-\\sum_i=1^n P\\left(x_i\\right) \\log \\left(P\\left(x_i\\right)\\right) H(x)=i=1nP(xi)log(P(xi))

其中 n \\mathrmn n 表示事件 xi发生的n n \\mathrmn n 种可能,如一个事件X有三种发生情况,分别用 A 、   B 、 C \\mathrmA 、 \\mathrm~B 、 \\mathrmC A BC 表示,则该事件 的熵可表示为:
H ( X ) = − [ P ( A ) log ⁡ ( P ( A ) ) + P ( B ) log ⁡ ( P ( B ) ) + P ( C ) log ⁡ ( P ( C ) ) ] H(X)=-[P(A) \\log (P(A))+P(B) \\log (P(B))+P(C) \\log (P(C))] H(X)=[P(A)log(P(A))+P(B)log(P(B))+P(C)log(P(C))]
若在0-1分布问题中 (如抛硬币),其熵表达式可简化为:
H ( X ) = − [ P ( x ) log ⁡ ( P ( x ) ) + ( 1 − P ( x ) ) log ⁡ ( 1 − P ( x ) ) ] H(X)=-[P(x) \\log (P(x))+(1-P(x)) \\log (1-P(x))] H(X)=[P(x)log(P(x))+(1P(x))log(1P(x))]

KL散度(相对熵)

机器学习中,往往存在两种分布,一个是数据样本的真实分布,分布由原始数据决定;另一个是模型预测的分布,KL散度来衡量以上两个分布的差异程度,表示为:

D K L ( P ∥ Q ) = ∑ i = 1 n P ( x i ) log ⁡ ( P ( x i ) Q ( x i ) ) D_K L(P \\| Q)=\\sum_i=1^n P\\left(x_i\\right) \\log \\left(\\fracP\\left(x_i\\right)Q\\left(x_i\\right)\\right) DKL(PQ)=i=1nP(xi)log(Q(xi)P(xi))

其中 P \\mathrmP P 为数据样本概率分布, Q \\mathrmQ Q 为模型预测的概率分布。当 P \\mathrmP P Q \\mathrmQ Q 的分布越接近, D K L D_K L DKL 的值越 小,表明模型对原始数据分布特点预测的越准。

torch.nn.KLDivLoss

torch.nn.KLDivLoss(size_average=None, reduce=None, reduction='mean', log_target=False)

注意:和NLLLoss一样,输入应该是log_softmax

参数:

  • size_average ( bool , optional ) – 已弃用(请参阅reduction)。默认情况下,损失是批次中每个损失元素的平均值。请注意,对于某些损失,每个样本有多个元素。如果该字段size_average 设置为False,则将每个小批量的损失相加。忽略时reduceFalse。默认:True

  • reduce ( bool , optional ) – 已弃用(请参阅reduction)。默认情况下,损失是对每个小批量的观测值进行平均或求和,具体取决于size_average. 当reduce是时False,返回每个批次元素的损失并忽略size_average。默认:True

  • reduction ( string , optional ) – 指定要应用于输出的缩减: 'none'| 'batchmean'| 'sum'| 'mean'. 'none': 不会减少。 'batchmean':输出的总和将除以batchsize。 'sum':输出将被求和。 'mean':输出将除以输出中的元素数。默认:'mean'

    即:
    ℓ ( x , y ) = L ,  if reduction  =  ’none’   mean  ( L ) ,  if reduction  =  ’mean’  N ∗ mean ⁡ ( L ) ,  if reduction  =  ’batchmean’  sum ⁡ ( L ) ,  if reduction  =  ’sum’  \\ell(x, y)= \\begincases\\mathrmL, & \\text if reduction =\\text 'none' \\\\ \\text mean (L), & \\text if reduction =\\text 'mean' \\\\ N * \\operatornamemean(L), & \\text if reduction =\\text 'batchmean' \\\\ \\operatornamesum(L), & \\text if reduction =\\text 'sum' \\endcases (x,y)=L, mean (L),Nmean(L),sum(L), if reduction = ’none’  if reduction = ’mean’  if reduction = ’batchmean’  if reduction = ’sum’ 

  • log_target ( bool , optional ) – 指定是否在log空间中传递目标。默认:False

交叉熵

交叉熵是由KL散度公式推导而得:
D K L ( P ∥ Q ) = ∑ i = 1 n P ( x i ) log ⁡ ( P ( x i ) Q ( x i ) ) = ∑ i = 1 n P ( x i ) log ⁡ ( P ( x i ) ) − ∑ i = 1 n P ( x i ) log ⁡ ( Q ( x i ) ) D_K L(P \\| Q)=\\sum_i=1^n P\\left(x_i\\right) \\log \\left(\\fracP\\left(x_i\\right)Q\\left(x_i\\right)\\right)=\\sum_i=1^n P\\left(x_i\\right) \\log \\left(P\\left(x_i\\right)\\right)-\\sum_i=1^n P\\left(x_i\\right) \\log \\left(Q\\left(x_i\\right)\\right) DKL(PQ)=i=1nP(xi)log(Q(xi)P(xi))=i=1nP(xi)log(P(xi))i=1nP(xi)log(Q(xi))以上是关于通俗理解交叉熵和KL散度(包括标签平滑的pytorch实现)的主要内容,如果未能解决你的问题,请参考以下文章

通俗理解交叉熵和KL散度(包括标签平滑的pytorch实现)

交叉熵与KL散度

信息熵,交叉熵,KL散度

理解「交叉熵」损失函数(包含自信息信息熵KL散度交叉熵概念整理)

学习笔记之信息量熵KL散度交叉熵的一些介绍

机器学习信息熵和热力学定律中的熵有关系吗?