【机器学习】——为什么softmax搭配cross entropy是解决分类问题的通用方案?

众所周知,softmax+cross entropy是在线性模型、神经网络等模型中解决分类问题的通用方案,但是为什么选择这种方案呢?它相对于其他方案有什么优势?笔者一直也困惑不解,最近浏览了一些资料,有一些小小心得,希望大家指正~

损失函数:交叉熵Cross Entropy

我们可以从三个角度来理解cross entropy的物理意义

从实例上直观理解

我们首先来看Cross Entropy 的公式:
假设存在两个分布 p p p q q q p p p为样本的真实分布, q q q为模型预测出的样本分布,则在给定的样本集 X X X上,交叉熵的计算方式为
L C E ( p , q ) = − ∑ x ∈ X p ( x ) l o g q ( x ) L_{CE}(p,q)=-\sum _{x\in X}p(x)logq(x) LCE(p,q)=xXp(x)logq(x)
通常情况下在线性模型、神经网络等模型中,关于样本的真实分布可以用one-hot的编码来表示,比如男、女分别可以用[0,1]和[1,0]来表示,同样的,C种类别的样本可以用长度为C的向量来表示,且一个样本的表示向量中有且仅有一个维度为1,其余为0。那会造成什么后果呢?我们来看一个例子,假设一个样本的真实label为 [ 0 , 0 , 0 , 1 , 0 ] [0,0,0,1,0] [0,0,0,1,0],预测的分布为 [ 0.02 , 0.02 , 0.02 , 0.9 , 0.04 ] [0.02,0.02,0.02,0.9,0.04] [0.02,0.02,0.02,0.9,0.04],则交叉熵为:
L C E = − 1 ∗ l o g 0.9 L_{CE}=-1*log0.9 LCE=1log0.9
如果预测分布为 [ 0.1 , 0.5 , 0.2 , 0.1 , 0.2 ] [0.1,0.5,0.2,0.1,0.2] [0.1,0.5,0.2,0.1,0.2],则交叉熵为:
L C E = − 1 ∗ l o g 0.1 L_{CE}=-1*log0.1 LCE=1log0.1
可以看出其实 L C E L_{CE} LCE只与label中1所对应下标的预测值有关,且该预测值越大, L C E L_{CE} LCE越小
只要label中1所对应下标的预测值越接近1,则损失函数越小,这在直观上就是符合我们对于损失函数的预期

交叉熵为什么比均方误差好

作为回归问题的常见损失函数,均方误差公式为 l o s s M S E ( y , t ) = 1 2 ∑ i = 1 n ( y i − t i ) 2 loss_{MSE}(y,t)=\frac{1}{2}\sum_{i=1}^{n}(y_i - t_i)^2 lossMSE(y,t)=21i=1n(yiti)2,好像也可以用来计算分类问题的损失函数,那它为什么不适合分类问题呢?我们再来看一个例子假设一个样本的真实label为 [ 0 , 0 , 0 , 1 , 0 ] [0,0,0,1,0] [0,0,0,1,0],预测的分布为 D 1 = [ 0.1 , 0.1 , 0.1 , 0.6 , 0.1 ] D_1 =[0.1,0.1,0.1,0.6,0.1] D1=[0.1,0.1,0.1,0.6,0.1],预测分布 D 2 = [ 0 , 0 , 0 , 0.6 , 0.4 ] D_2 =[0,0,0,0.6,0.4] D2=[0,0,0,0.6,0.4],此时 l o s s M S E D 1 < l o s s M S E D 2 loss_{MSE}D_1 < loss_{MSE}D_2 lossMSED1<lossMSED2 ,也就是说对于 l o s s M S E loss_{MSE} lossMSE而言,即使与label中1所对应下标的预测值是正确的,其他项预测值的分布也会影响损失的大小,这不符合我们对于分类问题损失函数的预期。

似然估计的视角

