softmax交叉熵损失函数及其求导

        一般情况下,在神经网络中,最后一个输出层的节点个数与分类任务的目标数相等。假设最后的节点数为N,那么对于每一个样例,神经网络可以得到一个N维的数组作为输出结果,数组中每一个维度会对应一个类别。在最理想的情况下,如果一个样本属于k,那么这个类别所对应的的输出节点的输出值应该为1,而其他节点的输出都为0,即[0,0,1,0,….0,0],这个数组也就是样本的Label,是神经网络最期望的输出结果,交叉熵就是用来判定实际的输出与期望的输出的接近程度!

Softmax回归处理

    神经网络的原始输出不是一个概率值,实质上只是输入的数值做了复杂的加权和与非线性处理之后的一个值而已,那么如何将这个输出变为概率分布?

    这就是Softmax层的作用,假设神经网络的原始输出为y1,y2,….,yn,那么经过Softmax回归处理之后的输出为: 

softmax交叉熵损失函数及其求导_第1张图片 

而单个节点的输出变成的一个概率值,经过Softmax处理后结果作为神经网络最后的输出

交叉熵的原理

交叉熵刻画的是实际输出(概率)与期望输出(概率)的距离,也就是交叉熵的值越小,两个概率分布就越接近。假设概率分布p为期望输出,概率分布q为实际输出,H(p,q)为交叉熵,则:

这里写图片描述

举个例子: 假设N=3,期望输出为p=(1,0,0),实际输出q1=(0.5,0.2,0.3),q2=(0.8,0.1,0.1),那么:

softmax交叉熵损失函数及其求导_第2张图片

除此之外,交叉熵还有另一种表达形式,还是使用上面的假设条件:

这里写图片描述

其结果为:

softmax交叉熵损失函数及其求导_第3张图片


以上的所有说明针对的都是单个样例的情况,而在实际的使用训练过程中,数据往往是组合成为一个batch来使用,所以对用的神经网络的输出应该是一个m*n的二维矩阵,其中m为batch的个数,n为分类数目,而对应的Label也是一个二维矩阵,还是拿上面的数据,组合成一个batch=2的矩阵:

softmax交叉熵损失函数及其求导_第4张图片 
所以交叉熵的结果应该是一个列向量(根据第一种方法): 
softmax交叉熵损失函数及其求导_第5张图片 
而对于一个batch,最后取平均为0.2。

在TensorFlow中实现交叉熵

在TensorFlow可以采用这种形式:

cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0))) 
  • 1

其中y_表示期望的输出,y表示实际的输出(概率值),*为矩阵元素间相乘,而不是矩阵乘。 
上述代码实现了第一种形式的交叉熵计算,需要说明的是,计算的过程其实和上面提到的公式有些区别,按照上面的步骤,平均交叉熵应该是先计算batch中每一个样本的交叉熵后取平均计算得到的,而利用tf.reduce_mean函数其实计算的是整个矩阵的平均值,这样做的结果会有差异,但是并不改变实际意义。 
除了tf.reduce_mean函数,tf.clip_by_value函数是为了限制输出的大小,为了避免log0为负无穷的情况,将输出的值限定在(1e-10, 1.0)之间,其实1.0的限制是没有意义的,因为概率怎么会超过1呢。

由于在神经网络中,交叉熵常常与Sorfmax函数组合使用,所以TensorFlow对其进行了封装,即:

cross_entropy = tf.nn.sorfmax_cross_entropy_with_logits(y_ ,y) 
  • 1

与第一个代码的区别在于,这里的y用神经网络最后一层的原始输出就好了。

求导:

 首先,我们要明确一下我们要求什么,我们要求的是我们的loss对于神经元输出(zi)的梯度,即:


      根据复合函数求导法则:

    这里为什么是aj而不是ai,这里要看一下softmax的公式了,因为softmax公式的特性,它的分母包含了所有神经元的输出,所以,对于不等于i的其他输出里面,也包含着zi,所有的a都要纳入到计算范围中,并且后面的计算可以看到需要分为i=j和i≠j两种情况求导。
下面我们一个一个推: 


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

      ①如果i=j: 

            


      ②如果i≠j:


      接下来我们只需要把上面的组合起来:


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


      看起来清爽多了,我们算得的梯度就是神经元的输出-1,是不是很神奇呢~

参考:https://blog.csdn.net/chaipp0607/article/details/73392175



你可能感兴趣的:(softmax交叉熵损失函数及其求导)