交叉熵损失函数从原理到代码

交叉熵损失函数从原理到代码

    • 交叉熵
    • Pytorch_API & 公式
    • 小结

损失函数 使用场景
二分类交叉熵损失函数 二分类
交叉熵损失函数 多分类
KL散度 回归

信息熵-百度百科通常,一个信源发送出什么符号是不确定的,衡量它可以根据其出现的概率来度量。

不确定性函数 f f f 的定义应满足:

  • f f f 应是概率 P P P 的减函数 (概率大,出现机会多,不确定性小;反之不确定性就大)
  • f ( P 1 , P 2 ) = f ( P 1 ) + f ( P 2 ) f(P_1,P_2)=f(P_1)+f(P_2) f(P1,P2)=f(P1)+f(P2)(可加性:两个独立符号所产生的不确定性应等于各自不确定性之和)

满足上述两个条件的 f f f 是对数函数: f ( P ) = log ⁡ 1 P = − log ⁡ P f(P) = \log \frac{1}{P} = - \log P f(P)=logP1=logP并且必是对数函数,证明可参考 为什么香农要将信息熵公式要定义成 -Σp·log₂§ 或 -∫p·log₂§dp

在信源中,考虑的不是某一单个符号发生的不确定性,而是要考虑这个信源所有可能发生情况的平均不确定性。

若信源符号有n种取值: U 1 , … , U i , … , U n U_1,…,U_i,…,U_n U1,,Ui,,Un,对应概率为: P 1 , … , P i , … , P n P_1,…,P_i,…,P_n P1,,Pi,,Pn,且各种符号的出现彼此独立。这时,信源的平均不确定性应当为单个符号不确定性 − log ⁡ P i -\log P_i logPi 的统计平均值(E),可称为信息熵,即: H ( U ) = E ( − log ⁡ p i ) = − ∑ i = 1 n p i log ⁡ p i H(U) = E(- \log p_i) = - \sum_{i=1}^n p_i \log p_i H(U)=E(logpi)=i=1npilogpi式中对数底一般取2,也可取其他值。


交叉熵

  • 熵的定义:
    在这里插入图片描述
  • 交叉熵(Cross-Entropy):
    在这里插入图片描述

交叉熵: 度量两个概率分布间的差异性信息


Pytorch_API & 公式

  • 二分类交叉熵:
torch.nn.BCELoss(weight=None, size_average=None, reduce=None, reduction='mean')

ℓ ( x , y ) = { mean ⁡ ( L ) ,  if reduction  =  ’mean’  sum ⁡ ( L ) ,  if reduction  =  ’sum’  \ell(x, y)=\left\{\begin{array}{ll} \operatorname{mean}(L), & \text { if reduction }=\text { 'mean' } \\ \operatorname{sum}(L), & \text { if reduction }=\text { 'sum' } \end{array}\right. (x,y)={mean(L),sum(L), if reduction = ’mean’  if reduction = ’sum’ 

  • 交叉熵:
torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean')

loss ⁡ ( x ,  class  ) = − log ⁡ ( exp ⁡ ( x [  class  ] ) ∑ j exp ⁡ ( x [ j ] ) ) = − x [  class  ] + log ⁡ ( ∑ j exp ⁡ ( x [ j ] ) ) \operatorname{loss}(x, \text { class })=-\log \left(\frac{\exp (x[\text { class }])}{\sum_{j} \exp (x[j])}\right)=-x[\text { class }]+\log \left(\sum_{j} \exp (x[j])\right) loss(x, class )=log(jexp(x[j])exp(x[ class ]))=x[ class ]+log(jexp(x[j]))

  • KL散度(相对熵):
torch.nn.KLDivLoss(size_average=None, reduce=None, reduction='mean', log_target=False)

D K L ( P , Q ) = E X ∼ P [ log ⁡ P ( X ) Q ( X ) ] = E X ∼ P [ log ⁡ P ( X ) − log ⁡ Q ( X ) ] = ∑ i = 1 n P ( x i ) ( log ⁡ P ( x i ) − log ⁡ Q ( x i ) ) \begin{aligned} D_{\mathrm{KL}}(P, Q)=\mathrm{E}_{X \sim P}\left[\log \frac{P(X)}{Q(X)}\right] &=\mathrm{E}_{X \sim P}[\log P(X)-\log Q(X)] \\ &=\sum_{i=1}^{n} P\left(x_{i}\right)\left(\log P\left(x_{i}\right)-\log Q\left(x_{i}\right)\right) \end{aligned} DKL(P,Q)=EXP[logQ(X)P(X)]=EXP[logP(X)logQ(X)]=i=1nP(xi)(logP(xi)logQ(xi))

具体参数介绍以及使用示例参见深入浅出Pyotch_3.6损失函数

小结

交叉熵可在神经网络(机器学习)中作为损失函数,p表示真实标记的分布,q则为训练后的模型的预测标记分布,交叉熵损失函数可以衡量pq的相似性。交叉熵作为损失函数还有一个好处是使用sigmoid函数在梯度下降时能避免均方误差损失函数学习速率降低的问题,因为学习速率可以被输出的误差所控制。


参考:
知乎-能否简单说明 PyTorch 所支持的损失函数定义与使用场景(选4个)?
百度百科-交叉熵
知乎-为什么香农要将信息熵公式要定义成 -Σp·log₂§ 或 -∫p·log₂§dp?
百度文库-信息熵、交叉熵公式理解
损失函数详解
深入浅出Pyotch_3.6损失函数

你可能感兴趣的:(深入浅出Pytorch,算法,深度学习)