专栏首页人工智能头条Softmax和交叉熵的深度解析和Python实现

Softmax和交叉熵的深度解析和Python实现

作者 | PARAS DAHAL

译者 | zzq

出品 | 人工智能头条(公众号ID:AI_Thinker)

【导读】如果你稍微了解一点深度学习的知识或者看过深度学习的在线课程,你就一定知道最基础的多分类问题。当中,老师一定会告诉你在全连接层后面应该加上 Softmax 函数,如果正常情况下(不正常情况指的是类别超级多的时候)用交叉熵函数作为损失函数,你就一定可以得到一个让你基本满意的结果。而且,现在很多开源的深度学习框架,直接就把各种损失函数写好了(甚至在 Pytorch中 CrossEntropyLoss 已经把 Softmax函数集合进去了),你根本不用操心怎么去实现他们,但是你真的理解为什么要这么做吗?这篇小文就将告诉你:Softmax 是如何把 CNN 的输出转变成概率,以及交叉熵是如何为优化过程提供度量。为了让读者能够深入理解,我们将会用 Python 一一实现他们。

▌Softmax函数

Softmax 函数接收一个 这N维向量作为输入,然后把每一维的值转换成(0,1)之间的一个实数,它的公式如下面所示:

正如它的名字一样,Softmax 函数是一个“软”的最大值函数,它不是直接取输出的最大值那一类作为分类结果,同时也会考虑到其它相对来说较小的一类的输出。

说白了,Softmax 可以将全连接层的输出映射成一个概率的分布,我们训练的目标就是让属于第k类的样本经过 Softmax 以后,第 k 类的概率越大越好。这就使得分类问题能更好的用统计学方法去解释了。

使用 Python,我们可以这么去实现 Softmax 函数:

我们需要注意的是,在 numpy 中浮点类型是有数值上的限制的,对于float64,它的上限是

。对于指数函数来说,这个限制很容易就会被打破,如果这种情况发生了 python 便会返回 nan

为了让 Softmax 函数在数值计算层面更加稳定,避免它的输出出现 nan这种情况,一个很简单的方法就是对输入向量做一步归一化操作,仅仅需要在分子和分母上同乘一个常数 C,如下面的式子所示

理论上来说,我们可以选择任意一个值作为

,但是一般我们会选择

,通过这种方法就使得原本非常大的指数结果变成0,避免出现 nan的情况。

同样使用 Python,改进以后的 Softmax 函数可以这样写:

▌Softmax 函数的导数推倒过程

通过上文我们了解到,Softmax 函数可以将样本的输出转变成概率密度函数,由于这一很好的特性,我们就可以把它加装在神经网络的最后一层,随着迭代过程的不断深入,它最理想的输出就是样本类别的 One-hot 表示形式。进一步我们来了解一下如何去计算 Softmax 函数的梯度(虽然有了深度学习框架这些都不需要你去一步步推导,但为了将来能设计出新的层,理解反向传播的原理还是很重要的),对 Softmax 的参数求导:

根据商的求导法则,对于

其导数为

。对于我们来说

。在

中,

一直都是

,但是在

中,当且仅当

的时候,

才为

。具体的过程,我们看一下下面的步骤:

如果

如果

所以 Softmax 函数的导数如下面所示:

▌交叉熵损失函数

下面我们来看一下对模型优化真正起到作用的损失函数——交叉熵损失函数。交叉熵函数体现了模型输出的概率分布和真实样本的概率分布的相似程度。它的定义式就是这样:

在分类问题中,交叉熵函数已经大范围的代替了均方误差函数。也就是说,在输出为概率分布的情况下,就可以使用交叉熵函数作为理想与现实的度量。这也就是为什么它可以作为有 Softmax 函数激活的神经网络的损失函数。

我们来看一下,在 Python 中是如何实现交叉熵函数的:

▌交叉熵损失函数的求导过程

就像我们之前所说的,Softmax 函数和交叉熵损失函数是一对好兄弟,我们用上之前推导 Softmax 函数导数的结论,配合求导交叉熵函数的导数:

加上 Softmax 函数的导数:

y 代表标签的 One-hot 编码,因此

,并且

。因此我们就可以得到:

可以看到,这个结果真的太简单了,不得不佩服发明它的大神们!最后,我们把它转换成代码:

▌小结

需要注意的是,正如我之前提到过的,在许多开源的深度学习框架中,Softmax 函数被集成到所谓的 CrossEntropyLoss 函数中。比如 Pytorch 的说明文档,就明确地告诉读者 CrossEntropyLoss 这个损失函数是 Log-Softmax 函数和负对数似然函数(NLLoss)的组合,也就是说当你使用它的时候,没有必要再在全连接层后面加入 Softmax 函数。还有许多文章中会提到 SoftmaxLoss,其实它就是 Softmax 函数和交叉熵函数的组合,跟我们说的 CrossEntropyLoss 函数是一个意思,这点需要读者自行分辨即可。

原文链接: https://deepnotes.io/softmax-crossentropy GitHub 地址: https://github.com/parasdahal/deepnet 参考链接: The Softmax function and its derivative Bendersky, E., 2016. https://eli.thegreenplace.net/2016/the-softmax-function-and-its-derivative/ CS231n Convolutional Neural Networks for Visual Recognition Andrej Karpathy, A.K., 2016. http://cs231n.github.io/convolutional-networks/

本文分享自微信公众号 - 人工智能头条(AI_Thinker)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-07-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 知识体系解决迷茫的你

    最近在星球里群里都有小伙伴说道自己对未来的路比较迷茫,一旦闲下来就不知道自己改干啥,今天我这篇文章就是让你觉得一天给你 25 个小时你都不够用,觉得睡觉都是浪费...

    桃翁
  • 【系统设置】CentOS 修改机器名

    ken.io
  • 复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

    从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负...

    haifeiWu
  • 白底黑字or黑底白字,眼睛更喜欢哪一个?

    腾讯大讲堂
  • 中国互联网协会发布:《2018中国互联网发展报告》

    在2018中国互联网大会闭幕论坛上,中国互联网协会正式发布《中国互联网发展报告2018》(以下简称《报告》)。《中国互联网发展报告》是由中国互联网协会与中国互联...

    钱塘数据
  • 理工男图解零维到十维空间,烧脑已过度,受不了啦!

    让我们从一个点开始,和我们几何意义上的点一样,它没有大小、没有维度。它只是被想象出来的、作为标志一个位置的点。它什么也没有,空间、时间通通不存在,这就是零维度。

    钱塘数据
  • ISUX Xcube智能一键生成H5

    腾讯ISUX
  • 不只是软件,在线也可以免费下载百度文库了。

    不管是学生,还是职场员工,下载各种文档几乎是不可避免的,各种XXX.docx,XXX.pptx更是家常便饭,人们最常用的就是百度文库,豆丁文库,道客巴巴这些下载...

    课代表
  • 考研英语-1-导学

    英二图表作文要重视。总体而言,英语一会比英语二难点。不过就写作而言,英语二会比英语一有难度,毕竟图表作文并不好写。

    用户1335799
  • SQL中GROUP BY用法示例

    GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用Excel比较多的话,GROUP BY比较类...

    Awesome_Tang

扫码关注云+社区

领取腾讯云代金券