全面理解softmax与交叉熵

交叉熵的作用

  想了解softmax函数的原理以及交叉熵的配合使用,看我的这一篇博文基本足够了,其他人要么写的不够清晰,甚至有错误,要么不够全面,你可以查看我的引用链接获取更加详细的推导流程,用图表示,很良心的写法。

交叉熵最早起源于信息论,1948 年,香农提出了“信息熵”(shāng) 的概念,才解决了对信息的量化度量问题。

一条信息的信息量大小和它的不确定性有直接的关系。比如说,我们要搞清楚一件非常非常不确定的事,或是我们一无所知的事情,就需要了解大量的信息。相反,如果我们对某件事已经有了较多的了解,我们不需要太多的信息就能把它搞清楚。所以,从这个角度,我们可以认为,信息量的度量就等于不确定性的多少。

有兴趣的同学可以更多地去搜索了解关于这方面的内容。。

通过神经网络解决多分类问题时,最常用的一种方式就是在最后一层设置n个输出节点,无论在浅层神经网络还是在CNN中都是如此,比如,在AlexNet中最后的输出层有1000个节点:
这里写图片描述
而即便是ResNet取消了全连接层,也会在最后有一个1000个节点的输出层:
这里写图片描述

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

Softmax回归处理

神经网络的原始输出不是一个概率值,实质上只是输入的数值做了复杂的加权和与非线性处理之后的一个值而已,那么如何将这个输出变为概率分布?
这就是Softmax层的作用,假设神经网络的原始输出为y1,y2,….,yn,那么经过Softmax回归处理之后的输出为:
这里写图片描述
很显然的是:
这里写图片描述
而单个节点的输出变成的一个概率值,经过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),那么:

这里写图片描述

很显然,q2与p更为接近,它的交叉熵也更小。
除此之外,交叉熵还有另一种表达形式,还是使用上面的假设条件:

这里写图片描述

其结果为:

这里写图片描述

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

这里写图片描述
所以交叉熵的结果应该是一个列向量(根据第一种方法):
这里写图片描述
而对于一个batch,最后取平均为0.2。

在TensorFlow中实现交叉熵

在TensorFlow可以采用这种形式:

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

    其中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) 
     
     

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

      如果想更直观了解关于softmax函数的求导问题,可以参考一下链接,以图的形式更直观地表现了整体实现原理。

      参考链接:

      https://www.jianshu.com/p/c02a1fbffad6 (简单易懂的softmax交叉熵损失函数求导)
      https://www.jianshu.com/p/ffa51250ba2e (手打例子一步一步带你看懂softmax函数以及相关求导过程)
      https://www.cnblogs.com/lliuye/p/9549881.html (几种常见的损失函数)
      https://www.cnblogs.com/yymn/p/5634166.html (分类问题损失函数的信息论解释)
      https://blog.csdn.net/jasonzzj/article/details/52017438 (交叉熵代价函数(损失函数)及其求导推导,虽然只写了logistic回归,但softmax回归是其推广,可参照一样的方法理解)
      http://deeplearning.stanford.edu/wiki/index.php/Softmax回归 (来自Ufldl的资源,Softmax回归与logistic回归的联系)

      • 36
        点赞
      • 63
        收藏
        觉得还不错? 一键收藏
      • 12
        评论

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

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

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

      当前余额3.43前往充值 >
      需支付:10.00
      成就一亿技术人!
      领取后你会自动成为博主和红包主的粉丝 规则
      hope_wisdom
      发出的红包
      实付
      使用余额支付
      点击重新获取
      扫码支付
      钱包余额 0

      抵扣说明:

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

      余额充值