0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Softmax如何把CNN的输出转变成概率?交叉熵如何为优化过程提供度量?

8g3K_AI_Thinker 来源:未知 作者:易水寒 2018-07-29 11:21 次阅读

如果你稍微了解一点深度学习的知识或者看过深度学习的在线课程,你就一定知道最基础的多分类问题。当中,老师一定会告诉你在全连接层后面应该加上 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 函数是一个意思,这点需要读者自行分辨即可。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • python
    +关注

    关注

    56

    文章

    4811

    浏览量

    85102
  • 深度学习
    +关注

    关注

    73

    文章

    5521

    浏览量

    121661
  • cnn
    cnn
    +关注

    关注

    3

    文章

    353

    浏览量

    22367

原文标题:Softmax和交叉熵的深度解析和Python实现

文章出处:【微信号:AI_Thinker,微信公众号:人工智能头条】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如果将正脉冲方波转变成正负脉冲?

    请教,如果将正脉冲方波转变成正负脉冲?非常感谢!
    发表于 07-14 16:15

    在Quartus II中能否电路图输入转变成Verilog语句

    各位大侠请教一下:在Quartus II中能否电路图输入转变成Verilog语句?
    发表于 11-27 08:45

    代码:利用STM32将一串ASCII码转变成周期固定占空比不同PWM波

    本帖最后由 1563661808 于 2014-4-8 13:46 编辑 能不能利用STM32将一串ASCII码转变成周期固定,占空比不一样的PWM波?跪求代码{:4:}
    发表于 03-17 17:14

    TF之CNNCNN实现mnist数据集预测

    TF之CNNCNN实现mnist数据集预测 96%采用placeholder用法+2层C及其max_pool法+隐藏层dropout法+输出softmax法+目标函数cross_e
    发表于 12-19 17:02

    什么是交叉

    2018-04-22 开胃学习数学系列 - 交叉
    发表于 03-21 11:08

    交叉的作用原理

    交叉作为损失函数在神经网络中的作用和几种常用的交叉损失函数
    发表于 06-03 09:10

    如何将开关的开/断状态转变成Arduino能够读取的高/低电平

    如何将开关的开/断状态转变成Arduino能够读取的高/低电平。解决的办法是通过上 /下拉电阻,按照电路的不同通常又可以分为正逻辑(Positive Logic)和负逻辑(Inverted Logic)两种...
    发表于 01-17 08:35

    介绍一种解决overconfidence简洁但有效的方法

    Logit归一化(LogitNorm)来缓解——交叉损失的一个简单修复——通过在训练中对Logit执行恒定向量范数。我们的方法的动机是分析logit的规范在训练过程中不断增加,导致过度自信的
    发表于 08-24 15:11

    模拟输入信号转变成数字比特流的过程

    输入信号转变成数字比特流的过程。当客户在Σ-Δ调制器中绘制量化噪声的频谱时,将看到频率越高时量化噪声越密集。这是Σ-Δ ADC为众人所知的臭名昭著的噪声整形。为了降低量化噪声,客户将调制器输出馈至低通滤波器。…
    发表于 11-16 07:43

    光纤传输是电信号转变成光信号传输的吗?

    光纤传输是电信号转变成光信号传输的吗?
    发表于 05-16 17:32

    自己写的c代码怎么转变成sigmastudio识别的图像语言?

    我自己写的c代码怎么转变成sigmastudio识别的图像语言
    发表于 11-30 08:01

    基于直觉模糊的证据冲突度量方法

    针对证据理论中证据冲突度量这一关键问题,提出了一种基于模糊的冲突度量方法,首先引入直觉模糊表示证据间的差异性,然后对传统的冲突系数进行了修正,使其能够反映由于
    发表于 11-14 15:30 0次下载

    基于邻域信息度量数值属性快速约简算法

    阐述邻域粗糙集和邻域信息的基本定义及性质,为避免数值属性信息系统属性约简过程中,属性离散化造成特征信息的丢失,提出一种新的基于邻域信息度量数值属性约简算法。扩展邻域信息系统核属性集
    发表于 12-05 17:19 0次下载

    lm317能把不稳定的输出电压转变成稳定的电压吗?

    lm317能把不稳定的输出电压转变成稳定的电压吗? 是的,LM317能够将不稳定的输出电压转变成稳定的电压。LM317是一种可变正电压调节器,可以根据需要
    的头像 发表于 10-26 15:57 835次阅读

    RNN的损失函数与优化算法解析

    函数有以下几种: 交叉损失函数 :交叉(Cross Entropy)是一种评估两个概率分布之间差异的
    的头像 发表于 11-15 10:16 684次阅读