这样的Softmax你真的不了解!

点击上方,选择星标置顶,每天给你送干货

阅读大概需要8分钟

跟随小博主,每天进步一丢丢

每日英文

Do not, for one repulse, forgo the purpose that you resolved to effort.

不要因一次挫败,就放弃你原来决心想达到的目的。

Recommender:云不见

作者:Sewade Ogun

翻译:王萌 澳门城市大学(深度学习自然语言处理公众号)

Softmax函数是分类模型中使用的主要函数之一。它通常在机器学习课程的早期介绍里。它以长度为d的实值向量作为输入,并将其归一化为概率分布。这很容易理解和解释,但其核心是一些需要注意的陷阱。这包括其在实践中的实现,数值稳定性和应用。这篇文章是关于该主题的专题文章。

我们将介绍以下内容:

  1. 介绍

  2. Softmax数值稳定性

  3. Log Softmax

  4. Log-Softmax推导

  5. Softmax温度机制

  6. 结论

1. 介绍

Softmax是一个非线性函数,主要用于多类分类的分类器输出。给定一个向量[x1,x2,x3,…xd],i=1,2,…d,此时softmax函数形式如下:

其中d为分类数。

所有指数值的总和,是一个归一化常数,有助于确保它保持概率分布的特性,即:a)值总和必须为1。b)它们必须介于0和1之间(含0和1)。

例如,给定一个向量x=[10,2,40,4],对每个元素的计算softmax;

  • 对向量中的每个值取幂ex=[e10,e2,e40,e4],

  • 计算总和  ∑ex=e10+e2+e40+e4=2.353…e17

  • 然后用每个exi除以计算总和sm(x)=[9.35762297e14,3.13913279e−17,1.00000000e+00,2.31952283e−16]

用像numpy这种数值计算库可以很容易地实现,

  •  问题

  • 观察输出你可以看出什么?

  • 输出总和为1吗?

这些指标是我们下次要讨论的内容吗?

2. Softmax数值稳定性

从上面的softmax概率,我们可以推断出,在数值范围很大的情况下,softmax可能会变得数值不稳定。考虑将输入向量中的第3个值更改为10000,然后重新评估softmax。

“nan”所代表的不是一个数字时就会发生溢出或下溢的。但是,为什么是 0值 和 nan?这是否暗示我们无法从向量中获得概率分布?

  • 问题:你能找出导致溢出的原因吗?

取像10000这样的大数的幂会得到一个非常非常大的数。大约是210000。这导致溢出。

  • 我们可以做得更好吗?当然,我们可以。根据我们的原始方程式,

在x处减去一个常数c

我们只是把xi平移了一个常数。如果这个移动常数c是向量的最大值,max(x),那么我们就可以稳定softmax的计算。

  • 问题:我们得到与原始softmax相同的答案吗?

这里可以证明它等同于原始的softmax函数:

产生相同的初始softmax

这个稳定的softmax用numpy实现如下所示:

如果我们将其应用于我们的旧问题:

好了,问题解决了! ! !

  • 问题:为什么softmax中所有其他值都为0。这是否意味着它们没有出现的可能性?

3. Log Softmax

对softmax计算的严格评估显示出幂和除法模式。我们可以减少这些计算吗?相反,我们可以优化log-softmax。这样做能给我们很好的特性,例如;

  1. 数值稳定性。

  2. 因为log(a/b)=log(a)−log(b),所以log softmax的梯度变得可叠加。

  3. 它有更少的除法和乘法计算,加法有更小的计算量。

  4. log也是一个单调递增的函数。我们可以免费得到这个属性。

引用一个关于使用log softmax超过softmax在 stackoverflow的回答:

“使用logsoftmax比使用softmax多很多优势,包括实际原因,如改进的数值性能和梯度优化。这些优势对于实现特别重要,特别是当训练一个模型时在计算上具有挑战性和昂贵成本的时候。使用log-softmax而不是softmax的核心是使用log概率胜于概率,这方面具有很好的信息理论解释。当用于分类器时,log-softmax会在无法预测正确的分类时严重惩罚模型。惩罚是否能很好地解决您的问题尚待您测试,因此log-softmax和softmax都值得使用。”

如果我们将对数函数简单地应用于概率分布,我们将得到:

我们回到了数值不稳定性,尤其表现为数值下溢。

  • 问题:为什么会这样?

答案在于对单个元素取对数。log(0)未定义。我们能做得更好吗?当然!

4. Log-Softmax推导

  • 如果我们想找回原来的概率怎么办?那么,我们可以对对数softmax或对数概率值取幂并归一化。

让我们通过代码对此进行具体说明。

5. Softmax温度机制

在NLP领域中,将softmax应用于分类器的输出以获取tokens的概率分布。softmax可能过于确定其预测,并且可能会使其他字词不太可能被预先采样。softmax可以非常肯定它的预测,并可以使其他单词不太可能预先采样。

例如,如果我们有这样一个语句;

The boy ___ to the market.

可能的答案有,[goes,go,went,comes]。假设我们从分类器中得到[38,20,40,39]的logit值,然后将其馈入softmax函数。

如果我们从这个分布中抽样,60%的情况下,我们的预测是“went”,但我们知道答案也可能是“goes”或“comes”,这取决于上下文。初始对数也显示单词的接近值,但softmax将其推开。最初的logit值也显示了单词的接近值,但是softmax把它们分远了。

一个温度超参数 τ 被添加到softmax以抑制这种极端。softmax就变成了

其中 τ 在 (0,inf] 范围内。温度参数增加了对低概率候选词的敏感性,必须对其调整以获得最佳结果。我们来看看τ的不同情况

情况a:τ→0时认为 τ=0.001

这将创建一个更加自信的预测,并且不太可能从不太可能的候选样本中进行采样。

情况b:τ→inf时认为 τ=100

这会在tokens上产生较平滑的概率分布,并导致采样的更多多样性。

6. 结论

softmax是一个有趣的函数,需要深入了解。我们介绍了softmax函数及其计算方法。然后,我们研究了简单的实现存在的问题以及它如何导致数值不稳定的,并提出了解决方案。另外,我们引入了log-softmax,它使数值计算和梯度计算更加容易。最后,我们讨论了带温度常数的softmax。

原文链接:

https://ogunlao.github.io/2020/04/26/you_dont_really_know_softmax.html

说个正事哈

由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:

(1)点击页面最上方深度学习自然语言处理”,进入公众号主页。

(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。

感谢支持,比心


投稿或交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。

方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。

记得备注呦

推荐两个专辑给大家:

专辑 | 李宏毅人类语言处理2020笔记

专辑 | NLP论文解读


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值