Transformer 前置知识 04:指数、对数与 softmax

模型在选下一个词的时候,会先给每个候选词打一个分数。可分数有正有负,加起来也不等于 1,没法直接当成概率用。

怎么把一组分数变成概率?答案就是 softmax。要看懂它,先要认识两个老朋友:指数和对数。


分数不是概率

输入”今天天气真 ___”,模型给每个候选词打分:

候选词 分数
好 +3
不错 +1
热 0
差 −1

我们想要的是概率:每一个都在 0 到 1 之间,而且加起来正好等于 1。

最简单的想法:直接除以总和。 总和是 :

  • “好”的概率:
  • “差”的概率:

概率怎么能是负的?所以这个办法不行。我们需要先把所有分数都变成正数。

指数:永远是正数

这就要用到指数 。 是一个常数,约等于 2.718。

不管 x 是正是负,e 的 x 次方永远是正数

指数有两个好性质:

  1. 永远是正数: 时是 1; 是负数时,是一个小于 1 的正数
  2. 放大差距:分数越大,指数涨得越快,大的分数会变得更突出

softmax:先取指数,再除以总和

softmax 只有两步:

  1. 每个分数取 的指数
  2. 除以所有指数的总和

代入上面的例子:

候选词 分数 分数 概率
好 +3 20.09 83%
不错 +1 2.72 11%
热 0 1.00 4%
差 −1 0.37 1.5%
总和 24.17 100%
softmax 把有正有负的分数,变成加起来等于 1 的概率

全都是正数,加起来正好等于 1,这就是概率。

1
2
3
4
5
import numpy as np

scores = np.array([3, 1, 0, -1])
probs = np.exp(scores) / np.exp(scores).sum()
print(probs.round(3)) # [0.831 0.112 0.041 0.015]

考考你:分数都加 10,概率会变吗?

答案是不变。

因为 ,每个指数都乘上了同一个数 ,除以总和的时候正好抵消。

1
2
print((np.exp(scores + 10) / np.exp(scores + 10).sum()).round(3))
# [0.831 0.112 0.041 0.015] 一模一样

所以 softmax 只看分数之间的差距,不看绝对大小。

softmax 在 Transformer 里的位置

softmax 在 Transformer 里主要出现在两个地方:

  1. 注意力:一个词和其他每个词的点积分数,经过 softmax,变成注意力权重,加起来等于 1
  2. 输出:模型给词表里的每个词打分,经过 softmax,变成下一个词的概率

对数:指数的反操作

最后认识一下对数。对数是指数的反操作:

对数有一个和概率相关的重要性质:概率在 0 到 1 之间,取对数以后是负数,而且概率越小,对数越往负的方向走:

概率
1 0
0.5 −0.69
0.1 −2.30
0.01 −4.61

下一课,我们就用它来衡量:模型猜得准不准。

小结

  1. softmax 把一组分数变成概率:全是正数,加起来等于 1
  2. 做法是先取指数,再除以总和
  3. 指数保证结果为正,还会放大分数之间的差距
  4. softmax 只看分数的差距:所有分数都加同一个数,概率不变
  5. 对数是指数的反操作;概率取对数后是负数

下一课讲概率与交叉熵:模型怎么衡量自己猜得准不准。