分类问题中,交叉熵函数是比较常用也是比较基础的损失函数,原来就是了解,但一直搞不懂他是怎么来的?为什么交叉熵能够表征真实样本标签和预测概率之间的差值?趁着这次学习把这些概念系统学习了一下。
交叉熵的数学原理
首先说起交叉熵,脑子里就会出现这个东西:
L = − [ y log y ^ + ( 1 − y ) log ( 1 − y ^ ) ] L=-[y\log{\hat{y}}+(1-y)\log{(1-\hat{y})}] L=−[ylogy^+(1−y)log(1−y^)]
随后我们脑子里可能还会出现Sigmoid()这个函数:
g ( s ) = 1 1 + e − s {g(s)}=\frac{1}{1+e^{-s}} g(s)=1+e−s1
pytorch中的CrossEntropyLoss()函数实际就是先把输出结果进行sigmoid,随后再放到传统的交叉熵函数中,就会得到结果。
那我们就先从sigmoid开始说起,我们知道sigmoid的作用其实是把前一层的输入映射到0~1这个区间上,可以认为上一层某个样本的输入数据越大,就代表这个样本标签属于1的概率就越大,反之,上一层某样本的输入数据越小,这个样本标签属于0的概率就越大,而且通过sigmoid函数的图像我们可以看出来,随着输入数值的增大,其对概率增大的作用效果是逐渐减弱的,反之同理,这就是非线性映射的一个好处,让模型对处于中间范围的输入数据更敏感。下面是sigmoid函数图:

既然经过sigmoid之后的数据能表示样本所属某个标签的概率,那么举个例子,我们模型预测某个样本标签为1的概率是:
y ^ = P ( y = 1 ∣ x ) \hat{y}=P(y=1|x) y^=P(y=1∣x)
那么自然的,这个样本标签不为1的概率是:
1 − y ^ = P ( y = 0 ∣ x ) 1-\hat{y}=P(y=0|x) 1−y^=P(y=0∣x)
从极大似然的角度来说就是:
P ( y ∣ x ) = y ^ y ( 1 − y ^ ) 1 − y P(y|x)=\hat{y}^{y}(1-\hat{y})^{1-y} P(y∣x)=y^