常见的损失函数
1.均方误差损失函数(MSE)
J(θ)=∑ni=1(y(i)−y(i)′)2n J ( θ ) = ∑ i = 1 n ( y ( i ) − y ( i ) ′ ) 2 n 其中 y y 是真值,是预测值,它是 W,b,x W , b , x 的函数。
2.交叉熵损失函数(cross-entropy)
J(θ)=−1m∑mi=1y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i))),
J
(
θ
)
=
−
1
m
∑
i
=
1
m
y
(
i
)
log
(
h
θ
(
x
(
i
)
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
h
θ
(
x
(
i
)
)
)
,
首先熵是香农信息量
(log1p)
(
l
o
g
1
p
)
的期望。可以这样理解
y
y
表示真实标记的分布,则为训练后的模型的预测标记分布,交叉熵损失函数可以衡量
y
y
与的相似性。即两个分布的交叉熵越小越相似。
在上一次激活函数中我们聊到sigmoid激活函数,因为其本身的特性(饱和区),导致网络BP时会出现收敛很慢,怎么解决这个问题呢?
我们使用交叉熵损失函数代替MSE损失函数,先来回顾一下DNN反向传播的时候
δL
δ
L
:
而我们损失函数改为交叉熵之后:
此时的梯度表达式已经没有 σ′ σ ′ 了,也就是说没有sigmoid函数的导数了,所以可以避免那个问题。但是sigmoid激活函数在网络变深之后依然存在梯度弥散现象,在现在普遍用Relu激活函数取代sigmoid激活函数,Relu在网络很深的情况可以一定程度的避免梯度弥散。
3.对数似然损失函数
J(W,b,aL,y)=−∑kyklnaLk
J
(
W
,
b
,
a
L
,
y
)
=
−
∑
k
y
k
l
n
a
k
L
其中
aLk
a
k
L
表示网络的输出值,
yk
y
k
表示真值,取0或1.
对数似然损失一般用于多分类问题,在输出层加softmax激活,然后求对数似然损失。其本质就是,一组参数在一堆数据下的似然值,等于每一条数据在这组参数下的条件概率之积,而损失函数一般是每条数据的损失之和,为了把积变为和,就取了对数,再加个负号是为了让最大似然值和最小损失对应起来。
如果某一训练样本的输出为第i类。则
yi=1
y
i
=
1
,其余的
j≠i
j
≠
i
都有
yj=0
y
j
=
0
。由于每个样本只属于一个类别,所以这个对数似然函数可以简化为:
J(W,b,aL,y)=−lnaLi
J
(
W
,
b
,
a
L
,
y
)
=
−
l
n
a
i
L
可见损失函数只和真实类别对应的输出有关,这样假设真实类别是第i类,则其他不属于第i类序号对应的神经元的梯度导数直接为0。对于真实类别第i类,它的
WLi
W
i
L
对应的梯度计算为:
同样的可以得到 bLi b i L 的梯度表达式为:
可见,梯度计算也很简洁,也没有第一节说的训练速度慢的问题。举个例子,假如我们对于第2类的训练样本,通过前向算法计算的未激活输出为(1,5,3),则我们得到softmax激活后的概率输出为:(0.015,0.866,0.117)。由于我们的类别是第二类,则反向传播的梯度应该为:(0.015,0.866-1,0.117)。
参考
http://www.cnblogs.com/pinard/p/6437495.html
https://www.zhihu.com/question/27126057