本文主要总结一下常见的损失函数。
损失函数分为经验风险损失函数和结构风险损失函数。经验风险损失函数指预测结果和实际结果的差别,结构风险损失函数是指经验风险损失函数加上正则项。
1. 0-1损失函数(zero-one loss)
0-1损失是指:预测值和目标值不相等损失值取1, 否则为0:
- 0-1损失函数直接对应分类判断错误的个数,但是它是一个非凸函数,不太适用.
- 相等这个条件太过严格,因此可以放宽条件,即满足
∣
Y
−
f
(
x
)
∣
<
T
\bm{|Y-f(x)|<T}
∣Y−f(x)∣<T时认为相等
2. 绝对值损失函数
绝对值损失函数是计算预测值与目标值的差的绝对值:
3. log对数损失函数
log对数损失函数的标准形式如下:
-
log对数损失函数能非常好的表征概率分布,在很多场景尤其是多分类,如果需要知道结果属于每个类别的置信度,那它非常适合。
-
健壮性不强,相比于hinge loss对噪声更敏感。
-
逻辑回归的损失函数就是log对数损失函数。
4. 指数损失函数(exponential loss)
指数损失函数的标准形式如下:
- 对离群点、噪声非常敏感。经常用在AdaBoost算法中。
5. Hinge 损失函数
Hinge损失函数标准形式如下:
-
hinge损失函数表示如果被分类正确,损失为0,否则损失就为 ( 1 − y f ( x ) ) \bm{(1-yf(x))} (1−yf(x))。SVM就是使用这个损失函数。
-
一般的 f ( x ) f(x) f(x) 是预测值,在-1到1之间, y y y是目标值(-1或1)。其含义是, f ( x ) f(x) f(x) 的值在-1和+1之间就可以了,并不鼓励 ∣ f ( x ) ∣ > 1 |f(x)|>1 ∣f(x)∣>1,即并不鼓励分类器过度自信,让某个正确分类的样本距离分割线超过1并不会有任何奖励,从而使分类器可以更专注于整体的误差。
-
健壮性相对较高,对异常点、噪声不敏感,但它没太好的概率解释。
6. 感知损失(perceptron loss)函数
感知损失函数的标准形式如下:
- 是Hinge损失函数的一个变种,Hinge loss对判定边界附近的点(正确端)惩罚力度很高。而perceptron loss只要样本的判定类别正确的话,它就满意,不管其判定边界的距离。它比Hinge loss简单,因为不是max-margin boundary,所以模型的泛化能力没 hinge loss强。
7.均方误差损失
均方差损失函数常用在最小二乘法中。它的思想是使得各个训练点到最优拟合线的距离最小(平方和最小)。均方差损失函数也是我们最常见的损失函数了,相信大很熟悉了,我们以神经网络中激活函数的形式表达一下,定义如下:
其中,
a
=
f
(
z
)
=
f
(
w
⋅
x
+
b
)
a=f(z)=f(w·x+b)
a=f(z)=f(w⋅x+b) :x是输入、w和b是网络的参数、
f
(
⋅
)
f(·)
f(⋅) 是激活函数。
均方误差+Sigmoid激活函数:输出层神经元学习率缓慢
Sigmoid的导数推导以及图像:
从sigmiod的导数图像中可以看到,除了中间比较小的区域,其他区域的十分值接近于0。
神经网络的反向传播是逐层对函数偏导相乘,因此当神经网络层数非常深的时候,最后一层产生的偏差(网络输出和标签之间的偏差)因为乘了很多的小于1的数而越来越小,最终就会变为0,从而导致层数比较浅的权重w没有更新,即梯度消失。可以看出,sigmoid函数作为激活函数本身就存在梯度消失的问题。
我们以一个神经元,ESM均方误差损失
J
=
1
2
(
y
−
a
)
2
J=\frac{1}{2}(y-a)^{2}
J=21(y−a)2 ,Sigmoid激活函数
a
=
σ
(
z
)
a=\sigma (z)
a=σ(z) (其中
z
=
w
x
+
b
z=wx+b
z=wx+b)为例,计算一下最后一层的反向传播过程,可得:
可以看到最后一层反向传播时,所求的梯度中都含有
σ
′
(
z
)
\sigma^{′}(z)
σ′(z) 。经过上面的分析,当神经元输出接近1时候,Sigmoid的导数
σ
′
(
z
)
\sigma^{′}(z)
σ′(z) 变很小,这样
∂
J
∂
w
、
∂
J
∂
b
\frac{\partial J}{\partial w} 、 \frac{\partial J}{\partial b}
∂w∂J、∂b∂J 很小,这就导致了ESM均方误差+Sigmoid激活函数使得神经网络反向传播的起始位置——输出层神经元学习率缓慢。
想要解决这个问题,需要引入接下来介绍的交叉熵损失函数。这里先给出结论:交叉熵损失+Sigmoid激活函数可以解决输出层神经元学习率缓慢的问题,但是不能解决隐藏层神经元学习率缓慢的问题。具体的推导和总结在下面部分中介绍。
8. 交叉熵损失
softmax分类器
交叉熵损失是基于softmax计算来的,softmax将网络最后输出z通过指数转变成概率形式。首先看一下softmax计算公式: p i = e z i ∑ j = 1 k e z j p_{i}=\frac{e^{z_{i}}}{\sum_{j=1}^{k}{e}^{z_{j}}} pi=∑j=1kezjezi
其中, 分子 e z i e^{z_{i}} ezi 是要计算的类别 i 的网络输出的指数;分母是所有类别网络输出的指数和,共k个类别。这样就得到了类别i的输出概率 p i p_{i} pi 。
→这里说点题外话,实际上,softmax是由逻辑斯的回归模型(用于二分类)推广得到的多项逻辑斯蒂回归模型(用于多分类)。具体可以参考李航大神的《统计学方法》第六章,这里给一个大致的过程。
逻辑回归的P(Y=y|x)表达式如下(为了将类别标签y统一为1和0,下面将表达式分开表示):
将它带入到上式,通过推导可以得到logistic的损失函数表达式,如下:
逻辑回归最后得到的目标式子如下:
交叉熵损失
公式定义如下: J = − 1 N ∑ 1 N ∑ i = 1 k y i ⋅ l o g ( p i ) J=-\frac{1}{N}\sum_{1}^{N}{\sum_{i=1}^{k}{y_{i}·log(p_{i})}} J=−N1∑1N∑i=1kyi⋅log(pi)
其中, y i y_{i} yi 是类别 i 的真实标签; p i p_{i} pi是上面softmax计算出的类别 i 的概率值;k是类别数,N是样本总数。
这里看一个计算交叉熵损失的小例子:
假设共有三个类别cat、dog、bird,那么一张cat的图片标签应该为
(
1
,
0
,
0
)
T
(1,0,0)^{T}
(1,0,0)T 。并且训练过程中,这张cat的图片经过网络后得到三个类别网络的输出分别为3、1、-3。那么经过softmax可以得到对应的概率值,如下图:
交叉熵损失的两个图像
指数图像
softmax分类器将各个类别的“得分”(网络输出)转变成概率值。并取e指数使得“得分”高的类别对应的概率更大,使得损失函数对网络输出“更敏感”,更有利于分类。
对数图像
交叉熵损失+Sigmoid激活函数:
接着上一部分留下的问题,我们仍然以Sigmoid激活函数
a
=
σ
(
z
)
a=\sigma (z)
a=σ(z) (其中
z
=
w
x
+
b
z=wx+b
z=wx+b )为例。这次我们引入交叉熵损失,并以二分类为例,那么s损失函数公式为:
那么可以计算一下最后一层的反向传播过程,可得:
根据之前的推导已知
σ
′
(
z
)
=
(
1
−
σ
(
z
)
)
⋅
σ
(
z
)
\sigma^{′}(z)=(1-\sigma(z))·\sigma(z)
σ′(z)=(1−σ(z))⋅σ(z) ,那么上式可以化简为:
可以看到sigmoid的导数被约掉,这样最后一层的梯度中就没有
σ
′
(
z
)
\sigma^{′}(z)
σ′(z)。然而这只是输出层的推导,如果变成隐藏层的梯度sigmoid的导数不会被约掉,仍然存在
σ
′
(
z
)
\sigma^{′}(z)
σ′(z)。所以交叉熵损失+Sigmoid激活函数可以解决输出层神经元学习率缓慢的问题,但是不能解决隐藏层神经元学习率缓慢的问题。
其实损失函数包含两个部分:①计算方法(均方差、交叉熵等)②激活函数。
而之前我们遇到的是均方差损失+sigmoid激活函数造成了输出层神经元学习率缓慢,其实我们破坏任意一个条件都有可能解决这个问题:
①均方误差损失→交叉熵损失;
②sigmoid函数→不会造成梯度消失的函数,例如ReLU函数,不仅能解决输出层学习率缓慢,还能解决隐藏层学习率缓慢问题。
这里也小结一下ReLU函数相对于tanh和sigmoid函数好在哪里:
第一,采用sigmoid等函数,算激活函数是(指数运算),计算量大;反向传播求误差梯度时,求导涉及除法,计算量相对大。而采用Relu激活函数,整个过程的计算量节省很多。
第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0),这种情况会造成信息丢失,梯度消失在网络层数多的时候尤其明显,从而无法完成深层网络的训练。
第三,ReLU会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。
交叉熵与最大似然
1.交叉熵函数与最大似然函数的联系和区别?
区别:交叉熵函数使用来描述模型预测值和真实值的差距大小,越大代表越不相近;似然函数的本质就是衡量在某个参数下,整体的估计和真实的情况一样的概率,越大代表越相近。
联系:交叉熵函数可以由最大似然函数在伯努利分布的条件下推导出来,或者说最小化交叉熵函数的本质就是对数似然函数的最大化。
怎么推导的呢?我们具体来看一下。
设一个随机变量
X
X
X 满足伯努利分布,
则
X
X
X 的概率密度函数为:
因为我们只有一组采样数据 D D D ,我们可以统计得到 X X X 和 1 − X 1-X 1−X 的值,但是 p p p的概率是未知的,接下来我们就用极大似然估计的方法来估计这个 p p p值。
对于采样数据 D D D ,其对数似然函数为:
可以看到上式和交叉熵函数的形式几乎相同,极大似然估计就是要求这个式子的最大值。而由于上面函数的值总是小于0,一般像神经网络等对于损失函数会用最小化的方法进行优化,所以一般会在前面加一个负号,得到交叉熵函数(或交叉熵损失函数):
这个式子揭示了交叉熵函数与极大似然估计的联系,最小化交叉熵函数的本质就是对数似然函数的最大化。
现在我们可以用求导得到极大值点的方法来求其极大似然估计,首先将对数似然函数对 p p p进行求导,并令导数为0,得到
消去分母,得:
所以:
这就是伯努利分布下最大似然估计求出的概率 p p p。