交叉熵损失函数详解

Posted zhongrui_fzr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了交叉熵损失函数详解相关的知识,希望对你有一定的参考价值。

交叉熵损失函数

说到交叉熵损失函数(Cross Entropy Loss),就想到公式: L = − [ y l o g y ^ + ( 1 − y ) l o g ( 1 − y ^ ) ] L=-[ylog \\hat y + (1-y)log(1- \\hat y)] L=[ylogy^+(1y)log(1y^)]

大多数情况下,这个交叉熵函数直接拿来用即可,但是知其然还要知其所以然,关于它是怎么推导而来的,为什么它能表征真实样本标签和预测概率之间的差值?交叉熵函数是否有其他变种?本文将从这几个问题总结交叉熵损失函数

1. 交叉熵损失函数的数学原理

二分类问题中,一般使用标签[0, 1]表示负类和正类,如逻辑回归(Logistic Regression),神经网络(Neural Network)等。

模型的预测值通常会经过Sigmoid函数,输出一个概率值,这个概率值反映了预测为正类的可能性:概率越大,可能性越大

Sigmoid函数的表达式: g ( s ) = 1 ( 1 + e − s ) g(s)= \\frac1 (1+e^-s) g(s)=(1+es)1 sigmoid是一个S形状的函数

其中s是模型上一层的输出,Sigmoid函数有这样的特点:s=0时,g(s) = 0.5; s>>0时, g ≈ 1 g\\approx1 g1, s<<0时, g ≈ 0 g \\approx 0 g0

显然,g(s)将前一级的线性输出映射到[0, 1]之间的数值概率上, 作为模型预测输出。

Sigmoid函数的输出表征了当前样本标签为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

当真实样本标签y=0时,概率为 P ( y = 0 ∣ x ) = 1 − y ^ P(y=0|x)=1-\\hat y P(y=0x)=1y^

当真实样本标签y=1时,概率为 P ( y = 1 ∣ x ) = y ^ P(y=1|x)=\\hat y P(y=1x)=y^

整合之后的概率表达式跟之前完全一致

模型设计的目标是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^)

我们希望logP(y|x)越大越好,即-logP(y|x)越小越好。根据此目标设置损失函数Loss=-logP(y|x),

得到损失函数: L = − [ y l o g y ^ + ( 1 − y ) l o g ( 1 − y ^ ) ] L=-[ylog\\hat y + (1-y)log(1-\\hat y)] L=[ylogy^+(1y)log(1y^)]

至此,得到了单个样本的损失函数,如果是计算N个样本的总损失函数,则需要将N个Loss叠加起来: L = − ∑ i = 1 N y ( i ) l o g y ^ ( i ) + ( 1 − y i ) l o g ( 1 − y ^ ( i ) ) L =- \\sum_i=1^Ny^(i)log\\hat y^(i) + (1- y^i)log(1-\\hat y ^ (i)) L=i=1Ny(i)logy^(i)+(1yi)log(1y^(i))

以上就是交叉熵损失函数的完整推导过程

2. 交叉熵损失函数的现实意义

单个样本的交叉熵损失函数: 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=[ylogy^+(1y)log(1y^)]

当y=1时, L = − l o g y ^ L=- log \\hat y L=logy^ ,对数函数是单调递增的,因此L对 $ \\hat y$ 是单调递减函数。即预测输出值$ \\hat y$越大(靠近1),损失函数值L越小,预测输出值 $ \\hat y$ 越小(接近0),损失函数值L越大,符合实际需要

当y=0时, L = − l o g ( 1 − y ^ ) L=-log(1- \\hat y) L=log(1y^), L对 $ \\hat y $ 是单调递增函数。即预测输出值 $ \\hat y$ 越小(接近0),损失函数值L越小,预测输出值 $ \\hat y​$ 越大(接近1),损失函数值L越大,同样符合实际需要

无论真实样本标签y是0还是1,L都表征了预测输出与y的差距

而且由于log函数本身的特性所致,预测输出与y差得越多,L的值越大,即对当前模型的”惩罚“越大,且是非线性增大,类似指数增长的级别,这样的好处是模型会倾向于让预测输出更接近真实样本标签y

3. 交叉熵损失函数的变形

假设真实样本的标签为+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时,得到 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)

把上述两个式子整合到一起,得到:

P ( y ∣ x ) = g ( y s ) P(y|x) = g(ys) P(yx)=g(ys)

接下来,同样引入log函数,得到: l o g P ( y ∣ x ) = l o g g ( y s ) logP(y|x) = log g(ys) logP(yx)=logg(ys)

模型的目标是让概率值最大,即负数最小。所以定义损失函数为: L = − l o g g ( y s ) L=-logg(ys) L=logg(ys)

g是一个sigmoid函数,即: L = − l o g g ( y s ) = − l o g 1 1 + e − y s = l o g ( 1 + e − y s ) L=-logg(ys) = -log \\frac 1 1+e^-ys = log(1+e^-ys) L=logg(y以上是关于交叉熵损失函数详解的主要内容,如果未能解决你的问题,请参考以下文章

详解pytorch中的交叉熵损失函数nn.BCELoss()nn.BCELossWithLogits(),二分类任务如何定义损失函数,如何计算准确率如何预测

Pytorch常用的交叉熵损失函数CrossEntropyLoss()详解

神经网络:损失函数详解

[损失函数]——交叉熵

交叉熵损失函数

交叉熵损失函数关于交叉熵损失函数的一些理解