我们知道,对于一个多分类问题,给定样本 x x x,它的似然函数可以表示为
p ( t ∣ x ) = ∏ i = 1 C P ( t i ∣ x ) t i = ∏ i = 1 C y i t i p(t|x)=\prod_{i=1}^{C}P(t_i|x)^{t_i}=\prod_{i=1}^{C}y_i^{t_i} p(tx)=i=1CP(tix)ti=i=1Cyiti
其中 y i y_i yi是模型预测的概率, t i t_i ti是对应类的label,那么其对数似然估计则为:
− ∑ i = 1 C t i l o g y i -\sum_{i=1}^{C}t_ilog{y_i} i=1Ctilogyi, t i t_i ti对应于 p ( x ) p(x) p(x) y i y_i yi对应于 q ( x ) q(x) q(x),其实交叉熵就是对应于该样本的负对数似然估计

KL散度视角

KL散度又被称为相对熵,可以用来衡量两个分布之间的距离,想了解KL散度可以参考如何理解K-L散度(相对熵)。需要了解的是:KL散度越小,两个分布越相近。这么看KL散度是不是很符合我们对于两个分布损失函数的定义呢?
,公式为:
D K L = − ∑ x ∈ X p ( x ) l o g p ( x ) q ( x ) = − ∑ x ∈ X p ( x ) l o g p ( x ) − ∑ x ∈ X p ( x ) l o g q ( x ) = − H ( p ) − ∑ x ∈ X p ( x ) l o g q ( x ) D_{KL}=-\sum _{x\in X}p(x)log\frac{p(x)}{q(x)}\\ =-\sum _{x\in X}p(x)logp(x) - \sum _{x\in X}p(x)logq(x)\\ =-H(p)-\sum _{x\in X}p(x)logq(x) DKL=xXp(x)logq(x)p(x)=xXp(x)logp(x)xXp(x)logq(x)=H(p)xXp(x)logq(x)
其中 H ( p ) H(p) H(p)为p的熵,注意这里的 p p p是样本的真实分布,所以 H ( p ) H(p) H(p)为常数,因此,KL散度与交叉熵事实上是等价的,所以交叉熵也可以用来衡量两个分布之间的距离,符合我们对于损失函数的期待

softmax+cross entropy到底学到了什么?

