AI对话助手已经走进日常生活,很多人好奇它们怎么“知道”该写什么。其实没有魔法:每个回答背后都是大量计算,核心思想正是高中和大学低年级学过的内容——条件概率、指数函数、对数和科学记数法。本文借这个话题复习这四个工具,例子中的数字都是为了说明而假设的。

核心思想:预测下一个词

语言模型接收一段文字,回答一个具体问题:词表中每个词成为下一个词的概率是多少?在“天空是”之后,“蓝色的”或“阴沉的”概率应该很高,而“螺丝刀”几乎为零。

用数学语言说,这是条件概率 P(w上下文)P(w \mid \text{上下文})。要成为合法的概率分布,每个值都在0到1之间,且所有词的概率之和恰好为1。

Softmax:把任意分数变成概率

模型内部为每个词给出一个分数,可以是任意实数,可能为负,也可能大于1。用softmax把分数变成概率:

P(wi)=ezijezjP(w_i)=\frac{e^{z_i}}{\sum_{j} e^{z_j}}
Softmax:指数使所有值为正,除以总和使总和为1。

关键在于指数函数exe^{x} 恒为正,所以概率不会为负;它是增函数,所以分数高的词概率仍然更高;它还会放大差距:分数只高1,数值就约是原来的2.718倍,因为 ez+1/ez=ee^{z+1}/e^{z}=e

−2−101230510152025分数e^xe^x
指数函数始终为正且单调递增:分数每增加1,数值约乘以2.718。所以顺序保持不变,差距被放大。

例题:三个候选词

假设在“天空是”之后只有三个候选词:“蓝色的”分数为2,“阴沉的”分数为1,“螺丝刀”分数为0。

逐步计算softmax
  1. e27.389,e12.718,e0=1\displaystyle e^{2}\approx 7.389,\quad e^{1}\approx 2.718,\quad e^{0}=1 对每个分数取指数,取 e ≈ 2.718。
  2. 7.389+2.718+1=11.107\displaystyle 7.389+2.718+1=11.107 把三个值相加,得到分母。
  3. e2e2+e1+e07.38911.1070.665\displaystyle \frac{e^{2}}{e^{2}+e^{1}+e^{0}}\approx\frac{7.389}{11.107}\approx 0.665 用每个指数值除以总和。对于“蓝色的”:
  4. 2.71811.1070.245,111.1070.090\displaystyle \frac{2.718}{11.107}\approx 0.245,\qquad \frac{1}{11.107}\approx 0.090 对另外两个词做同样的计算。
  5. 0.665+0.245+0.090=1.000\displaystyle 0.665+0.245+0.090=1.000 验证:三个概率之和应为1(细微差别来自四舍五入)。

结果:“蓝色的”约66.5%,“阴沉的”约24.5%,“螺丝刀”约9%。分数为0并不意味着概率为0,因为 e0=1e^{0}=1

66.5%蓝色的24.5%阴沉的9%螺丝刀
分数2、1、0经过softmax:“蓝色的”约66.5%,“阴沉的”约24.5%,“螺丝刀”约9%。没有一根柱子降到0。

整句话的概率

生成一句话就是逐词重复这个过程。根据概率的链式法则,整个序列的概率等于每一步条件概率的乘积:

P(w1,w2,,wn)=P(w1)P(w2w1)P(wnw1,,wn1)P(w_1,w_2,\dots,w_n)=P(w_1)\cdot P(w_2\mid w_1)\cdots P(w_n\mid w_1,\dots,w_{n-1})
链式法则:每个因子都依赖于前面所有的词。

假设一句四个词的话,每一步的概率分别为0.5、0.4、0.2和0.1,则整句概率为 0.50.40.20.1=0.0040.5 \cdot 0.4 \cdot 0.2 \cdot 0.1 = 0.004,即0.4%。如果回答有50个词、每步概率都是0.1,乘积就是 0.150=10500.1^{50}=10^{-50},小到计算机可能直接舍入为0(称为下溢)。

0123400.20.40.60.81词数概率累计概率
整句的累计概率:从1开始,依次乘以0.5、0.4、0.2、0.1,变为0.5、0.2、0.04、0.004。仅四个词,乘积就急剧下降。

为什么要用对数

办法是使用对数概率,依据 log(ab)=loga+logb\log(a\cdot b)=\log a+\log b。对链式法则取对数,乘积就变成了和:

logP(w1,,wn)=k=1nlogP(wkw1,,wk1)\log P(w_1,\dots,w_n)=\sum_{k=1}^{n}\log P(w_k\mid w_1,\dots,w_{k-1})
句子的对数概率:每一步对数概率之和。
用四个词的例子验证(以10为底)
  1. lg0.50.301, lg0.40.398, lg0.20.699, lg0.1=1\displaystyle \lg 0.5\approx -0.301,\ \lg 0.4\approx -0.398,\ \lg 0.2\approx -0.699,\ \lg 0.1=-1 对每个因子取对数。
  2. 0.3010.3980.6991=2.398\displaystyle -0.301-0.398-0.699-1=-2.398 相加。
  3. 102.3980.004\displaystyle 10^{-2.398}\approx 0.004 取10的幂还原,并与直接相乘的结果比较。

两种方法都得到0.004。50个词的情况下,只需存储 50-50 而不是 105010^{-50}。由于对数是增函数,对数概率最大的句子也就是概率最大的句子。

数量级与科学记数法

描述模型规模时常说“数十亿个参数”。用科学记数法来读:十亿是 10910^{9},一万亿是 101210^{12}。如果假设的模型A有 10910^{9} 个参数,模型B有 101110^{11} 个,那么B大两个数量级,即大100倍,而不是“大2倍”。

常见错误

  • 以为softmax只是除以总和。 没有指数,负分数会得到负的“概率”。
  • 把连续步骤的概率相加。 先后发生的事件应相乘。
  • 忘记对数概率是负数。 越接近0越可能。
  • 混淆数量级。10910^{9}101210^{12} 是1000倍,而不是3倍。
  • 把高概率当成必然。 66.5%仍然给其他词留下33.5%。

常见问题

softmax的结果总在0和1之间吗?

是的。每一项为正,并除以包含它自身的总和,所以在多个词时严格介于0和1之间,且总和为1。

为什么用 e 作底数?

任何大于1的底数都可以。选 e 是因为它的导数等于自身,训练计算更简单。

取对数会改变哪句话最可能吗?

不会。对数是增函数,保持大小顺序。

需要学过微积分才能看懂吗?

本文内容不需要。条件概率以及指数和对数的运算性质就足够了。