这样的Softmax你真的不了解!

2020 年 7 月 23 日 深度学习自然语言处理

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

阅读大概需要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论文解读





登录查看更多
3

相关内容

【干货书】用Python构建概率图模型,173页pdf
专知会员服务
112+阅读 · 2020年8月23日
《常微分方程》笔记,419页pdf
专知会员服务
74+阅读 · 2020年8月2日
【经典书】概率统计导论第五版,730页pdf
专知会员服务
246+阅读 · 2020年7月28日
《深度学习》圣经花书的数学推导、原理与Python代码实现
Transformer文本分类代码
专知会员服务
117+阅读 · 2020年2月3日
模型压缩究竟在做什么?我们真的需要模型压缩么?
专知会员服务
28+阅读 · 2020年1月16日
你真的懂对抗样本吗?一文重新思考对抗样本背后的含义
GAN生成式对抗网络
6+阅读 · 2019年9月16日
从最优化的角度看待 Softmax 损失函数
极市平台
31+阅读 · 2019年2月21日
干货 | 深入理解深度学习中的激活函数
计算机视觉life
16+阅读 · 2019年1月29日
异常检测的阈值,你怎么选?给你整理好了...
机器学习算法与Python学习
10+阅读 · 2018年9月19日
BAT机器学习面试题1000题(331~335题)
七月在线实验室
12+阅读 · 2018年8月13日
理解神经网络的激活函数
论智
7+阅读 · 2018年1月8日
机器学习(18)之支持向量机原理(三)线性不可分支持向量机与核函数
机器学习算法与Python学习
3+阅读 · 2017年9月23日
干货 | 深度学习之损失函数与激活函数的选择
机器学习算法与Python学习
15+阅读 · 2017年9月18日
Logistic回归第二弹——Softmax Regression
机器学习深度学习实战原创交流
9+阅读 · 2015年10月29日
Arxiv
3+阅读 · 2019年3月15日
A General and Adaptive Robust Loss Function
Arxiv
8+阅读 · 2018年11月5日
Arxiv
27+阅读 · 2017年12月6日
Arxiv
6+阅读 · 2017年12月2日
Arxiv
3+阅读 · 2017年7月6日
VIP会员
相关VIP内容
【干货书】用Python构建概率图模型,173页pdf
专知会员服务
112+阅读 · 2020年8月23日
《常微分方程》笔记,419页pdf
专知会员服务
74+阅读 · 2020年8月2日
【经典书】概率统计导论第五版,730页pdf
专知会员服务
246+阅读 · 2020年7月28日
《深度学习》圣经花书的数学推导、原理与Python代码实现
Transformer文本分类代码
专知会员服务
117+阅读 · 2020年2月3日
模型压缩究竟在做什么?我们真的需要模型压缩么?
专知会员服务
28+阅读 · 2020年1月16日
相关资讯
你真的懂对抗样本吗?一文重新思考对抗样本背后的含义
GAN生成式对抗网络
6+阅读 · 2019年9月16日
从最优化的角度看待 Softmax 损失函数
极市平台
31+阅读 · 2019年2月21日
干货 | 深入理解深度学习中的激活函数
计算机视觉life
16+阅读 · 2019年1月29日
异常检测的阈值,你怎么选?给你整理好了...
机器学习算法与Python学习
10+阅读 · 2018年9月19日
BAT机器学习面试题1000题(331~335题)
七月在线实验室
12+阅读 · 2018年8月13日
理解神经网络的激活函数
论智
7+阅读 · 2018年1月8日
机器学习(18)之支持向量机原理(三)线性不可分支持向量机与核函数
机器学习算法与Python学习
3+阅读 · 2017年9月23日
干货 | 深度学习之损失函数与激活函数的选择
机器学习算法与Python学习
15+阅读 · 2017年9月18日
Logistic回归第二弹——Softmax Regression
机器学习深度学习实战原创交流
9+阅读 · 2015年10月29日
Top
微信扫码咨询专知VIP会员