通俗理解交叉熵和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、 B、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))]
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))+(1−P(x))log(1−P(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(P∥Q)=∑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
,则将每个小批量的损失相加。忽略时reduce
是False
。默认: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),N∗mean(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(P∥Q)=i=1∑nP(xi)log(Q(xi)P(xi))=i=1∑nP(xi)log(P(xi))−i=1∑nP(xi)log(Q(xi))以上是关于通俗理解交叉熵和KL散度(包括标签平滑的pytorch实现)的主要内容,如果未能解决你的问题,请参考以下文章
通俗理解交叉熵和KL散度(包括标签平滑的pytorch实现)