0%

softmax

softmax交叉熵损失函数求导

softmax经常被添加在分类任务的神经网络的输出层中,神经网络的反向传播中关键的步骤就是求导。

softmax函数:

一般在神经网络中,softmax可以作为分类任务的输出层。其实可以认为softmax输出的是几个类别选择的概率,比如我有一个分类任务,要分为三个类,softmax函数可以根据他们的相对大小,输出三个类别选取的概率,并且概率和为1。

公式:Si=ezikezkS_{i}=\frac{e^{z_{i}}}{\sum_{k} e^{z_{k}}}

SiS_{}i 代表的是第i个神经元的输出,其实就是在输出后面套一个这个函数

首先是一个神经元的输出,一个神经元如下图:

1565146619562

神经元的输出设为:zi=jwijxij+bz_{i}=\sum_{j} w_{i j} x_{i j}+b

其中 wijw_{ij} 是第i个神经元的第j个权重,b是偏移值, ziz_{i} 表示该网络的第i个输出

给这个输出加上一个softmax函数,就是ai=ezikezka_{i}=\frac{e^{z_{i}}}{\sum_{k} e^{z_{k}}}

其中 aia_{i} 代表softmax的第i个输出值,右侧就是套用了softmax函数

损失函数 loss function

在神经网络反向传播中,要求一个损失函数,这个损失函数其实表示的是真实值与网络的估计值的误差,知道误差了,才能知道怎样去修改网络中的权重。

损失函数可以有很多形式,这里使用的是交叉熵函数,主要是由于这个求导结果比较简单,易于计算,并且交叉熵解决某些损失函数学习缓慢的问题。交叉熵的函数是这样的:C=iyilnaiC=-\sum_{i} y_{i} \ln a_{i}

其中 yiy_{i} 表示真实的分类结果。

推导过程:

首先,我们要明确一下我们要求什么,我们要求的是我们的loss对于神经元输出( $ z_{i}$ )的梯度,即:Czi\frac{\partial C}{\partial z_{i}}

根据复合函数求导法则:Czi=j(Cjajajzi)\frac{\partial C}{\partial z_{i}}=\sum_{j}\left(\frac{\partial C_{j}}{\partial a_{j}} \frac{\partial a_{j}}{\partial z_{i}}\right)

这里为什么是 aja_{j} 而不是 aia_{i} ,这里要看一下softmax的公式了,因为softmax公式的特性,它的分母包含了所有神经元的输出,所以,对于不等于i的其他输出里面,也包含着 ziz_{i},所有的a都要纳入到计算范围中,并且后面的计算可以看到需要分为 i=ji = jiji \not= j 两种情况求导。

下面我们一个一个推:

Cjaj=(yjlnaj)aj=yj1aj\frac{\partial C_{j}}{\partial a_{j}}=\frac{\partial\left(-y_{j} \ln a_{j}\right)}{\partial a_{j}}=-y_{j} \frac{1}{a_{j}}

第二个稍微复杂一点,我们先把他分为两种情况:

  1. 如果 i=ji = j :

    aizi=(ezikezk)zi=kezkezi(ezi)2(kezk)2=(ezikezk)(1ezikezk)=ai(1ai)\frac{\partial a_{i}}{\partial z_{i}}=\frac{\partial\left(\frac{e^{z_{i}}}{\sum_{k} e^{z_{k}}}\right)}{\partial z_{i}}=\frac{\sum_{k} e^{z_{k}} e^{z_{i}}-\left(e^{z_{i}}\right)^{2}}{\left(\sum_{k} e^{z_{k}}\right)^{2}}=\left(\frac{e^{z_{i}}}{\sum_{k} e^{z_{k}}}\right)\left(1-\frac{e^{z_{i}}}{\sum_{k} e^{z_{k}}}\right)=a_{i}\left(1-a_{i}\right)

  2. 如果 iji \not= j :

    ajzi=(ezjkezk)zi=ezj(1kezk)2ezi=aiaj\frac{\partial a_{j}}{\partial z_{i}}=\frac{\partial\left(\frac{e^{z_{j}}}{\sum_{k} e^{z_{k}}}\right)}{\partial z_{i}}=-e^{z_{j}}\left(\frac{1}{\sum_{k} e^{z_{k}}}\right)^{2} e^{z_{i}}=-a_{i} a_{j}

接下来,只需要组合两个式子:

Czi=j(Cjajajzi)=j=ψ˙(Cjajajzi)+i=j(Cjajajzi)\frac{\partial C}{\partial z_{i}}=\sum_{j}\left(\frac{\partial C_{j}}{\partial a_{j}} \frac{\partial a_{j}}{\partial z_{i}}\right)=\sum_{j=\dot{\psi}}\left(\frac{\partial C_{j}}{\partial a_{j}} \frac{\partial a_{j}}{\partial z_{i}}\right)+\sum_{i=j}\left(\frac{\partial C_{j}}{\partial a_{j}} \frac{\partial a_{j}}{\partial z_{i}}\right)

=j=y˙yj1aj(aiaj)+(yi1ai)(ai(1ai))=\sum_{j=\dot{y}}-y_{j} \frac{1}{a_{j}}\left(-a_{i} a_{j}\right)+\left(-y_{i} \frac{1}{a_{i}}\right)\left(a_{i}\left(1-a_{i}\right)\right)

=j=iaiyj+(yi(1ai))=\sum_{j=i} a_{i} y_{j}+\left(-y_{i}\left(1-a_{i}\right)\right)

=j=ψ˙aiyj+aiyiyi=\sum_{j=\dot{\psi}} a_{i} y_{j}+a_{i} y_{i}-y_{i}

=aijyjyi=a_{i} \sum_{j} y_{j}-y_{i}

最后的结果看起来简单了很多,最后,针对分类问题,我们给定的结果 yiy_{i} 最终只会哟一个类别是1,其他类别都是0,因此对于分类问题,这个梯度等于:

Czi=aiyi\frac{\partial C}{\partial z_{i}}=a_{i}-y_{i}