我们知道在回归问题中的最常用的损失函数是均方误差 l o s s M S E ( y , t ) = 1 2 ∑ i = 1 n ( y i − t i ) 2 loss_{MSE}(y,t)=\frac{1}{2}\sum_{i=1}^{n}(y_i - t_i)^2 lossMSE(y,t)=21i=1n(yiti)2,那么在反向传播时, ∂ l o s s ∂ y i = y i − t i \frac{\partial{loss}}{\partial{y_i}}=y_i-t_i yiloss=yiti,即均方误差在反向传播时传递的是预测值与label值的偏差,这显然是一个符合我们预期的、非常直觉的结果。
假定分类问题的最后一个隐藏层和输出层如下图所示
【机器学习】——为什么softmax搭配cross entropy是解决分类问题的通用方案?_第1张图片
a 1 . . . . . . . . a c a_1........a_c a1........ac为最后一个隐藏层的C个类别, y 1 . . . . . y c y_1.....y_c y1.....yc为输出层,则有 ∂ L o s s C E ∂ a i = y i − t i \frac{\partial{Loss_{CE}}}{\partial{a_i}}=y_i-t_i aiLossCE=yiti因此softmax+cross entropy在反向传播时传递的同样是预测值与label值的偏差,即 y i − t i y_i-t_i yiti,如果对于证明不感兴趣的,那么这篇文章就可以到此结束了~以下均为证明过程。
图中 y i = e a i ∑ j = 1 C e a j y_i=\frac{e^{a_i}}{\sum_{j=1}^Ce^{a_j}} yi=j=1Ceajeai,我们用 ∑ \sum 表示分母 ∑ j = 1 C e a j \sum_{j=1}^Ce^{a_j} j=1Ceaj,则 y i = e a i ∑ y_i=\frac{e^{a_i}}{\sum} yi=eai
∂ L C E ∂ a i = ∑ j = 1 C ∂ L C E ∂ y j ∂ y j ∂ a i = ∑ i = 1 C ( t i y j ) ∂ y j ∂ a i \frac{\partial{L_{CE}}}{\partial{a_i}}=\sum_{j=1}^{C}\frac{\partial{L_{CE}}}{\partial{y_j}}\frac{\partial{y_j}}{\partial{a_i}}=\sum_{i=1}^{C}(\frac{t_i}{y_j})\frac{\partial{y_j}}{\partial{a_i}} aiLCE=j=1CyjLCEaiyj=i=1C(yjti)aiyj 注意这里的 y i = e a i ∑ j = 1 C e a j y_i=\frac{e^{a_i}}{\sum_{j=1}^Ce^{a_j}} yi=j=1Ceajeai与所有的 a i a_i ai都相关,因此需要用链式法则求导
下面求 ∂ y j ∂ a i \frac{\partial{y_j}}{\partial{a_i}} aiyj,
∂ y j ∂ a i \frac{\partial{y_j}}{\partial{a_i}} aiyj的求导分为两种情况
i i i != j j j时, ∂ y j ∂ a i = ∂ e a j ∑ ∂ a i = − e a j ∑ e a i ∑ = − y i y j \frac{\partial{y_j}}{\partial{a_i}}=\frac{\partial{\frac{e^{a_j}}{\sum} }}{\partial{a_i}}=-\frac{e^{a_j}}{\sum} \frac{e^{a_i}}{\sum}=-y_iy_j aiyj=aieaj=eajeai=yiyj
i = j i=j i=j时, ∂ y j ∂ a i = ∂ e a i ∑ ∂ a i = e a i ∑ − e a i e a j ∑ 2 = e a i ∑ ∗ ∑ − e a j ∑ = y i ( 1 − y j ) \frac{\partial{y_j}}{\partial{a_i}}=\frac{\partial{\frac{e^{a_i}}{\sum} }}{\partial{a_i}}=\frac{e^{a_i}\sum-e^{a_i}e^{a_j}}{{\sum}^2}=\frac{e^{a_i}}{\sum} *\frac{\sum-e^{a_j}}{\sum}=y_i(1-y_j) aiyj=aieai=2eaieaieaj=eaieaj=yi(1yj)
代入上式得
∂ L C E ∂ a i = ∑ i = 1 C ( t i y j ) ∂ y j ∂ a i = − t i y i ∂ y i ∂ a i − ∑ i = j C ∂ y i ∂ a i = − t i y i y i ( 1 − y j ) − ∑ i ! = j C t i y i ( − y i y j ) = − t i + y i ∑ j = 1 C t j = y i − t i \frac{\partial{L_{CE}}}{\partial{a_i}}= \sum_{i=1}^{C}(\frac{t_i}{y_j})\frac{\partial{y_j}}{\partial{a_i}}= -\frac{t_i}{y_i}\frac{\partial{y_i}}{\partial{a_i}}-\sum_{i = j}^{C}\frac{\partial{y_i}}{\partial{a_i}}=-\frac{t_i}{y_i}y_i(1-y_j)-\sum_{i!=j}^{C}\frac{t_i}{y_i}(-y_iy_j) =-t_i+y_i\sum_{j=1}^Ct_j=y_i-t_i aiLCE=i=1C(yjti)aiyj=yitiaiyii=jCaiyi=yitiyi(1yj)i!=jCyiti(yiyj)=ti+yij=1Ctj=yiti 注意这里 ∑ j = 1 C t j \sum_{j=1}^Ct_j j=1Ctj为所有label的和,应该等于1.

你可能感兴趣的:(算法,深度学习,机器学习,机器学习笔记)