一、概念区别
1. 均方差损失函数(MSE)
简单来说,均方误差(MSE)的含义是求一个batch中n个样本的n个输出与期望输出的差的平方的平均值、
2. Cross-entropy(交叉熵损失函数)
交叉熵是用来评估当前训练得到的概率分布与真实分布的差异情况。
它刻画的是实际输出(概率)与期望输出(概率)的距离,也就是交叉熵的值越小,两个概率分布就越接近。
二、为什么不用MSE(两者区别详解)
2.1 原因 1:交叉熵loss权重更新更快
2.1.1 MSE
比如对于一个神经元(单输入单输出,sigmoid函数),定义其代价函数为:
C=2(y−a)2
其中 C 是损失, y 是我们期望的输出(真实值 target),a 为神经元的实际输出(输出值), z=wx+b,a=σ(z)
在训练神经网络过程中,我们通过梯度下降算法来更新 w 和 b ,因此需要计算损失函数对 w 和 b 的导数:
∂w∂C=(a−y)σ′(z)x=(a−y)a(1−a)x≈aσ′(z)
∂b∂C=(a−y)σ′(z)=(a−y)a(1−a)≈aσ′(z)
(其中 x 和 y 都是已知量,因为网络输入都是以 (xi,yi)形式输入的,所以上式直接的 “≈” 把 x 和 y 略去了)
而后更新 w 和 b :
w=w−η∂w∂C=w−ηaσ′(z)
b=b−η∂b∂C=b−ηaσ′(z)

因为sigmoid函数的性质,如图的两端,几近于平坦,导致 σ′(z) 在 z 取大部分值时会很小,这样会使得 w 和 b 更新非常慢(因为 ηaσ′(z)=>0 )。
再定量解释如下:
在上式
∂w∂C=(a−y)σ′(z)x=(a−y)a(1−a)x≈aσ′(z)
a) 当真实值 y=1 ,
若 输出值 a=1,则 ∂w∂C=0
若 输出值 a=0,则 ∂w∂C=0
b) 当真实值 y=0 ,
若 输出值 a=1,则 ∂w∂C=0
若 输出值 a=0,则 ∂w∂C=0
也就是平方损失(MSE)的梯度更新很慢,如下图所示

这就带来实际操作的问题。当梯度很小的时候,应该减小步长(否则容易在最优解附近产生来回震荡),但是如果采用 MSE ,当梯度很小的时候,无法知道是离目标很远还是已经在目标附近了。(离目标很近和离目标很远,其梯度都很小)
2.1.2 Cross-entropy
为了克服上述 MSE 不足,引入了categorical_crossentropy(交叉熵损失函数)
1、二分类 Binary Cross-entropy
**函数为 sigmoid
f(z)=1+exp(−z)1
损失函数:
L(w)=−N1i=1∑N[yilogf(xi)+(1−yi)log(1−f(xi))]
或者简写成:
C=−N1i=1∑N[yilna+(1−yi)ln(1−a)]
其中 z=wx+b,a=σ(z),N 表示样本数量。
同样求导可得:
∂wj∂C=N1i=1∑N(σ(z)−y)xj=N1i=1∑N(a−y)xj
∂b∂C=N1i=1∑N(σ(z)−y)=N1i=1∑N(a−y)
=================================================================
证明如下:
∂wj∂C=−N1i=1∑N(σ(z)y−1−σ(z)(1−y))∂wj∂σ=−N1i=1∑N(σ(z)y−1−σ(z)(1−y))σ′(z)xj=N1i=1∑Nσ(z)(1−σ(z))σ′(z)xj(σ(z)−y)=N1i=1∑Nxj(σ(z)−y)
其中,σ′(z)=σ(z)(1−σ(z))
=================================================================
因此,w 的梯度公式中原来的 σ′(z) 被消掉了,所以导数中没有 σ′(z) 这一项,权重的更新是受 (a−y) 这一项影响(表示真实值和输出值之间的误差),即受误差的影响,所以当误差大的时候,权重更新就快,当误差小的时候,权重的更新就慢。
2、多分类 Categorican Cross-entropy
**函数为 softmax
σ(z)j=∑k=1Kezkezj
可以看作是Sigmoid的一般情况,用于多分类问题。
损失函数:
C=−i=1∑kyilnai
后续分析类似。
2.1.3 补充 Cross-entropy 的缺点
sigmoid(softmax)+cross-entropy loss 擅长于学习类间的信息,因为它采用了类间竞争机制,它只关心对于正确标签预测概率的准确性,忽略了其他非正确标签的差异,导致学习到的特征比较散。基于这个问题的优化有很多,比如对softmax进行改进,如L-Softmax、SM-Softmax、AM-Softmax等。这些在本篇不展开讨论。
2.2 原因 2:MSE是非凸优化问题而 Cross-entropy 是凸优化问题
2.2.1 MSE
我们从最简单的线性回归开始讨论:
线性回归(回归问题)使用的是平方损失:
L(ω,b)=2N1i=1∑N(f(xi)−yi)2=2N1i=1∑N(yi−ωxi−b)2
因为这个函数 L(ω,b) 是凸函数,直接求导等于零,即可求出解析解,很简单。但是对于逻辑回归则不行(分类问题)【注意:逻辑回归不是回归!是分类!!】。因为如果逻辑回归也用平方损失作为损失函数,则:
L(w)=2N1i=1∑N(f(xi)−yi)2=2N1i=1∑N(yi−σ(z))2=2N1i=1∑N(yi−σ(w⋅x))2=2N1i=1∑N(yi−1+e−(w⋅x)1)2
其中 N 表示样本数量。
上式是非凸的,不能直接求解析解,而且不宜优化,易陷入局部最优解,即使使用梯度下降也很难得到全局最优解。如下图所示:

