前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Softmax和Cross-entropy是什么关系?

Softmax和Cross-entropy是什么关系?

作者头像
公众号机器学习与AI生成创作
发布于 2020-09-14 09:27:02
发布于 2020-09-14 09:27:02
1.5K00
代码可运行
举报
运行总次数:0
代码可运行

来自 | 知乎 作者 | 董鑫

https://www.zhihu.com/question/294679135/answer/885285177

文仅分享,著作权归作者,侵删

softmax 虽然简单,但是其实这里面有非常的多细节值得一说。

我们挨个捋一捋。

1. 什么是 Softmax?

首先,softmax 的作用是把 一个序列,变成概率。

他能够保证:

  1. 所有的值都是 [0, 1] 之间的(因为概率必须是 [0, 1])
  2. 所有的值加起来等于 1

从概率的角度解释 softmax 的话,就是

2. 文档里面跟 Softmax 有关的坑

这里穿插一个“小坑”,很多deep learning frameworks的 文档 里面 (PyTorch,TensorFlow)是这样描述 softmax 的,

take logits and produce probabilities

很明显,这里面的 logits 就是 全连接层(经过或者不经过 activation都可以)的输出, probability 就是 softmax 的输出结果。这里 logits 有些地方还称之为 unscaled log probabilities。这个就很意思了,unscaled probability可以理解,那又为什么 全连接层直接出来结果会和 log 有关系呢?

原因有两个:

  1. 因为 全连接层 出来的结果,其实是无界的(有正有负),这个跟概率的定义不一致,但是你如果他看成 概率的 log,就可以理解了。
  2. softmax 的作用,我们都知道是 normalize probability。在 softmax 里面,输入

都是在指数上的

,所有把

想成 log of probability 也就顺理成章了。

3. Softmax 就是 Soft 版本的 ArgMax

好的,我们把话题拉回到 softmax。

softmax,顾名思义就是 soft 版本的 argmax。我们来看一下为什么?

举个栗子,假如 softmax 的输入是:

softmax 的结果是:

我们稍微改变一下输入,把 3 改大一点,变成 5,输入是

softmax 的结果是:

可见 softmax 是一种非常明显的 “马太效应”:强(大)的更强(大),弱(小)的更弱(小)。假如你要选一个最大的数出来,这个其实就是叫 hardmax。那么 softmax 呢,其实真的就是 soft 版本的 max,以一定的概率选一个最大值出来。在hardmax中,真正最大的那个数,一定是以1(100%) 的概率被选出来,其他的值根本一点机会没有。但是在 softmax 中,所有的值都有机会被作为最大值选出来。只不过,由于 softmax 的 “马太效应”,次大的数,即使跟真正最大的那个数差别非常少,在概率上跟真正最大的数相比也小了很多。

所以,前面说,“softmax 的作用是把 一个序列,变成概率。” 这个概率不是别的,而是被选为 max 的概率。

这种 soft 版本的 max 在很多地方有用的上。因为 hard 版本的 max 好是好,但是有很严重的梯度问题,求最大值这个函数本身的梯度是非常非常稀疏的(比如神经网络中的 max pooling),经过hardmax之后,只有被选中的那个变量上面才有梯度,其他都是没有梯度。这对于一些任务(比如文本生成等)来说几乎是不可接受的。所以要么用 hard max 的变种,比如Gumbel

Categorical Reparameterization with Gumbel-Softmax

链接:https://arxiv.org/abs/1611.01144

亦或是 ARSM

ARSM: Augment-REINFORCE-Swap-Merge Estimator for Gradient Backpropagation Through Categorical Variable

链接:http://proceedings.mlr.press/v97/yin19c.html

,要么就直接 softmax。

4. Softmax 的实现以及数值稳定性

softmax 的代码实现看似是比较简单的,直接套上面的公式就好

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def softmax(x):
    """Compute the softmax of vector x."""
    exps = np.exp(x)
    return exps / np.sum(exps)
