各种交叉熵损失函数比较及适用范围
一、基本概念
1、信息量
当越不可能的事件发生了,我们获取到的信息量就越大。越可能发生的事件发生了,我们获取到的信息量就越小。
I(x0)=−log(p(x0))I(x_0)=-\log(p(x_0))I(x0)=−log(p(x0))
2、熵
对于某个事件,有nnn种可能性,每一种可能性都有一个概率p(xi)p(x_i)p(xi).熵用来表示所有信息量的期望
H(X)=−∑i=1np(xi)log(p(xi))H(X)=-\sum_{i=1}^{n} p\left(x_{i}\right) \log \left(p\left(x_{i}\right)\right)H(X)=−∑i=1np(xi)log(p(xi))
3、相对熵(KL散度)
对于有两个单独的概率分布P(x)和Q(x)的同一个随机变量X。可以用KL散度衡量两个分布的差异。
在ML中P一般用来表示样本的真实分布,e.g.[1,0,0];Q一般用来表示模型所预测的分布,e.g.[0.6,0.2,0.2]。
DKL(p∣∣q)=Σi=1np(xi)log(p(xi)q(xi))D_{KL}(p||q)=\Sigma_{i=1}^n p(x_i)\log(\frac{p(x_i)}{q(x_i)})DKL(p∣∣q)=Σi=1np(xi)log(q(xi)p(xi))
KL散度越小代表两者分布越接近。
4、交叉熵
对KL散度进行变形可以看到
DKL(p∣∣q)=−H(p(x))+Σi=1np(xi)log(q(xi))D_{KL}(p||q)=-H(p(x))+\Sigma_{i=1}^n p(x_i)\log(q(x_i))DKL(p∣∣q)=−H(p(x))+Σi=1np(xi)log(q(xi))
其中p代表groundtruth的熵值,q代表预测值。
在优化过程中,-H(p(x))保持不变,只关注后面部分的部分就可以,一般在ML的优化过程中直接用交叉熵做loss评估模型。
H(p,q)=−Σi=1np(xi)log(q(xi))H(p,q)=-\Sigma^n_{i=1}p(x_i)\log(q(x_i))H(p,q)=−Σi=1np(xi)log(q(xi))
二、各种熵
(一)以tensorflow为例
1、softmax_cross_entropy
在二分类或者类别相互排斥多分类问题,计算 logits 和 labels 之间的 softmax 交叉熵。
计算过程
-
对输入进行softmax
Sj=eaj∑k=1TeakS_{j}=\frac{e^{a_{j}}}{\sum_{k=1}^{T} e^{a_{k}}}Sj=∑k=1Teakeaj
例如输入为[1,2,3],输出[0.09,0.24,0.67]。
-
计算交叉熵
LLL是损失,SjS_jSj是softmax的输出向量SSS的第jjj个值,表示这个样本属于第j个类别的概率。yjy_jyj前面有个求和符号,jjj的范围也是1到类别数TTT,因此label——y是一个1∗T1*T1∗T的向量,里面的T个值,而且只有1个值是1,其他T-1个值都是0。真实标签对应的位置的那个值是1,其他都是0。
所以该公式可以化简为L=−logSjL=-\log S_jL=−logSj
例如五分类问题,Y=[0,0,0,1,0]。如果model的softmax输出为p=[0.1,0.15,0.05,0.6,0.1],对应的损失为L=−log(0.6)=0.511L=-log(0.6)=0.511L=−log(0.6)=0.511,如果输出为p=[0.15,0.2,0.4,0.1,0.15],对应的损失L=−log(0.1)=2.3L=-log(0.1)=2.3L=−log(0.1)=2.3
2、binary_cross_entropy
binary_cross_entropy是二分类的交叉熵,实际是多分类softmax_cross_entropy的一种特殊情况,当多分类中,类别只有两类时,即0或者1,即为二分类,二分类也是一个逻辑回归问题,也可以套用逻辑回归的损失函数。
例如一个batch中含有两个样本,label作为vector制成2D之后,比如y=[[1,0],[0,1]]。模型预测也为二维,例如模型预测输出p=[[0.8,0.2],[0.4,0.6]],则对应的损失为L=(−log(0.8)−log(0.6))/2=0.3669L=(-log(0.8)-log(0.6))/2=0.3669L=(−log(0.8)−log(0.6))/2=0.3669
3、sigmoid_cross_entropy
测量每个类别独立且不相互排斥的离散分类任务中的概率。适用于多标签分类。
设x=logits, z=labels,那么Logistics损失值为:
L=z∗−log(sigmoid(x))+(1−z)∗(−log(1−sigmoid(x)))=z∗−log(1/(1+exp(−x)))+(1−z)∗(−log(exp(−x)/(1+exp(−x))=z∗log(1+exp(−x))+(1−z)∗(−log(exp(−x))+log(1+exp(−x)))=z∗log(1+exp(−x))+(1−z)∗(x+log(1+exp(−x))=(1−z)∗x+log(1+exp(−x))=x−x∗z+log(1+exp(−x))L=z*-log(sigmoid(x))+(1-z)*(-log(1-sigmoid(x)))\\=z*-log(1/(1+exp(-x)))+(1-z)*(-log(exp(-x) / (1 + exp(-x))\\= z * log(1 + exp(-x)) + (1 - z) * (-log(exp(-x)) + log(1 + exp(-x)))\\=z * log(1 + exp(-x)) + (1 - z) * (x + log(1 + exp(-x))\\=(1 - z) * x + log(1 + exp(-x))\\=x-x*z+log(1+exp(-x))L=z∗−log(sigmoid(x))+(1−z)∗(−log(1−sigmoid(x)))=z∗−log(1/(1+exp(−x)))+

本文详细介绍了信息量、熵、相对熵(KL散度)和交叉熵的概念,以及它们在机器学习中的作用。针对二分类和多分类任务,分别探讨了softmax_cross_entropy、binary_cross_entropy和sigmoid_cross_entropy的计算过程,并通过TensorFlow和PyTorch的实例展示了不同损失函数的使用。同时,还讨论了回归任务中的L1Loss和SmoothL1Loss,以及分类任务中的CrossEntropyLoss、BCELoss、NLLLoss和MultiLabelSoftMarginLoss。这些损失函数在实际问题中各有优缺点,适用于不同的场景和任务需求。

3767

被折叠的 条评论
为什么被折叠?



