从认识AI开始-----“交叉熵损失函数”的前世今生

前言

深度学习中的交叉熵到底是啥?它和信息论有什么关系?熵、相对熵、交叉熵之间到底有什么区别?接下来我将带领各位小伙伴们一次性讲明白这些易混概念!


一、为什么要了解这些信息论概念?

如果各位小伙伴们正在学习深度学习模型,那么你一定见过这样的代码:

import torch.nn as nn

loss = nn.CrossEntropyLoss()

很多教程会告诉你:这是分类问题中常用的损失函数

但它究竟是怎么工作的?为什么用它?其实这背后隐藏的就是信息论的基本原理!


二、什么是信息量?

在这里我先给出信息量的定义:

信息量表示一个事件发生带来的“惊讶程度”或“新信息”。通俗的来讲就是“事件发生的难度有多大

信息量公式为:

I(x)=-log_2(p(x))

  • 罕见事件(小概率事件):它发生的难度较大,所以有较大的信息量
  • 常见事件(大概率事件):它发生的难度比较小,所以有较小的信息量

性质:对于独立事件A,B:p(AB)=p(A)*p(B),两个事件同时发生的信息量等于两个事件的信息量相加:

I(AB)=-log(p(AB))=-(log(p(A))+log(p(B)))=I(A)+I(B)

举个例子来理解一下:

  • “明天下雨”,概率是0.1 ——> 信息量:-log_2(0.1)\approx 3.32 bits
  • “明天不下雨”,概率是0.9 ——> 信息量:-log_2(0.9)\approx 0.15 bits

核心思想:概率越小,信息量越大


二、什么是熵?

同样的,在这里先给出熵的定义:

熵是对整个系统信息量的衡量,代表了整个系统的不确定性。系统整体由所有可能发生的事件构成,比如抛硬币,正面和反面就构成一个系统整体。

公式为:

H(p)=-\sum p_i*I_i^p=-\sum p_i*log(p_i)

  • 当所有事件等可能(比如抛硬币),熵最大
  • 若某事件几乎一定发生(概率接近1),熵接近0

举个例子:

  • 事件A发生的概率:p(A)=0.2,则A的信息量:I(A)=-log_2(p(A))=2.32
  • 事件B发生的概率:p(B)=0.8,则B的信息量:I(B)=-log_2(p(B))=0.32
  • 则熵为:H(p)=0.2*2.32+0.8*0.32=0.72

总结一下,其实熵的作用就是用来评估概率模型的不确定程度,不确定性越大,熵越大,否则,熵越小。


三、交叉熵

同样的,先给出定义:

交叉熵定义了用一个预测分布 q(x) 来近似真是分布 p(x)  所需的信息量

公式为:

H(p,q)=-\sum p_i*I_i^q=-\sum p_i*log_2(q_i)

举个抛硬币的例子说明一下:

假设正面真实概率 p(A)=0.5,反面真实概率 p(B)=0.5,正面估计概率 q(A)=0.2 ,反面估计概率q(B)=0.8:

  • 则 H(p,q)=-\sum p_i*log_2(q_i) =p(A)*log_2(\frac {1}{q(A})+p(B)*log_2(\frac {1}{q(B)})
  • =-0.5*log_2(0.2)-0.5*log_2(0.8)=1.32

如果我们用预测分布q,来描述真实分布p,交叉熵越小越好,说明预测越准确。


四、相对熵(KL)散度

同样,先给出定义:

相对熵又叫做KL散度,是衡量两个概率分布“差距”的指标。

公式为:

D_{KL}(p||q)=\sum p_i*log_2( \frac {p_i}{q_i})=H(p,q)-H(p)

  • KL散度越小,预测越准确
  • KL散度总是非负,切当 p=q 时,为0
  • 它是非对称的(注意顺序)

五、从信息论到交叉熵损失函数

由第四部分可知,KL散度表示以真实概率 p 为基准, 来衡量预测分布 q 与真实分布 p 之间的差距。而在神经网络中,我们的目标是让预测分布尽量接近真实标签,所以最直接的办法就是可以直接将损失函数定义为KL散度:Loss=D_{KL}(p||q)

按照这个思想,我们可以直接定义损失函数:

Loss=D_{KL}(p||q)=H(p,q)-H(p)=\sum p_i*log_2(\frac {1}{q_i})-\sum p_i*log_2(\frac {1}{p_i})

分类问题中:真实概率分布是一个单位分布,真实类别为1,其他类别为0。如下所示:

类别class1class2class3class4
概率0010

p_{class1}=p_{class2}=p_{class4}=0p_{class3}=1,所以 H(p)=-\sum p_i*log_2(p_i)=0 是恒成立的。 

因此,损失函数可以进一步简化为:

Loss=D_{KL}(p||q)=H(p,q)-H(p)=H(p,q)

因为我上面已经解释了 H(p,q) 为交叉熵,因此,上述损失函数就被称为了交叉熵损失函数,即:

CrossEntoryLoss=H(p,q)=-\sum p_i*log_2(q_i)


六、简单实现交叉熵损失

接下来,我将简单实现一下交叉熵损失

import torch
import torch.nn.functional as F

# 模型输出
log = torch.tensor([[2.0, 1.0, 0.1]])
# 真实标签的类别索引
label = torch.tensor([0])

prob = F.softmax(log, dim=1)
loss = -torch.log(prob[0][label])

print(loss)

其实,pytorch内置了交叉熵损失函数,在实际的模型训练中,我们只需调用内置的损失函数进行训练即可,不用我们手写:

import torch
import torch.nn as nn

# 模型输出
log = torch.tensor([[2.0, 1.0, 0.1]])
# 真实标签的类别索引
label = torch.tensor([0])

loss = nn.CrossEntropyLoss()
loss = loss(log, label)
print(loss)

总结

以上就是本文的所有内容,读到这里,相信小伙伴们已经理解了从信息量到交叉熵损失的全部原理:交叉熵不仅是神经网络中的损失函数,更是信息论的基本工具,掌握这些概念能够更好地使各位小伙伴们理解其中的原理,也能更好地调试与优化模型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值