代码语言:javascript
代码运行次数:0
运行
复制

但是这种方法非常的不稳定。因为这种方法要算指数,只要你的输入稍微大一点,比如:

分母上就是

很明显,在计算上一定会溢出。解决方法也比较简单,就是我们在分子分母上都乘上一个系数,减小数值大小,同时保证整体还是对的

把常数 C 吸收进指数里面

这里的D是可以随便选的,一般可以选成

具体实现可以写成这样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

def stablesoftmax(x):
    """Compute the softmax of vector x in a numerically stable way."""
    shiftx = x - np.max(x)
    exps = np.exp(shiftx)
    return exps / np.sum(exps)
代码语言:javascript
代码运行次数:0
运行
复制

这样一种实现数值稳定性已经好了很多,但是仍然会有数值稳定性的问题。比如输入的值差别过大的时候,比如

这种情况即使用了上面的方法,可能还是报 NaN 的错误。但是这个就是数学本身的问题了,大家使用的时候稍微注意下。

一种可能的替代的方案是使用 LogSoftmax (然后再求 exp),数值稳定性比 softmax 好一些。

可以看到,LogSoftmax省了一个指数计算,省了一个除法,数值上相对稳定一些。另外,其实 Softmax_Cross_Entropy 里面也是这么实现的

5. Softmax 的梯度

下面我们来看一下 softmax 的梯度问题。整个 softmax 里面的操作都是可微的,所以求梯度就非常简单了,就是基础的求导公式,这里就直接放结果了。

所以说,如果某个变量做完 softmax 之后很小,比如

,那么他的梯度也是非常小的,几乎得不到任何梯度。有些时候,这会造成梯度非常的稀疏,优化不动。

6. Softmax 和 Cross-Entropy 的关系

先说结论,

softmax 和 cross-entropy 本来太大的关系,只是把两个放在一起实现的话,算起来更快,也更数值稳定。

cross-entropy 不是机器学习独有的概念,本质上是用来衡量两个概率分布的相似性的。简单理解(只是简单理解!)就是这样,

如果有两组变量:

如果你直接求 L2 距离,两个距离就很大了,但是你对这俩做 cross entropy,那么距离就是0。所以 cross-entropy 其实是更“灵活”一些。

那么我们知道了,cross entropy 是用来衡量两个概率分布之间的距离的,softmax能把一切转换成概率分布,那么自然二者经常在一起使用。但是你只需要简单推导一下,就会发现,softmax + cross entropy 就好像

“往东走五米,再往西走十米”,

我们为什么不直接

“往西走五米”呢?

cross entropy 的公式是

这里的

就是我们前面说的 LogSoftmax。这玩意算起来比 softmax 好算,数值稳定还好一点,为啥不直接算他呢?

