损失函数梯度对比-均方差和交叉熵

前言

我们都知道在机器学习中,希望算法或者网络收敛更快,有些是对数据预处理,尤其是Batch Normalization,有些是采用不同的激活函数,尤其是Relu激活函数取得了巨大的成功,还有一种加速收敛方法是更换损失函数。本博客就是针对均方差损失(MSE)和交叉熵损失的收敛速度做一个推导,当然少不了参考他人博客啦,但是参考归参考,重在自己推导一遍。

国际惯例,来一波地址

人工神经网络——【BP】反向传播算法证明

Kullback–Leibler divergence(相对熵,KL距离,KL散度)

交叉熵代价函数(作用及公式推导)

交叉熵代价函数

两种损失函数对比

前提条件

在三层BP神经网络(输入->隐层->输出)中,设 y y y为模型输出, o o o为真实标注,激活函数为 s i g m o i d sigmoid sigmoid(用 σ \sigma σ表示),输出层偏置为b,隐层单元值为h,隐层到输出层权重为 w w w,这样就能得到 y = σ ( w h + b ) y=\sigma(wh+b) y=σ(wh+b)

为了简便起见,只对比隐层中的一个单元与输出层之间的连接权重对于一个样本输入的更新梯度。提前关注 s i g m o i d sigmoid sigmoid函数
σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+ex1
以及 s i g m o i d sigmoid sigmoid函数的导数
σ ′ ( x ) = ∂ σ ( x ) x = σ ( x ) ( 1 − σ ( x ) ) \sigma'(x)=\frac{\partial \sigma(x)}{x}=\sigma(x)(1-\sigma(x)) σ(x)=xσ(x)=σ(x)(1σ(x))
还有 y y y对权重的导数
y ′ = ∂ y ∂ w = y ( 1 − y ) h y'=\frac{\partial y}{\partial w}=y(1-y)h y=wy=y(1y)h

均方差损失

函数表达为:
L MSE = 1 2 ∣ ∣ ( o − y ) ∣ ∣ 2 2 = 1 2 ( o − y ) 2 L_{\text{MSE}}=\frac{1}{2}||(o-y)||_2^2=\frac{1}{2}(o-y)^2 LMSE=21(oy)22=21(oy)2
权重梯度更新,更详细的推导看我前面的博客
∂ L MSE ∂ w = ( o − y ) σ ′ ( w h + b ) h \frac{\partial L_{\text{MSE}}}{\partial w}=(o-y)\sigma'(wh+b)h wLMSE=(oy)σ(wh+b)h

交叉熵损失

函数表达为:
L c r o s s − e n t r o p y ( o , y ) = − ( [ o log ⁡ y ] + ( 1 − o ) log ⁡ ( 1 − y ) ) L_{cross-entropy}(o,y)=-([o\log y]+(1-o)\log(1-y)) Lcrossentropy(o,y)=([ology]+(1o)log(1y))
【题外话】为什么不能将交叉熵内的 y , o y,o y,o互换位置呢?因为 o o o是真实标注,可能取到0值,但是 y y y s i g m o i d sigmoid sigmoid激活的值,只能无限逼近0,而不会等于0。这样 log ⁡ \log log才有意义嘛。

权重更新梯度,利用到前提条件中 y y y对权重的导数
∂ L cross-entropy ∂ w = − ( o y ⋅ y ′ − 1 − o 1 − y ⋅ y ′ ) = − [ o − y y ( 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} wLcross-entropy=(yoy1y1oy)=[y(1y)oyy]=(yo)h

对比

因为是查看的是梯度更新的步长,所以不用关心正负,对比均方差和交叉熵两种损失函数更新梯度的绝对值即可
Δ MSE = ∣ o − y ∣ ⋅ ∣ σ ′ ( w h + 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=oyσ(wh+b)hΔcross-entropy=y0h
可以发现
Δ MSE Δ cross-entropy = ∣ σ ′ ( w h + 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 − y 2 y'=y(1-y)=y-y^2 y=y(1y)=yy2求导等于0,就可以发现 y = 1 2 y=\frac{1}{2} y=21的时候斜率最大,为0.25。
谢谢评论区指正,以前博客写的是最小值。

而且,从下面的 s i g m o i d sigmoid sigmoid函数图像可以发现,对于均方差MSE损失,输出越大,梯度越小。比如当真实标注为 0 0 0的时候, y = σ ( w h + 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较远的非常小的梯度)。

这里写图片描述
本文已经同步到微信公众号中,公众号与本博客将持续同步更新运动捕捉、机器学习、深度学习、计算机视觉算法,敬请关注
在这里插入图片描述

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风翼冰舟

额~~~CSDN还能打赏了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值