前言
我们都知道在机器学习中,希望算法或者网络收敛更快,有些是对数据预处理,尤其是Batch Normalization,有些是采用不同的**函数,尤其是Relu**函数取得了巨大的成功,还有一种加速收敛方法是更换损失函数。本博客就是针对均方差损失(MSE)和交叉熵损失的收敛速度做一个推导,当然少不了参考他人博客啦,但是参考归参考,重在自己推导一遍。
国际惯例,来一波地址
人工神经网络——【BP】反向传播算法证明
Kullback–Leibler divergence(相对熵,KL距离,KL散度)
交叉熵代价函数(作用及公式推导)
交叉熵代价函数
两种损失函数对比
前提条件
在三层BP神经网络(输入->隐层->输出)中,设y为模型输出,o为真实标注,**函数为sigmoid(用σ表示),输出层偏置为b,隐层单元值为h,隐层到输出层权重为w,这样就能得到y=σ(wh+b)
为了简便起见,只对比隐层中的一个单元与输出层之间的连接权重对于一个样本输入的更新梯度。提前关注sigmoid函数
σ(x)=11+e−x
以及
sigmoid函数的导数
σ′(x)=∂σ(x)x=σ(x)(1−σ(x))
还有
y对权重的导数
y′=∂y∂w=y(1−y)h
均方差损失
函数表达为:
LMSE=12||(o−y)||22=12(o−y)2
权重梯度更新,更详细的推导看我
前面的博客 ∂LMSE∂w=(o−y)σ′(wh+b)h
交叉熵损失
函数表达为:
Lcross−entropy(o,y)=−([ology]+(1−o)log(1−y))
【题外话】为什么不能将交叉熵内的
y,o互换位置呢?因为
o是真实标注,可能取到0值,但是
y是
sigmoid**的值,只能无限逼近0,而不会等于0。这样
log才有意义嘛。
权重更新梯度,利用到前提条件中y对权重的导数
∂Lcross-entropy∂w=−(oy⋅y′−1−o1−y⋅y′)=−[o−yy(1−y)⋅y′]=(y−o)h
对比
因为是查看的是梯度更新的步长,所以不用关心正负,对比均方差和交叉熵两种损失函数更新梯度的绝对值即可
ΔMSE=|o−y|⋅|σ′(wh+b)|⋅|h|Δcross-entropy=|y−0|⋅|h|
可以发现
ΔMSEΔcross-entropy=|σ′(wh+b)|≤0.25
【注】这个最小值0.25,就是斜率
y′的最小值,直接对
y′=y(1−y)=y−y2求导等于0,就可以发现
y=12的时候斜率最小,为0.25。
而且,从下面的sigmoid函数图像可以发现,对于均方差MSE损失,输出越大,梯度越小。比如当真实标注为0的时候,y=σ(wh+b)越大,sigmoid的值越大,但是sigmoid的梯度越小,这也就导致了Δcross-entropy的梯度大(因为没sigmoid导数这一项),但是ΔMSE的梯度小(因为乘以了sigmoid较远的非常小的梯度)。