所以说,这有了 PyTorch 里面的 torch.nn.CrossEntropyLoss (输入是我们前面讲的 logits,也就是 全连接直接出来的东西)。这个 CrossEntropyLoss 其实就是等于 torch.nn.LogSoftmax + torch.nn.NLLLoss。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习与AI生成创作 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
softmax、softmax损失函数、cross-entropy损失函数[通俗易懂]
hardmax 就是直接选出一个最大值,例如 [1,2,3] 的 hardmax 就是 3,而且只选出最大值,非黑即白,但是实际中这种方式往往是不合理的,例如对于文本分类来说,一篇文章或多或少包含着各种主题信息,我们更期望得到文章属于各种主题的概率值,而不是简单直接地归类为某一种唯一的主题。这里就需要用到soft的概念,即不再唯一地确定某一个最大值,而是为每个输出分类的结果都赋予一个概率值,表示属于每个类别的可能性。
全栈程序员站长
2022/09/13
5.2K0
Tensorflow - Cross Entropy Loss
根据应用场景中,分类目标的独立性与互斥性, 可以选择 sigmoid 或者 softmax 来实现.
AIHGF
2018/05/17
2.5K0
深入理解与实践:Softmax函数在机器学习中的应用
今日推荐:前端小白使用Docsify+Markdown+‌Vercel,无服务器部署个人知识库原创
小说男主
2024/12/01
4890
深入理解与实践:Softmax函数在机器学习中的应用
详解Softmax函数
提到二分类首先想到的可能就是逻辑回归算法。逻辑回归算法是在各个领域中应用比较广泛的机器学习算法。逻辑回归算法本身并不难,最关键的步骤就是将线性模型输出的实数域映射到[0, 1]表示概率分布的有效实数空间,其中Sigmoid函数刚好具有这样的功能。
触摸壹缕阳光
2020/02/18
3.4K0
机器学习----交叉熵(Cross Entropy)如何做损失函数
意义:N为样本数量。公式表示为每一个真实值与预测值相减的平方去平均值。均值平方差的值越小,表明模型越好。 对于回归问题,均方差的损失函数的导数是局部单调的,可以找到最优解。但是对于分类问题,损失函数可能是坑坑洼洼的,很难找到最优解。故均方差损失函数适用于回归问题。
一枕眠秋雨
2024/04/04
14.4K0
机器学习----交叉熵(Cross Entropy)如何做损失函数
02 The TensorFlow Way(2)
MachineLP
2018/01/09
8610
02 The TensorFlow Way(2)
NLP笔记:浅谈交叉熵(cross entropy)
故事起源于我之前博客【NLP笔记:fastText模型考察】遇到的一个问题,即pytorch实现的fasttext模型收敛极慢的问题,后来我们在word2vec的demo实验中又一次遇到了这个问题,因此感觉再也不能忽视这个奇葩的问题了,于是我们单独测了一下tensorflow与pytorch的cross entropy实现,发现了如下现象:
codename_cys
2021/03/28
3.1K0
TensorFlow四种Cross Entropy算法的实现和应用
作者:陈迪豪,就职于小米,负责企业深度学习平台搭建,参与过HBase、Docker、OpenStack等开源项目,目前专注于TensorFlow和Kubernetes社区。 原文:TensorFlow四种Cross Entropy算法实现和应用,作者授权CSDN转载。 欢迎技术投稿、约稿、给文章纠错,请发送邮件至heyc@csdn.net 交叉熵介绍 交叉熵(Cross Entropy)是Loss函数的一种(也称为损失函数或代价函数),用于描述模型预测值与真实值的差距大小,常见的Loss函数就是均方
用户1737318
2018/06/06
2.6K0
Softmax,Softmax loss&Cross entropy
这张图的等号左边部分就是全连接层做的事,W是全连接层的参数,我们也称为权值,X是全连接层的输入,也就是特征。从图上可以看出特征X是N*1的向量,这是怎么得到的呢?这个特征就是由全连接层前面多个卷积层和池化层处理后得到的,假设全连接层前面连接的是一个卷积层,这个卷积层的输出是100个特征(也就是我们常说的feature map的channel为100),每个特征的大小是4*4,那么在将这些特征输入给全连接层之前会将这些特征flat成N*1的向量(这个时候N就是100*4*4=1600)。解释完X,再来看W,W是全连接层的参数,是个T*N的矩阵,这个N和X的N对应,T表示类别数,比如你是7分类,那么T就是7。我们所说的训练一个网络,对于全连接层而言就是寻找最合适的W矩阵。因此全连接层就是执行WX得到一个T*1的向量(也就是图中的logits[T*1]),这个向量里面的每个数都没有大小限制的,也就是从负无穷大到正无穷大。然后如果你是多分类问题,一般会在全连接层后面接一个softmax层,这个softmax的输入是T*1的向量,输出也是T*1的向量(也就是图中的prob[T*1],这个向量的每个值表示这个样本属于每个类的概率),只不过输出的向量的每个值的大小范围为0到1。
用户3636924
2018/12/25
7410
【TensorFlow】tf.nn.softmax_cross_entropy_with_logits的用法
在计算loss的时候,最常见的一句话就是 tf.nn.softmax_cross_entropy_with_logits ,那么它到底是怎么做的呢?
marsggbo
2018/08/10
5920
pytorch基础知识-Cross Entropy(下)
上节课介绍了Cross Entropy 与 Enropy的区别,本节介绍Cross Entropy到底在二分类问题中是如何运算的。
用户6719124
2019/11/17
1.2K0
机器学习--多标签softmax + cross-entropy交叉熵损失函数详解及反向传播中的梯度求导
https://blog.csdn.net/oBrightLamp/article/details/84069835
用户1148525
2019/07/01
3.4K0
机器学习--多标签softmax + cross-entropy交叉熵损失函数详解及反向传播中的梯度求导
深度学习笔记之为什么是SoftMax
 首先后面一层作为预测分类的输出节点,每一个节点就代表一个分类,如图所示,那么这7个节点就代表着7个分类的模型,任何一个节点的激励函数都是:
