在深度学习中,交叉熵(Cross Entropy)几乎是分类任务中最常见的损失函数。从图像分类中的CNN,到目标检测中的YOLO,再到自然语言处理中的Transformer,交叉熵都扮演着核心角色。
但是很多初学者第一次接触交叉熵时,会产生一个疑问:
为什么分类问题不用简单的均方误差(MSE),而选择一个看起来更加抽象的交叉熵误差?
交叉熵衡量什么?
在信息论中,交叉熵是用来衡量两个概率分布之间差异的指标。假设有一个真实概率分布p和一个预测概率分布q,交叉熵表示用预测分布q来编码真实分布p中的事件所需的平均比特数。
交叉熵公式:
其中,p ( x i )是事件 x i 在真实分布中的概率,q ( x i ) 是事件 x i 在预测分布中的概率。
它描述的是:
真实分布和预测分布之间的信息差异。
交叉熵函数的几何意义?
如下是一段python代码,可以表达某种三元情况的交叉熵函数的几何图像:
import numpy as np import matplotlib.pyplot as plt # 概率空间 pA = np.linspace(0.01,0.98,200) pB = np.linspace(0.01,0.98,200) PA,PB=np.meshgrid(pA,pB) # 第三个概率 PC=1-PA-PB # 真实分布 YA=0.6 YB=0.3 YC=0.1 # 交叉熵 Loss=-(YA*np.log(PA) +YB*np.log(PB) +YC*np.log(PC)) # 去除非法区域 Loss[PC<=0]=np.nan fig=plt.figure(figsize=(8,6)) ax=fig.add_subplot( 111, projection='3d' ) ax.plot_surface( PA, PB, Loss ) ax.set_xlabel("pA") ax.set_ylabel("pB") ax.set_zlabel("Cross Entropy") plt.show()假设真实值是:
那么:
由于:
所以:
这是一个二维概率平面上的三元交叉熵曲面。效果如下:
可以看到交叉熵函数在预测概率和真实概率相差不大的时候变化缓慢(在PA,PB坐标为(0.6,0.3)时);在相差很大的时候变化剧烈(在概率曲面接近三个顶点时)。