2.2.2 Cross-entropy
而,Cross-entropy 计算 loss,则依旧是一个凸优化问题。
以下进行详细说明和推导:
逻辑回归模型进行学习时,给定训练集:T={(x1,y1),(x2,y2),⋯,(xN,yN)},其中 xi=⎣⎢⎢⎢⎢⎡xi(1)xi(2)⋮xi(n)⎦⎥⎥⎥⎥⎤∈Rn,yi∈{0,1},可以应用 极大似然估计 估计模型参数,从而得到逻辑回归模型。
设:
P(Y=1∣x)=π(x),P(Y=0∣x)=1−π(x)
似然函数:
i=1∏N[π(xi)]yi[1−π(xi)]1−yi
对数似然函数为:
L(w)=log[i=1∏N[π(xi)]yi[1−π(xi)]1−yi]=i=1∑N[yilogπ(xi)+(1−yi)log(1−π(xi))]=i=1∑N[yilog1−π(xi)π(xi)+log(1−π(xi))]=i=1∑N[yi(w⋅xi)−log(1+ew⋅xi)]
接下来求 L(w) 的极大值,从而得到 w 的估计值。
这样一来,问题就变成了以对数似然函数为目标函数的最优化问题,逻辑回归
中通常的方法就是梯度下降法和拟牛顿法。
极大似然函数是求极大,取个相反数,再对所有 N 个样本取平均,即得到逻辑回归的损失函数:
L(w)=N1i=1∑N[−yilogπ(xi)−(1−yi)log(1−π(xi))]=−N1i=1∑N[yilogπ(xi)+(1−yi)log(1−π(xi))]
并且这个损失函数 L(w) 是凸函数,没有局部最优解,便于优化。
=============================================================
以下是直观理解:
L(w)={−log(π(xi))−log(1−π(xi)) if y=1 if y=0
其中:
π(xi)=P(Y=1∣x)=1+ew⋅xew⋅x=1+e−(w⋅x)1

当类别标签为y=1 时,越靠近 1 则损失越小;当类别标签为 y=0 时,越靠近 1
则损失越大.
=============================================================
三、总结
-
分类问题,都用 one-hot + Cross-entropy
-
training 过程中,分类问题用 Cross-entropy,回归问题用 mean squared error。
-
training 之后,validation / testing 时,使用 classification error,更直观,而且是我们最关注的指标。(分类错误数量 / 总数)
即:classification error = count of all items count of error items
参考链接:
- 《李宏毅机器学习》课程中 逻辑回归 一节,: 李宏毅机器笔记 Logistic Regression(解释 LR 为什么不能用 square error ).
-
解析损失函数之categorical_crossentropy loss与 Hinge loss.
-
神经网络的分类模型 LOSS 函数为什么要用 CROSS ENTROPY.
-
交叉熵损失函数.