Jetpropelledsnake21
2020/02/13
1K0
TensorFlow交叉熵函数(cross_entropy)·理解
内容参考: Tensorflow四种交叉熵函数计算公式:tf.nn.cross_entropy TensorFlow四种Cross Entropy算法实现和应用
狼啸风云
2020/08/28
3.7K0
TensorFlow交叉熵函数(cross_entropy)·理解
[L4]实战语言模型~softmax与交叉熵
在介绍完了如何处理数据以及如何构造样本之后,就可以构建我们的神经网络语言模型了,下面是使用LSTM构建的语言模型的大体结构:
触摸壹缕阳光
2020/06/04
1.1K0
浅析 Softmax 与 LogSumExp
每天给你送来NLP技术干货! ---- 来自:AI算法小喵 写在前面 在神经网络中,假设网络模型的最后一层是使用 softmax 去得到一个概率分布,且损失函数使用的是 cross entropy loss (交叉熵损失),那我们就会遇到 LogSumExp(之后简称 LSE )。本文将对 LSE 的相关知识进行简要介绍。 1. 由来 假设我们有  个值的数据集 ,我们想要求  的值,应该如何计算?看上去这个问题可能比较奇怪,但实际上我们在神经网络中经常能碰到这个问题。 在神经网络中,假设我们的最后一层是使
zenRRan
2022/07/04
7340
浅析 Softmax 与 LogSumExp
离散分布重参数化 —— Gumbel-Softmax Trick 和 Gumbel分布
这篇文章从直观感觉讲起,先讲Gumbel-Softmax Trick用在哪里及如何运用,再编程感受Gumbel分布的效果,最后讨论数学证明。
为为为什么
2024/03/28
3.3K0
离散分布重参数化 —— Gumbel-Softmax Trick 和 Gumbel分布
Pytorch 的损失函数Loss function使用详解
损失函数,又叫目标函数,是编译一个神经网络模型必须的两个要素之一。另一个必不可少的要素是优化器。
狼啸风云
2020/04/22
15.4K0
Pytorch 的损失函数Loss function使用详解
[tensorflow损失函数系列]softmax_cross_entropy_with_logits
一个 Tensor ,数据维度是一维的,长度是 batch_size,数据类型都和 logits 相同。
演化计算与人工智能
2020/08/14
5190
[tensorflow损失函数系列]weighted_cross_entropy_with_logits
此函数功能以及计算方式基本与tf_nn_sigmoid_cross_entropy_with_logits差不多,但是加上了权重的功能,是计算具有权重的sigmoid交叉熵函数
演化计算与人工智能
2020/08/14
2.1K0
推荐阅读
相关推荐
softmax、softmax损失函数、cross-entropy损失函数[通俗易懂]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验