🧠 第一章 AI入门:认识人工智能模型训练
📄 一句话概括

91 个字的语料、43 个不同字符,理论上有一千八百多种二元组合, 真正出现过的只有 65 种(3.5%)。 看前面 3 个字时上下文涨到 126 种,平均每个上下文只剩 1.1 个后继。 语言模型的全部麻烦,都藏在这两个数里。

📝 本节和前面几节的关系

上一节讲完了训练的三步循环,这一节把它套到 GPT 身上。 GPT 看着神秘,其实只做一件事:给一段话,猜下一个字。

一、GPT 只做一件事:猜下一个字

把「人工智能训练师要掌握数据标注的方法」这句话拆开,GPT 每一步做的事就是:给定前面所有字, 输出下一个字的概率分布。 「人」后面接什么?「工」的概率最高。「人工智能训练」后面接什么? 可能是「师」、可能是「的」、也可能是「模型」。它给出一个分布,然后采样一个。 采完一个,把它接到句子末尾,再猜下一个。这个循环重复几百次,就生成了一整段话。 没有「先想好整段再说」这回事,是一个字一个字往外挤的。 这也解释了为什么长文本会跑题:每一步只看概率最高的那个, 十步之后可能已经偏到一个完全不同的方向上去了。

二、概率表从哪来

最原始的做法是数:拿一堆语料,统计「每个字后面跟每个字」出现了多少次,归一化成概率。 这叫二元模型(bigram)。 Demo 里那段 91 字的语料,43 个不同字符,理论上有 43 × 43 = 1849 种组合, 实际出现过的只有 65 种——96.5% 的格子是空的。 看一个字的困惑度是 1.61,看着挺准。但那是因为在它自己身上量的,等于把这段语料背下来了。 换一段没见过的文章,一半以上的字它没见过。 想让上下文变长?看三个字:上下文从 61 种涨到 126 种,平均后继从 1.7 个掉到 1.1 个。 每多记一个字,需要的数据量翻好几倍。

三、温度:压平还是拔尖

拿到概率分布之后,怎么选下一个字?有两个极端:永远选最高的(贪心),或者完全按概率随机抽。 中间那个旋钮就是温度。 做法是把每个概率取对数、除以温度、再归一化:温度小于 1,分布被「拔尖」,高概率的更高; 温度大于 1,分布被「压平」,低概率的也有机会。 Demo 里同一张表、同一个起点, T = 0.3 生成的是「人工作决定了就要先补充新训练需要重新训练师要掌握数据标」——读不通, 因为它只挑最顺的那个字,在几个高频词之间打转。 T = 1.0 生成「人工智能训练师要持续监控数据标注是模型训练的基础」,通顺得多。 这就是「温度」这个词的全部含义,跟「热情」没关系。

四、为什么统计表不行,必须上神经网络

上面那张表有两个死结。第一,它记不住长上下文——看三个字就要126 个格子,看五个字、十个字呢? 格子数是字符表的幂次,语料永远填不满。 第二,它不会泛化。「训练师」和「训练员」在它眼里是两个毫不相干的组合。 没见过「训练员」就一个字也接不上。 神经网络解这两个死结用的是同一个办法:共享参数。 不再给每个组合单独留一个格子,而是把每个字压成一个几十到几千维的向量,用同一套矩阵去算。 这样一来,「训练师」和「训练员」的向量会挨得很近,没见过的组合也能算出个相近的答案。 而且参数总量跟「看多长的上下文」只是线性关系,不再是幂次。 代价是:你不能再问「为什么是这个字」了。 统计表能查出「因为前面出现过 37 次」, 神经网络只能给你一个数。这就是可解释性的代价,第九章会再提。

五、动手 Demo:91 个字、1849 个格子,真正填上的只有 65 个

用一段 91 字的语料做字符级统计,算二元、三元模型的上下文个数、平均后继个数和困惑度。 然后按二元表用三个不同的温度往下采样,看生成的句子怎么从「绕圈」变成「通顺」再变成「乱接」。

chars = sorted(set(text))
ix = dict((c, i) for i, c in enumerate(chars))
n = len(chars)

# 二元计数表
cnt = np.zeros((n, n))
for i in range(len(text) - 1):
    cnt[ix[text[i]], ix[text[i + 1]]] += 1.0

# 按温度采样下一个字
for T in (0.3, 1.0, 2.0):
    z = np.log(np.clip(cnt[ix[cur]] / row_sum, 1e-12, None)) / T
    z = np.exp(z - z.max())
    cur = chars[int(r.choice(n, p=z / z.sum()))]

实跑输出:

