分类问题中,交叉熵函数是比较常用也是比较基础的损失函数。
基本推导过程
提到交叉熵,脑子里就会出现这个公式:
L = − [ y ∗ l o g y ^ + ( 1 − y ) ∗ l o g ( 1 − y ^ ) ] L=-[y*log\hat{y}+(1-y)*log(1-\hat{y})] L=−[y∗logy^+(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(将数据设置到0-1之间),随后再放到传统的交叉熵函数中,就会得到结果。
我们知道 s i g m o i d sigmoid sigmoid的作用其实就是把前一层的输入映射到0-1这个区间上,可以认为上一层某个输入样本的数据越大,就代表这个样本标签属于1的概率就越大,反之, 上一层样本的输入数据越小,这个样本标签属于0的概率就越大, 而且通过 s i g m o i d sigmoid sigmoid函数的图像(见下)我们可以看出来,随着输入值的增大, 其对概率增大的作用效果是逐渐减弱的, 反之同理, 这就是非线性映射的一个好处,让模型处于对中间范围的输入数据更敏感,下面是 s i g m o i d sigmoid sigmoid图:
既然经过 s i g m o i d 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^y∗(1−y^)1−y
上式可以理解为,某一个样本x,我们通过模型预测出其属于样本标签为y的概率, 因为y是我们给的正确结果, 所以我们当然希望上式越大越好。
接下来我们在 P ( y ∣ x ) P(y|x) P(y∣x)的外面套上一层log函数,相当于进行了一次非线性映射。众所周知, l o g log </