交叉熵损失函数

1. 交叉熵

交叉熵(Cross Entropy)是Shannon信息论中一个重要概念,主要用于度量两个概率分布间的差异性信息。从数学角度上看,假设有两个概率分布,其中p表示真实分布,q表示非真实分布,在相同的一组事件中,交叉熵是用非真实分布q来表示某个事件发生所需要的平均比特数。
E = − ∑ x p ( x ) l o g q ( x ) E = -\sum_xp(x)logq(x) E=xp(x)logq(x) 假设现在有一个样本集中两个概率分布p,q,其中p为真实分布,q为非真实分布,上式表示采用非真实分布q来表示真实分布p所需要的编码长度的期望。可见,交叉熵越小,两个分布差异性越小,因此交叉熵可以用来作为机器学习中的损失函数。

2. Sigmoid

我们知道交叉熵是衡量两个分布之间的差异性,那么这个分布怎么来的呢?先看个用于二分类的Sigmoid函数(关于Sigmoid参见博客)。
f ( x ) = 1 1 + e − x f(x)=\frac{1}{1+e^{-x}} f(x)=1+ex1 前面我们说过,Sigmoid与概率有着天然的联系,因此Sigmoid可以表示将样本预测为正例的概率,显然这可以用来作为二分类的评判指标。

2.1 Sigmoid 交叉熵损失函数 1

这种形式下假设真实样本的标签为 +1 和 0,分别表示正类和负类。
Sigmoid 函数的输出表征了当前样本预测标签为 1 的概率(关键:可以将二分类的结果转换为预测标签为1的概率):
y ^ = P ( y = 1 ∣ x ) \hat{y} = P(y=1| x) y^=P(y=1x)
那么当前样本预测标签为 0 的概率就可以表达成:
1 − y ^ = P ( y = 0 ∣ x ) 1−\hat{y} = P(y=0|x) 1y^=P(y=0x)
如果我们从极大似然性的角度出发,把上面两种情况整合到一起:
P ( y ∣ x ) = y ^ y ⋅ ( 1 − y ^ ) 1 − y P(y|x)=\hat{y}^y⋅(1−\hat{y})^{1−y} P(yx)=y^y(1y^)1y
显然,我们希望的是概率 P(y|x) 越大越好。首先,我们对 P(y|x) 引入 log 函数,因为 log 运算并不会影响函数本身的单调性:
l o g P ( y ∣ x ) = l o g ( y ^ y ⋅ ( 1 − y ^ ) 1 − y ) = y l o g y ^ + ( 1 − y ) l o g ( 1 − y ^ ) logP(y|x)=log(\hat{y}^y⋅(1−\hat{y})^{1−y}) = ylog\hat{y} + (1-y)log(1−\hat{y}) logP(yx)=log(y^y(1y^)1y)=ylogy^+(1y)log(1y^)
根据凸优化理论,只要 log P(y|x) 取负值 - logP(y|x) 即为凸函数了,此时要求 - logP(y|x) 越小越好。那我们就可以引入损失函数Loss:
L o s s = − l o g P ( y ∣ x ) = − [ y l o g y ^ + ( 1 − y ) l o g ( 1 − y ^ ) ] Loss = - logP(y|x) = - [ylog\hat{y} + (1-y)log(1−\hat{y})] Loss=logP(yx)=[ylogy^+(1y)log(1y^)]

2.2 Sigmoid 交叉熵损失函数 2

这种形式下假设真实样本的标签为 +1 和 -1,分别表示正类和负类。
Sigmoid函数一个性质: 1 − g ( s ) = g ( − s ) 1−g(s)=g(−s) 1g(s)=g(s)
前面说了 y = +1 时,下列等式成立:
P ( y = + 1 ∣ x ) = g ( s ) P(y=+1|x)=g(s) P(y=+1x)=g(s)

