浅析 Softmax 与 LogSumExp

2022-07-04 14:20:27 浏览数 (1)

每天给你送来NLP技术干货!


来自:AI算法小喵

写在前面

在神经网络中,假设网络模型的最后一层是使用 softmax 去得到一个概率分布,且损失函数使用的是 cross entropy loss (交叉熵损失),那我们就会遇到 LogSumExp(之后简称 LSE )。本文将对 LSE 的相关知识进行简要介绍。

1. 由来

假设我们有  个值的数据集 ,我们想要求  的值,应该如何计算?看上去这个问题可能比较奇怪,但实际上我们在神经网络中经常能碰到这个问题。

在神经网络中,假设我们的最后一层是使用 softmax 去得到一个概率分布,其中 softmax 的形式为:

这里的  是其中的一个值。最终 loss函数 如果使用 cross entropy,那么就涉及到需要对该式求 log,也就是

等式中减号后面的部分,也就是我们上面所要求的  ,即 LogSumExpLSE)。

2. 特点

我们想要通过 softmax 获得概率分布。假设我们目前有两个数据集:其中一个数据集为 ,另一个数据集为  。

两组数据在理论上应得到的概率分布都应该是 。但实际上如果我们直接按照  去计算时会有:

代码语言:javascript复制
>>> import math
>>> math.e**1000
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: (34, 'Result too large')
>>> math.e**-1000
0.0

可以发现,对于指数部分,一个计算不出来,另一个结果0,很明显这些结果都是有问题的,LSE 也没法计算。

在 64-bit 系统中,因为 下溢(underflow) 和 上溢(overflow) 的存在,我们没有办法精确计算这些值的结果。那么我们就需要别的方法来解决这个问题,这时候我们就需要对该式进行分析。

由于在 softmax 的时候是针对指数进行操作的,值一定会很大,但是之后在计算 cross-entropy 的时候由于 log 的存在导致值又回到正常范围。因此我们考虑如何去重写这个正常范围内的值。也就是如何去近似LSE

2. 近似

根据指数函数的性质可以得到:

对于log函数而言,

所以我们可以将LSE重写为:

将这个带入到 cross-entropy 里,那么

此时,对于数据集  来说,LSE就变成可计算的:

在实际应用中,往往会取  ,这样可以保证取指数时的最大值为0。起码不会因为 上溢 而报错,即使其余的 下溢 ,也可以得到一个合理的值。

3. 性质

LSE 函数是 凸函数,且在域内严格单调递增,但是其并非处处严格凸(摘自维基百科[1])。严格凸的LSE应该是:

首先,如果我们使用线性近似[2] 的方法即  ,那么对于  来说,令  ,可得:

因此有:

那么有:

在维基百科中,该式直接  了。但是由于不清楚这样写的原因,因此在此无法详细描述。

由于 ,且对于正数来说  ,因此有:

因此可以说  。换句话说,它实际上是针对 max函数 的一种平滑操作。从字面上理解来说,LSE 函数才是真正意义上的 softmax 函数;而我们在神经网络里所说的 softmax 函数其实是近似于 argmax 函数的,也就是我们平时所用的 softmax 应该叫做 softargmax

参考资料

[1]

维基百科: https://link.zhihu.com/?target=https://en.wikipedia.org/wiki/LogSumExp

[2]

线性近似: https://link.zhihu.com/?target=https://en.wikipedia.org/wiki/Linear_approximation

来源:https://zhuanlan.zhihu.com/p/153535799 作者:Hurry Z


0 人点赞