📍 你在这里 AI 基础 · 第 13 篇 / 共 13 篇
← 上一篇 精读 So-Large-LM:大模型到底从哪一步开始变得不一样 · 下一篇 → 检索增强生成 RAG
本文性质:开源教程精读与导读,非原文转载。内容基于 Datawhale 社区开源教程整理,属于个人学习笔记。
原文来源:《大模型基础》第 1 章 引言 — Datawhale 社区(so-large-lm 仓库)
许可证:MIT | 原文版权归原作者及 Datawhale 社区所有
上一篇精读(一)讲到第一章时,我把 1.2.1 那一节绕了过去。这里补上它,因为整本教程其实是从这一节出发的。香农七十多年前写下的那个求和式,今天换了个身份,成了「语言模型究竟在干什么」的标准答案。这一节先把式子算一遍,再看它怎么一路连到压缩和通信。
把公式算一遍
信息熵的定义只有一行。
$$H(p) = \sum_x p(x) \log_2 \frac{1}{p(x)}$$
读法很朴素。每种情况拿它的概率,乘上它带来的意外程度,最后把乘积加起来。其中 $\log_2 \frac{1}{p(x)}$ 就是意外程度,概率越小的事情越叫人意外,这个值就越大;常见的事情 $\frac{1}{p(x)}$ 接近 1,对数算下来接近 0。
拿三枚硬币各算一遍,式子就落地了。
第一枚是正常硬币。 正反各占 0.5。正面的意外程度是 $\log_2 \frac{1}{0.5} = 1$,乘上概率得 0.5;反面同样得 0.5。两者相加,$H(p) = 1$ 比特。1 比特是这类问题的上限,此时结果最难猜。
第二枚做过手脚。 正面 0.9,反面 0.1。正面太常见,意外程度只有 $\log_2 \frac{1}{0.9} \approx 0.152$,乘 0.9 得 0.1368。反面罕见得多,$\log_2 10 \approx 3.322$,乘 0.1 得 0.3322。加起来是 0.469 比特。罕见的那面单看信息量极大,可它很少出现,权重把它拉了回来。
第三枚两面都是正面。 正面概率 1,$\log_2 1 = 0$,贡献为 0。反面概率是 0,数学上约定 $0 \times \log \frac{1}{0}$ 的极限取 0,它对总和没有贡献。整枚硬币的熵是 0 比特,因为压根没有悬念。
| 硬币 | 正面概率 | 反面概率 | 正面贡献 | 反面贡献 | 熵 |
|---|---|---|---|---|---|
| 正常 | 0.5 | 0.5 | 0.5 | 0.5 | 1.0 |
| 做过手脚 | 0.9 | 0.1 | 0.1368 | 0.3322 | 0.469 |
| 两面都是正面 | 1 | 0 | 0 | 0 | 0 |
三行数字摆在一起,公式的性格就露出来了。大概率的事情权重高,可它没什么意外;小概率的事情意外极大,可它很少发生。两股劲互相抵消,最后的乘积和衡量的是平均意义上的混乱程度。
熵说的是「要花多少位」
把上式里的对数单独拎出来看,它的意思相当具体。$\log \frac{1}{p(x)}$ 就是给概率为 $p(x)$ 的事件编一个码,需要多少个 0 和 1。
原文给的例子很直接。当 $p(x) = 1/8$,$\log_2 8 = 3$,要分配 3 个比特;同一个量换成自然对数是 2.08 个自然单位,单位不同,说的是同一件事。
顺着这个读法,「the mouse ate the cheese」被编成「0001110101」也就不奇怪了。句子越有规律,编起来越省。英语里 "the" 后面常跟着什么、"ate" 后面常跟着什么,都有很强的偏好,所以这段文字的熵远低于一串乱码。原文那句结论可以照抄,熵越小,序列的结构性越强,编码长度就越短。
语言模型照着这件事训练
给定一份真实文本,用某个模型给出的方案去编码它,得到的平均长度就是交叉熵。
$$H(p, q) = -\sum_x p(x) \log q(x)$$
这里 $p$ 是语言本身的分布,$q$ 是我们训练出来的模型。交叉熵永远不小于熵,两者的差距正是模型没学到的那部分规律。而 $p$ 通常拿不到,能拿到的只有它的样本,所以评估语言模型好坏,看的一直是这个能算的量。
香农早就把这件事变成了实验。他在 1951 年的论文里请人接着往下猜字母,猜到猜中为止,用平均猜测次数估英语的熵。单个被试给出的结果约为每字符 1.3 比特,后来有人把同样的实验搬到众包平台上重做,结论仍落在同一量级。这个玩法后来有了名字,叫香农游戏。
于是「训练语言模型」和「把文本压得更短」在数学上变成了同一件事。模型对下一个词预测得越准,交叉熵越低,同样一段话需要的比特就越少。2006 年有人把这条逻辑做成了比赛,Marcus Hutter 设立的 Hutter Prize 拿英文维基百科的一段固定文本当题目,压缩率每提高百分之一就发奖金,参赛者想赢就得想尽办法挖出文本背后的语法与事实联系。
压缩的天花板,在通信里先被算了出来
香农 1948 年的《通信的数学理论》还顺手回答了另一个问题,一条会出错的信道,最快能传多快。这个上限叫香农极限,超过了它,信息一定会出错。整个编码理论的研究方向,就是把这个极限一步步逼近。
低密度奇偶校验码(LDPC)是其中的代表。它如今跑在 5G NR 的数据信道、Wi-Fi 802.11 以及卫星广播 DVB-S2 里,纠错性能非常接近香农极限。原文特意提这一句,是在提醒读者,「熵给了你一个理论长度,实际能不能压到那么短,取决于工程能做到哪一步」。
原文接着为什么要讲 n-gram
知道了熵,下一个问题就是怎么把它估出来。最土的办法是数频率,这正是 n-gram 模型。
它的短板在原文那个填空例子上暴露得很清楚。句子「Stanford has a new course on large language models. It will be taught by ___」,如果上下文窗口给得太小,模型就接不上远处的 Stanford;窗口给得再大一点,长组合在语料里出现零次,概率根本没法估。
于是出现了一个反差极大的数字。2007 年有人在 2 万亿 token 上训练了一个 5-gram 机器翻译模型,而 GPT-3 只用了 3000 亿 token。n-gram 吃掉近六倍的数据,仍然受窗口长度限制,长距离依赖救不回来。
2003 年 Bengio 等人换了个思路,用神经网络直接给出条件概率,只在 1400 万个词上训练就赢了同等数据量的 n-gram。此后 RNN 把上下文拉到整个历史,Transformer 在 2017 年回到固定窗口却好训练得多,GPT-3 用的窗口长度是 2048。这条线往下接的就是精读(一)讲的通用能力,和精读(二)拆开的模型架构。
这一节怎么读
读 1.2.1 时不必推导每一步,把三件事抓住就够。熵是平均意外程度,它等于编码这段内容需要的比特数,语言模型的训练目标就是把这个数压下去。
想动手验证的话,三枚硬币的算例可以自己按一遍计算器,五分钟的事,比看十遍公式管用。读完再回到原文,后面 n-gram 与神经语言模型的对比会顺畅很多。
站内相关的三篇,自然语言处理讲任务,文本向量化讲工程落地,精读(一)讲语言模型为什么具备通用能力。这一篇补的是它们共同的数学起点。
参考来源
- Datawhale 社区《大模型基础》第 1 章 引言(MIT 许可证)
- C. E. Shannon, A Mathematical Theory of Communication, 1948
- C. E. Shannon, Prediction and Entropy of Printed English, The Bell System Technical Journal, 1951
- P. Brants et al., Large Language Models in Machine Translation, 2007
- Y. Bengio et al., A Neural Probabilistic Language Model, JMLR, 2003
一起交流
分享你的思考,让讨论更进一步。