Transformer 前置知识 04:指数、对数与 softmax
模型在选下一个词的时候,会先给每个候选词打一个分数。可分数有正有负,加起来也不等于 1,没法直接当成概率用。
怎么把一组分数变成概率?答案就是 softmax。要看懂它,先要认识两个老朋友:指数和对数。
分数不是概率
输入”今天天气真 ___”,模型给每个候选词打分:
| 候选词 | 分数 |
|---|---|
| 好 | +3 |
| 不错 | +1 |
| 热 | 0 |
| 差 | −1 |
我们想要的是概率:每一个都在 0 到 1 之间,而且加起来正好等于 1。
最简单的想法:直接除以总和。 总和是
- “好”的概率:
- “差”的概率:
概率怎么能是负的?所以这个办法不行。我们需要先把所有分数都变成正数。
指数:永远是正数
这就要用到指数
指数有两个好性质:
- 永远是正数:
时是 1;是负数时,是一个小于 1 的正数 - 放大差距:分数越大,指数涨得越快,大的分数会变得更突出
softmax:先取指数,再除以总和
softmax 只有两步:
- 每个分数取
的指数 - 除以所有指数的总和
代入上面的例子:
| 候选词 | 分数 | 概率 | |
|---|---|---|---|
| 好 | +3 | 20.09 | 83% |
| 不错 | +1 | 2.72 | 11% |
| 热 | 0 | 1.00 | 4% |
| 差 | −1 | 0.37 | 1.5% |
| 总和 | 24.17 | 100% |
全都是正数,加起来正好等于 1,这就是概率。
1 | import numpy as np |
考考你:分数都加 10,概率会变吗?
答案是不变。
因为
1 | print((np.exp(scores + 10) / np.exp(scores + 10).sum()).round(3)) |
所以 softmax 只看分数之间的差距,不看绝对大小。
softmax 在 Transformer 里的位置
softmax 在 Transformer 里主要出现在两个地方:
- 注意力:一个词和其他每个词的点积分数,经过 softmax,变成注意力权重,加起来等于 1
- 输出:模型给词表里的每个词打分,经过 softmax,变成下一个词的概率
对数:指数的反操作
最后认识一下对数。对数是指数的反操作:
对数有一个和概率相关的重要性质:概率在 0 到 1 之间,取对数以后是负数,而且概率越小,对数越往负的方向走:
| 概率 |
|
|---|---|
| 1 | 0 |
| 0.5 | −0.69 |
| 0.1 | −2.30 |
| 0.01 | −4.61 |
下一课,我们就用它来衡量:模型猜得准不准。
小结
- softmax 把一组分数变成概率:全是正数,加起来等于 1
- 做法是先取指数,再除以总和
- 指数保证结果为正,还会放大分数之间的差距
- softmax 只看分数的差距:所有分数都加同一个数,概率不变
- 对数是指数的反操作;概率取对数后是负数
下一课讲概率与交叉熵:模型怎么衡量自己猜得准不准。