如果 y = -1 时,并引入 Sigmoid 函数的性质,下列等式成立:
P ( y = − 1 ∣ x ) = 1 − g ( s ) = g ( − s ) P(y=−1|x)=1−g(s)=g(−s) P(y=1x)=1g(s)=g(s)
因为 y 取值为 +1 或 -1,可以把 y 值带入,将上面两个式子整合到一起:
P ( y ∣ x ) = g ( y s ) P(y|x)=g(ys) P(yx)=g(ys)
与2.1节一样转化为Loss:
L o s s = − l o g P ( y ∣ x ) = − l o g g ( y s ) = − l o g 1 1 + e − y s = l o g ( 1 + e − y s ) Loss = - logP(y|x) = - logg(ys) = - log\frac{1}{1+e^{-ys}}= log(1+e^{-ys}) Loss=logP(yx)=logg(ys)=log1+eys1=log(1+eys)
如果是 N 个样本,其交叉熵损失函数为:
L = ∑ n = 1 N l o g ( 1 + e − y s ) L= \sum_{n=1}^Nlog (1+e^{−ys}) L=n=1Nlog(1+eys)
思考一个问题,Sigmoid可以表示预测为正例的概率,那么多分类问题Sigmoid是否可以表达呢?可以转化为多个二分类问题,但是我们有个简洁的方式,继续往下看。

3. Softmax

根据2节我们知道Sigmoid可以用来进行二分类,那么Softmax是用于多分类一个很好的选择。
y k = e a k ∑ i = 1 n e a i y_k = \frac{e^{a_k}}{\sum_{i=1}^ne^{a_i}} yk=i=1neaieak 其中,ai 为神经网络输出,n 为输出个数(即分类类别数)。
注:这一步其实就是对神经网络输出进行 归一化

那么交叉熵损失函数为:
E = − ∑ x p ( x ) l o g q ( x ) E = -\sum_xp(x)logq(x) E=xp(x)logq(x) 其中 x 表示各个分量,注意 p 与 q 分别表示真实分布与预测分布,E(p,q) != E(q,p)。


举个例子,假设有一个3分类问题,某个样例的正确答案是(1,0,0),这个模型经过softmax回归之后的预测答案是(0.5,0.4,0.1),那么预测和正确答案之间的交叉熵为:
E ( ( 1 , 0 , 0 ) , ( 0.5 , 0.4 , 0.1 ) ) = − [ 1 × l o g ( 0.5 ) + 0 × l o g ( 0.4 ) + 0 × l o g ( 0.1 ) ] ≈ 0.3 E((1,0,0),(0.5,0.4,0.1))=-[1×log(0.5) + 0×log(0.4)+0×log(0.1)]≈0.3 E((1,0,0),(0.50.40.1))=[1×log(0.5)+0×log(0.4)+0×log(0.1)]0.3
如果另一个模型的预测是(0.8,0.1,0.1),那么这个预测值和真实值之间的交叉熵是:
E ( ( 1 , 0 , 0 ) , ( 0.8 , 0.1 , 0.1 ) ) = − [ 1 × l o g ( 0.8 ) + 0 × l o g ( 0.1 ) + 0 × l o g ( 0.1 ) ] ≈ 0.1 E((1,0,0),(0.8,0.1,0.1))=-[1×log(0.8) + 0×log(0.1)+0×log(0.1)]≈0.1 E((1,0,0),(0.80.10.1))=[1×log(0.8)+0×log(0.1)+0×log(0.1)]0.1
显然我们看到第二个预测要优于第一个。这里的(1,0,0)就是正确答案p,(0.5,0.4,0.1)和(0.8,0.1,0.1)就是预测值q,显然用(0.8,0.1,0.1)表达(1,0,0)的困难程度更小。


思考一个问题:分类时,为什么不使用均方误差MSE而是使用交叉熵作为损失函数?

  1. MSE梯度消失问题(请比较两种 loss 对 weights 求导结果形式即可理解)。
  2. 交叉熵的损失函数只和分类正确的预测结果有关系,而MSE的损失函数还和错误分类有关系,该分类函数除了让正确的分类尽量变大,还会让错误的分类变得平均,但实际在分类问题中这个调整是没有必要的。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值