Sutskever 30 #01:在神经网络之前,人们怎么猜下一个词?

一个老问题 给你一句话的前半截,猜下一个词是什么。 这是语言模型最早也最直接的版本。从 1948 年 Shannon 开始,到 2010 年代神经网络接管之前,几代人都在做同一件事:给词的下一个位置算一个概率分布。 后面几篇会讲神经网络怎么把这个问题接过去,先学内部状态,再学更长的记忆,最后学会看整段上下文。这一篇先回到起点:在神经网络敢碰语言之前,那一套老办法长什么样,又是怎么走到尽头的。 n-gram:数频率 最朴素的版本叫 n-gram:用前 n-1 个词预测第 n 个。 $$P(w_t \mid w_{t-n+1}, \ldots, w_{t-1})$$n=2 是 bigram,看前 1 个词;n=3 是 trigram,看前 2 个;n=5 看前 4 个。怎么算?数。把语料里所有"前 n-1 个词出现,紧跟着 X"的次数除以"前 n-1 个词出现"的总次数,就是 X 的概率。 这就是全部。没有梯度,没有反向传播,只有一张大表。 它的好处是:你拿到一份足够大的语料,按公式跑一遍,就能拿到一个能用的语言模型。便宜、快、可解释。 它能上线 这套东西在那几十年里不是玩具。它是真在线上的: 语音识别:你说的句子声学上歧义很多(“recognize speech” 和 “wreck a nice beach” 听起来几乎一样),n-gram 给一个语言概率,把听起来对、读起来不对的解码砸下去 机器翻译:早期的 SMT 系统用 n-gram 给翻译候选打分 输入法:你打"明天",下一个词候选"晚上 / 见面 / 早上"按 n-gram 概率排序 你今天用的搜索引擎、十年前的输入法,背后都站着一层这种东西。它解决的是排序问题:哪个候选更像一句人会说的话。 卡在哪 n-gram 能算短搭配。句子一长,它就只剩下局部统计。主要卡在两件事:窗口太短和没有泛化。 窗口太短。trigram 看 2 个词的上下文,5-gram 看 4 个。再多就开始爆。词表 5 万的话,5-gram 要面对大约 $50{,}000^4 \approx 6.25 \times 10^{18}$ 种上下文,没有任何语料能填满这张表。结果是:模型对长一点的句子结构没感觉。“小明今天没去上学,因为他___"——人会想到"病了 / 累了 / 不想去”,n-gram 看到的只是"因为他"这三个词。前面那半截"小明今天没去上学"对它没意义。 ...

April 21, 2026

Sutskever 30 #02:猜下一个字符,然后呢?

一个任务 给你一串字符,猜下一个是什么。就这一个任务。 2015 年,Karpathy 拿这个任务训练了一个 RNN。训练完让它自己写,它写出了能编译的 C 代码。没人教它什么是函数、什么是括号——它只是被"猜下一个字符"反复训练,自己学会了这些。他把过程写成了一篇博客,影响力比很多正式 paper 都大。 我们拿最小的版本跑了一遍。 hello world 先看结果。这是我们的模型在第 1800 步生成的文本: rmption is pattornnin eell n levery ywormnearn data hello world helens pis prnters hello world 完整地冒出来了,旁边还是一堆乱七八糟的东西。 这个模型的全部训练数据是 2490 个字符——几句英文短句复制 10 遍。hidden size 64,vanilla RNN,纯 NumPy 手写。它从来不知道 “hello world” 是一个词组。 那它怎么学会的? 模型每一步对 24 个字符各猜一个概率,加起来是 1。训练数据里有正确答案——比如 h 后面确实跟着 e。一开始模型给 e 的概率很低,可能 4%。 猜错了怎么办?算一个数: $$\text{loss} = -\log(p)$$$p$ 是模型给正确答案的概率。$-\log(0.04) \approx 3.2$,挺疼的。$-\log(0.9) \approx 0.1$,几乎没感觉。概率越低,这个数越大,惩罚越重。 为什么用 $\log$ 而不是更直觉的 $1 - p$?因为 $1 - p$ 是线性的:概率从 50% 降到 40%,惩罚增加 0.1;从 5% 降到 4%,惩罚也只增加 0.01。但模型已经很离谱了(5%)还能更离谱(4%),这种恶化应该更疼才对。$-\log(p)$ 做到了这一点——概率越低,曲线越陡,越错越疼。 ...

April 15, 2026