avatar

Catalog
为什么采用交叉熵做为逻辑回归的损失函数

为什么逻辑回归要用交叉熵作为损失函数?

当使用交叉熵作为损失函数时,对于二分类问题,求导可以消去$\sigma()$函数,对于softmax,求导可以消去exp,这样直观上对w的求导变得更加简单,当对w的求导变得简单时,梯度下降法才可以更好的work,否则会出现各种诸如梯度弥散,梯度爆炸等问题。

二分类中交叉熵做损失函数的推导:

假设$a=\sigma(z),z=wx+b$,y为真实分布。

用链式求导法

${\partial C \over \partial w}={\partial C \over \partial a}*{\partial a \over \partial w}$

${\partial C \over \partial a}={(z(y-a)*(-1)) \over 2}=a-y$

${\partial a \over \partial w}={\sigma’(z)*dz \over dw}=\sigma’(z)x$

${\partial C \over \partial w}={\partial C \over \partial a}*\sigma ‘(z)x$

如果我们将$\sigma’(z)$消去,求导就会简单很多,

而$\sigma ‘(z)=\sigma (z)(1-\sigma ‘(z)) =1-a$,

所以,带有$\sigma’(z)$的求导公式为${\partial C \over \partial w}={\partial C \over \partial a}*(1-a)x$,

去掉$\sigma’(z)$的求导公式为${\partial C \over \partial w}=(a-y)x$

令两式相等得${\partial C \over \partial a}*(1-a)x=(a-y)x$,

解得$C=-[y\ln a+(1-y)\ln (1-a)]+constant$,

这是单个训练示例对代价函数的贡献。为了得到完整的代价函数,需要对训练实例进行平均,得到

$C=-{1\over n}\sum_x[y\ln a+(1-y)\ln (1-a)]+constant$,

所以,用交叉熵做损失函数可以使得求导更加简单。

参考:

https://www.cnblogs.com/xhslovecx/p/10858646.html


softmax中交叉熵做损失函数的推导

在多分类问题中,我们经常使用交叉熵作为损失函数

$Loss=-\sum_{i}t_ilny_i$

其中,$t_i$表示真实值,$y_i$表示求出的softmax值。当预测第i个时,可以认为$t_i=1$.此时损失函数变成了:

$Loss_i=-lny_i$

接下来对Loss求导。根据定义:

$y_i={e^i\over\sum_je^j}$

${e^i\over\sumje^j}=1-{\sum{j\not=i}ej\over\sum_je^j}$

接下来开始求导:

$ \frac{\partial Loss_i}{\partial _i}=-\frac{\partial ln y_i}{\partial _i} $

$ = \frac{\partial (-ln \frac{e^i}{\sum_j e^j}) }{\partial _i} $

$ = - \frac {1}{ \frac{e^i}{\sum_j e^j}} \cdot \frac{\partial (\frac{e^i}{\sum_j e^j})}{ \partial_i} $

$ = -\frac{\sumj e^j}{e^i} \cdot \frac{\partial (1 - \frac{\sum{j \neq i} e^j}{\sum_j e^j}) } {\partial_i} $

对$i$求导,$(- \sum _ {j \neq i}e^j )$为常数

$ = -\frac{\sumj e^j}{e^i} \cdot (- \sum {j \neq i}e^j ) \cdot \frac{\partial( \frac {1} {\sum_j e^j} ) } { \partial _i} $

$=\frac { \sumj e^j \cdot \sum{j \neq i} e^j} {e^i } \cdot \frac { - e^i} { (\sum_j e^j) ^ 2} $

分数求导法则

$= -\frac { \sum_{j \neq i} e^j } { \sum_j e^j } $

$ = -(1 - \frac{ e ^ i } { \sum_j e^j } ) $

$= y_i - 1 $

上面的结果表示,我们只需要正想求出$y_i$,将结果减1就是反向更新的梯度,导数的计算是不是非常简单!

参考:

https://blog.csdn.net/bitcarmanlee/article/details/82320853

Author: realLiuSir
Link: http://yoursite.com/2020/02/24/%E4%B8%BA%E4%BB%80%E4%B9%88%E9%87%87%E7%94%A8%E4%BA%A4%E5%8F%89%E7%86%B5%E5%81%9A%E6%8D%9F%E5%A4%B1%E5%87%BD%E6%95%B0/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
    微信
  • 支付寶
    支付寶