前言
深度学习中的交叉熵到底是啥?它和信息论有什么关系?熵、相对熵、交叉熵之间到底有什么区别?接下来我将带领各位小伙伴们一次性讲明白这些易混概念!
一、为什么要了解这些信息论概念?
如果各位小伙伴们正在学习深度学习模型,那么你一定见过这样的代码:
import torch.nn as nn
loss = nn.CrossEntropyLoss()
很多教程会告诉你:这是分类问题中常用的损失函数
但它究竟是怎么工作的?为什么用它?其实这背后隐藏的就是信息论的基本原理!
二、什么是信息量?
在这里我先给出信息量的定义:
信息量表示一个事件发生带来的“惊讶程度”或“新信息”。通俗的来讲就是“事件发生的难度有多大”
信息量公式为:
- 罕见事件(小概率事件):它发生的难度较大,所以有较大的信息量
- 常见事件(大概率事件):它发生的难度比较小,所以有较小的信息量
性质:对于独立事件A,B:
,两个事件同时发生的信息量等于两个事件的信息量相加:
举个例子来理解一下:
- “明天下雨”,概率是0.1 ——> 信息量:
- “明天不下雨”,概率是0.9 ——> 信息量:
核心思想:概率越小,信息量越大
二、什么是熵?
同样的,在这里先给出熵的定义:
熵是对整个系统信息量的衡量,代表了整个系统的不确定性。系统整体由所有可能发生的事件构成,比如抛硬币,正面和反面就构成一个系统整体。
公式为:
- 当所有事件等可能(比如抛硬币),熵最大
- 若某事件几乎一定发生(概率接近1),熵接近0
举个例子:
- 事件A发生的概率:
,则A的信息量:
- 事件B发生的概率:
,则B的信息量:
- 则熵为:
总结一下,其实熵的作用就是用来评估概率模型的不确定程度,不确定性越大,熵越大,否则,熵越小。
三、交叉熵
同样的,先给出定义:
交叉熵定义了用一个预测分布
来近似真是分布
所需的信息量
公式为:
举个抛硬币的例子说明一下:
假设正面真实概率
,反面真实概率
,正面估计概率
,反面估计概率
:
- 则
如果我们用预测分布q,来描述真实分布p,交叉熵越小越好,说明预测越准确。
四、相对熵(KL)散度
同样,先给出定义:
相对熵又叫做KL散度,是衡量两个概率分布“差距”的指标。
公式为:
- KL散度越小,预测越准确
- KL散度总是非负,切当
时,为0
- 它是非对称的(注意顺序)
五、从信息论到交叉熵损失函数
由第四部分可知,KL散度表示以真实概率
为基准, 来衡量预测分布
与真实分布
之间的差距。而在神经网络中,我们的目标是让预测分布尽量接近真实标签,所以最直接的办法就是可以直接将损失函数定义为KL散度:
按照这个思想,我们可以直接定义损失函数:
分类问题中:真实概率分布是一个单位分布,真实类别为1,其他类别为0。如下所示:
类别 | class1 | class2 | class3 | class4 |
概率 | 0 | 0 | 1 | 0 |
,
,所以
是恒成立的。
因此,损失函数可以进一步简化为:
因为我上面已经解释了 为交叉熵,因此,上述损失函数就被称为了交叉熵损失函数,即:
六、简单实现交叉熵损失
接下来,我将简单实现一下交叉熵损失
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)
总结
以上就是本文的所有内容,读到这里,相信小伙伴们已经理解了从信息量到交叉熵损失的全部原理:交叉熵不仅是神经网络中的损失函数,更是信息论的基本工具,掌握这些概念能够更好地使各位小伙伴们理解其中的原理,也能更好地调试与优化模型。