交叉熵损失函数

说到交叉熵损失函数(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)= \frac{1}{ (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}^{N}y^{(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(ys)=log1+eys1=log(1+eys)

L 即是单个样本的交叉熵损失函数,如果是N个样本,则有: L = ∑ i = 1 N l o g ( 1 + e − y s ) L=\sum_{i=1}^{N} log(1+e^{-ys}) L=i=1Nlog(1+eys)

然后从实际函数来理解,当y=+1时, L = l o g ( 1 + e − s ) L=log(1+e^{-s}) L=log(1+es) , L对上一层得分函数s是单调递减函数,s越大(越接近1),损失函数L越小,s越小(接近0),损失函数越大

当y=-1时, L = l o g ( 1 + e s ) ​ L=log(1+e^s)​ L=log(1+es), L对上一层得分函数s是单调递增函数,s越小(接近0),损失函数越小,s越大(接近1),损失函数越大

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