每日英文
Do not, for one repulse, forgo the purpose that you resolved to effort.
不要因一次挫败,就放弃你原来决心想达到的目的。
Recommender:云不见
Softmax函数是分类模型中使用的主要函数之一。它通常在机器学习课程的早期介绍里。它以长度为d的实值向量作为输入,并将其归一化为概率分布。这很容易理解和解释,但其核心是一些需要注意的陷阱。这包括其在实践中的实现,数值稳定性和应用。这篇文章是关于该主题的专题文章。
我们将介绍以下内容:
- 介绍
- Softmax数值稳定性
- Log Softmax
- Log-Softmax推导
- Softmax温度机制
- 结论
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.35762297e−14,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。这样做能给我们很好的特性,例如;
- 数值稳定性。
- 因为log(a/b)=log(a)−log(b),所以log softmax的梯度变得可叠加。
- 它有更少的除法和乘法计算,加法有更小的计算量。
- 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