--------------------------------------------------------------------
GPT 的工作原理:下一个字猜得准,一句话就出来了
--------------------------------------------------------------------
  看前面几个字   不同上下文个数   平均后继个数   困惑度
  ----------------------------------------------------
  1 个字                     61            1.7     1.61
  2 个字                    103            1.2     1.25
  3 个字                    126            1.1     1.08

  看前面 1 个字时有 61 种上下文,看 3 个字就涨到 126 种——而且平均每个上下文只剩 1.1 个后继。
  困惑度那列从 1.61 降到 1.08,方向是「看得越多越准」。但**这个绝对数没有参考价值**——它是在这段 153 字的语料自己身上量的,模型等于把整段背下来了。真实 GPT 换成没见过的文章,困惑度是十几到几十。
  这就是语言模型的死结:**上下文每多一个字,要记的东西按字符表的幂次涨**,而语料里真正出现过的组合只有那么点。看 1 个字太笨,看 5 个字全是空格子。
  神经网络解这个死结的办法是**共享参数**:不再给每个组合单独留一个格子,而是把词压成一个几十维的向量、用同一套矩阵去算。没见过的组合也能算出个相近的答案——这叫泛化,统计表做不到。

  按二元表往下采样,温度不同出来的句子完全不同:
  T=0.3  人工作决定了就要先补充新训练需要重新训练师要掌握数据标
  T=1.0  人工智能训练师要持续监控数据标注是模型训练的基础。上线
  T=2.0  人工智能训练模型训练的变化。补充数据。标注工智能训练要

  T 小的时候它只挑最顺的那个字,一句话会绕回原地;T 大了什么都敢接,很快就读不通了。**所谓「温度」,就是这张概率表被压平还是被拔尖的程度。**
  真实的 GPT 把这张表换成了几十层 Transformer:不是看前 1 个字,是看前面几千个字;表也不是数出来的,是学出来的。但**每一步要做的事一模一样——给一个概率分布,采样出下一个字。**

三个温度生成的句子差别很大,但它们用的是同一张概率表。变的只有「怎么从表里挑」。 这一点值得多看两眼:所谓「模型风格」,有一半是采样策略给的,不是模型本身。 困惑度那列从 1.61 降到 1.08,方向对(看得越多越准), 但绝对数没有参考价值——它是在 91 个字身上量的,等于背下来了。 真实 GPT 换成没见过的文章,困惑度是十几到几十。 看前面 3 个字时上下文涨到 126 种、 平均后继只剩 1.1 个——这个 1.1 说明三元表基本退化成「一个上下文只对应一个后继」, 也就是在训练语料上过拟合了。 要说清的局限:这里的「语料」只有 91 个字,结论只能看趋势。 真实语料是万亿 token 量级,但两个死结(组合爆炸、不会泛化)性质一样。

30 秒实验

  1. 把语料复制三遍再跑,看困惑度怎么变——会明显下降,因为重复让统计更「确定」,但这不是学会了, 是背得更熟。
  2. 把温度加到 5.0 再试,生成的会接近随机字符。这时你就能直观看到「分布被压平」是什么样子。
  3. 把单位从「字」换成「词」(把语料按词切),看上下文个数怎么变。 粒度越粗,格子越少,但每格要表达的东西越多。

常见误区

  1. 「GPT 是先理解意思,再组织语言」。它没有「理解」这一步,只有「算下一个字的概率」这一步。 理解是这个过程涌现出来的效果,不是前置步骤。
  2. 「温度越高越有创造力」。温度高了确实更多样,但也更容易胡说。 创造力来自训练数据里的多样性,不是来自采样随机性。
  3. 「困惑度越低模型越好」。在自己训练集上量困惑度必然低。要看的是在没见过的文本上的困惑度。
自测三问(点开对答案) 1. 为什么二元表里有 96.5% 的格子是空的? —— 因为组合数是字符表大小的平方(43²=1849),而真实用到的组合远少于理论值。 语料越长,填上的比例越高,但永远填不满——这就是「稀疏」。 2. 温度到底改的是什么? —— 改的是「采样时每个候选被选中的相对可能性」。 做法是把概率取对数后除以 T,T 小则高概率更高(尖锐),T 大则差距被压缩(平坦)。 它不改模型本身,只改抽样方式。 3. 神经网络用「共享参数」解决了什么? —— 解决了统计表的两个死结:参数不随上下文长度指数爆炸(改成线性), 相似的词有相近的向量(能泛化到没见过的组合)。代价是失去了「为什么选这个字」的可查性。

GPT 的原理其实不复杂,那它凭什么比之前的模型强那么多?下一节算一笔账:同样的算力,钱怎么分才划算。

相关笔记