每天给你送来NLP技术干货!
来自:AI算法小喵
写在前面
在神经网络中,假设网络模型的最后一层是使用 softmax 去得到一个概率分布,且损失函数使用的是 cross entropy loss (交叉熵损失),那我们就会遇到 LogSumExp(之后简称 LSE )。本文将对 LSE 的相关知识进行简要介绍。
1. 由来
假设我们有 个值的数据集 ,我们想要求 的值,应该如何计算?看上去这个问题可能比较奇怪,但实际上我们在神经网络中经常能碰到这个问题。
在神经网络中,假设我们的最后一层是使用 softmax 去得到一个概率分布,其中 softmax 的形式为:
这里的 是其中的一个值。最终 loss函数 如果使用 cross entropy,那么就涉及到需要对该式求 log,也就是
等式中减号后面的部分,也就是我们上面所要求的 ,即 LogSumExp(LSE)。
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