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