原文:Speech and Language Processing (3rd ed. draft)
当前译文基于 Draft of August 24, 2025。
译文仅供学习参考,请勿转载或用于商业用途。
原书作者:
- Daniel Jurafsky,哈佛大学
- James H. Martin,科罗拉多大学博尔德分校
原文:Speech and Language Processing (3rd ed. draft)
当前译文基于 Draft of August 24, 2025。
译文仅供学习参考,请勿转载或用于商业用途。
原书作者:
Numquam ponenda est pluralitas sine necessitate “如无必要,勿增实体” —— 奥卡姆的威廉 要学习到使模型完美匹配训练数据的权重存在一个问题。 如果某个特征恰好只出现在一个类别中,并因此能完美预测结果,那么它将被赋予一个非常高的权重。 特征的权重会试图完美拟合训练集的细节,实际上这种拟合过于完美,以至于模型会学习到那些只是偶然与类别相关的噪声因素。 这个问题被称为过拟合(overfitting)。 一个好的模型应该能够从训练数据泛化(generalize)到未见过的测试集上,而一个过拟合的模型泛化能力会很差。 为了避免过拟合,我们在公式 (4.25) 的损失函数中添加一个新的正则化项(regularization term)$R(\theta)$,从而得到针对 $m$ 个样本批次的以下损失函数(此处稍作改写,从最小化损失变为最大化对数概率,并移除了不影响 argmax 结果的 $\frac{1}{m}$ 项): $$ \hat{\theta} = \underset{\theta}{\mathrm{argmax}} \sum_{i=1}^m \log P(y^{(i)}|x^{(i)}) - \alpha R(\theta) \tag{4.48} $$新的正则化项 $R(\theta)$ 用于惩罚过大的权重。 因此,如果一个参数设置完美匹配了训练数据,但使用了许多高权重值,而一种设置对数据的拟合稍差、但使用了更小权重,那么前者受到的惩罚会大于后者。 正则化强度参数 $\alpha$ 的值越大,模型权重的值就会越小,降低模型对训练数据的依赖。 计算正则化项 $R(\theta)$ 有两种常用方法。 L2 正则化(L2 regularization)是权重值的二次函数,之所以这样命名,是因为它使用了权重值的 L2 范数(的平方)。 L2 范数 $||\theta||^2$ 等同于向量 $\theta$ 到原点的欧几里得距离。 如果 $\theta$ 包含 $n$ 个权重,则: $$ R(\theta) = ||\theta||_2^2 = \sum_{j=1}^n \theta_j^2 \tag{4.49} $$L2 正则化的损失函数变为: ...
二元逻辑回归的目标是训练一个分类器,使其能够对新输入样本的类别做出二元判断。 本节我们将介绍Sigmoid分类器,它将帮助我们完成这一决策。 考虑一个输入样本 $x$,我们将其表示为一个特征向量 $[x_1, x_2, ..., x_n]$。 (下一小节将展示具体的特征示例。) 分类器的输出 $y$ 可以是 1(表示该样本属于该类别)或 0(表示不属于该类别)。 我们希望知道该样本属于该类别的概率 $P(y = 1|x)$。 例如,这个决策可能是“正面情感”与“负面情感”的区分,特征代表文档中词的出现次数,$P(y = 1|x)$ 表示文档具有正面情感的概率,而 $P(y = 0|x)$ 表示文档具有负面情感的概率。 逻辑回归解决该任务的方法是从训练集中学习一个权重向量和一个偏置项(bias term)。 每个权重 $w_i$ 是一个实数,与输入特征 $x_i$ 相关联。 权重 $w_i$ 表示该输入特征对分类决策的重要性,其值可以为正(为样本属于正类提供证据),也可以为负(为样本属于负类提供证据)。 因此,在情感分析任务中,我们可能会预期单词 awesome 具有很高的正值权重,而 abysmal 则具有非常低的负值权重。 偏置项(也称为截距项,intercept)是另一个实数,会被加到加权后的输入中。 在训练中学习到权重后,要在测试样本上做出决策,分类器首先将每个 $x_i$ 与其对应的权重 $w_i$ 相乘,对所有加权特征求和,并加上偏置项 $b$。 得到的单个数值 $z$ 表示支持该类别的加权证据总和: $$ z = \left( \sum_{i=1}^n w_i x_i \right) + b \tag{4.2} $$在本书其余部分,我们将使用线性代数中的**点积(dot product)**符号来表示此类求和。 两个向量 $a$ 和 $b$ 的点积记作 $a \cdot b$,是它们对应元素乘积之和。(注意:我们用粗体 $\mathbf{b}$ 表示向量。) 因此,以下表达式与公式 4.1 等价: ...
本章通过 n-gram 模型介绍了语言建模,这是一种经典模型,有助于我们引入语言建模中的许多基本概念。 语言模型提供了一种为句子或其他词或标记序列分配概率的方法,并能够根据前面的词或标记来预测下一个词或标记。 n-gram 可能是最简单的语言模型类型。它们是马尔可夫模型,通过前若干个固定窗口内的词来估计下一个词。n-gram 模型可以通过在训练语料库(training corpus)中进行频次统计并归一化(即最大似然估计,maximum likelihood estimate)来进行训练。 n-gram 语言模型可以在**测试集(test set)上使用困惑度(perplexity)**进行评估。 根据一个语言模型,测试集的困惑度是该测试集概率的一个函数:即模型所估计的测试集概率的逆值,再按序列长度进行归一化。 从语言模型中采样(sampling) 是指生成一些句子,每个句子的生成概率由该模型所定义的其出现可能性决定。 平滑(smoothing) 算法提供了一种对训练数据中未出现事件的概率进行估计的方法。常用的 n-gram 平滑算法包括加一平滑(add-1 smoothing),或通过**插值(interpolation)**利用低阶 n-gram 的频次信息。 参考文献与历史注记 n-gram 的基本数学思想最早由马尔可夫(Markov, 1913)提出,他使用如今被称为马尔可夫链(bigram 和 trigram)的方法,预测普希金的《叶甫盖尼·奥涅金》中下一个字母是元音还是辅音。马尔可夫将 20,000 个字母分类为元音(V)或辅音(C),并计算了基于前一个或前两个字母的 bigram 和 trigram 概率,以预测当前字母是否为元音。 香农(Shannon, 1948)将 n-gram 应用于英语词序列的近似计算。受香农工作的启发,到 20 世纪 50 年代,马尔可夫模型已广泛应用于工程、语言学和心理学领域,用于建模词序列。然而,从乔姆斯基(Chomsky, 1956)开始,包括乔姆斯基(1957)和米勒与乔姆斯基(Miller and Chomsky, 1963)在内的一系列极具影响力的研究中,诺姆·乔姆斯基(Noam Chomsky)提出,“有限状态马尔可夫过程”虽然可能是一种有用工程启发式方法,但无法成为人类语法知识的完整认知模型。这些论点导致许多语言学家和计算语言学家在数十年间忽视了统计建模的研究。 n-gram 语言模型的复兴源于弗雷德·耶莱内克(Fred Jelinek)及其在 IBM 托马斯·J·沃森研究中心的同事,他们受到香农工作的启发;以及卡内基梅隆大学的詹姆斯·贝克(James Baker),他受到伦纳德·鲍姆(Leonard Baum)及其团队在诸如美国国防分析研究所(IDA)等实验室进行的早期保密研究的影响,这些工作在解密后才得以公开。这两个研究团队独立地在同一时期成功地将 n-gram 应用于语音识别系统(Baker 1975b, Jelinek 等 1975, Baker 1975a, Bahl 等 1983, Jelinek 1990)。“语言模型” 和 “困惑度” 这两个术语最早由 IBM 团队用于描述这项技术。耶莱内克及其同事以一种相当现代的方式使用“语言模型”一词,意指影响词序列概率的所有语言因素的总和,包括语法、语义、语篇乃至说话人特征,而不仅仅指 n-gram 模型本身。 ...
我们在 3.3 节中引入了困惑度,用于在测试集上评估 n-gram 模型。 更好的 n-gram 模型赋予测试数据更高的概率,测试集上获取的概率归一化后,就是困惑度。 实际上,困惑度这一度量源自信息论中的交叉熵(cross-entropy)概念,这一概念可以解释困惑度中一些看似神秘的特性(例如,为何要使用逆概率?),以及它与熵之间的关系。 熵(entropy)是信息量的一种度量。 给定一个随机变量 $X$,它的取值是需要预测的对象(如单词、字母、词性等),我们将这个集合记作 $\chi$,并设 $X$ 的概率分布为 $p(x)$,那么随机变量 $X$ 的熵定义为: $$ H(X) = -\sum_{x \in \chi} p(x) \log_2 p(x) \tag{3.33} $$理论上,对数的底数可以任意选择。 如果使用以 2 为底的对数,那么熵的单位就是比特(bits)。 理解熵的一种直观方式是:它表示在最优编码方案下,编码某个决策或信息所需的最少比特数的下限。 我们借用信息论经典教材 Cover 和 Thomas(1991)中的一个例子来说明。 假设我们要对一场赛马下注,但距离太远无法亲自前往扬克斯赛马场(Yonkers Racetrack),因此我们想给博彩商发送一条简短的消息,告诉他该为八匹马中的哪一匹下注。 一种编码方式是直接使用马匹编号的二进制表示作为编码:例如,1 号马是001,2 号马是 010,3 号马是 011,依此类推,8 号马则编码为 000。 如果我们整天都在下注,且每匹马都用 3 个比特编码,那么平均每场比赛我们需发送 3 个比特。 能否做得更好?假设“赔率分布”反映了实际投注的分布情况,我们可以将其表示为每匹马的先验概率,如下所示: 1 号马 $\frac{1}{2}$ 2 号马 $\frac{1}{4}$ 3 号马 $\frac{1}{8}$ 4 号马 $\frac{1}{16}$ 5 号马 $\frac{1}{64}$ 6 号马 $\frac{1}{64}$ 7 号马 $\frac{1}{64}$ 8 号马 $\frac{1}{64}$ 设随机变量 $X$ 的取值是马匹编号,$X$ 的熵给出了编码所需比特数的下限,计算如下: ...
n-gram 模型和许多统计模型一样,依赖于训练语料库。 这种依赖性的影响之一是概率值往往编码了特定训练语料中的一些具体事实。另一种影响是随着 N 值的增加,n-gram 模型对训练语料的建模能力会变得越来越强。 我们可以使用上一节提到的采样方法来可视化这两个现象! 为了更直观地理解高阶 n-gram 的建模能力,图 3.4 展示了从基于莎士比亚作品训练出的 unigram、bigram、trigram 和 4-gram 模型中随机生成的一些句子。 1-gram – To him swallowed confess hear both. Which. Of save on trail for are ay device and rote life have – Hill he late speaks; or! a more to leg less first you enter 2-gram – Why dost stand forth thy canopy, forsooth; he is this palpable hit the King Henry. Live king. Follow. – What means, sir. I confess she? then all sorts, he is trim, captain. ...
可视化语言模型所包含知识的一种重要方式是从模型中采样。 所谓从一个分布中采样,就是按照每个结果出现的可能性大小来随机选择结果。 因此,从语言模型中采样——该模型本质上是对句子分布的一种表示——意味着生成一些句子,模型定义的概率选择每个句子。 也就是说,更容易生成模型认为概率较高的句子,而更难生成模型认为概率较低的句子。 通过采样来可视化语言模型的思想最早由 Shannon(1948)以及 Miller 和 Selfridge(1950)提出。 从 unigram 入手来可视化其工作原理,是最容易理解的。 想象英语中的所有词排列在 0 到 1 的数轴上,每个词占据的区间长度与其出现频率成正比。 图 3.3 展示了一个可视化示例,它使用的是根据本书文本训练出的 unigram 模型。 我们随机选择一个介于 0 和 1 之间的数值,在概率线上找到对应的位置,输出该数值落在哪个词的区间内。 不断重复地选择随机数字来生成词,直到随机生成句子结束标记 </s>,此时句子生成结束。 图 3.3 展示了通过不断采样 unigram 来生成句子时的采样分布。 蓝色条形图表示每个词的相对频率(按从高频到低频的顺序排列,但顺序本身是任意的)。 数轴显示了累积概率。如果随机选择一个介于 0 和 1 之间的数字,它会落在某个词所对应的区间内。 我们更有可能随机选中高频词(如 the、of、a)所对应的较大区间,而不太可能选中低频词(如 polyphonic)所对应的小区间。 也可以用同样的方法生成 bigram 句子。首先根据起始标记 <s> 出现的bigram 概率,随机生成一个以 <s> 开头的 bigram。 假设选中的 bigram 第二个词是 $w$,那么下一步就根据以 $w$ 开头的所有 bigram 的概率,再次随机选择下一个词,依此类推,直到生成句子结束标记 </s> 为止。 3.3 评估语言模型:困惑度(Perplexity) 目录 3.5 对训练集的泛化与过拟合
评估语言模型性能的最佳方法是将其嵌入到一个具体应用中,并测量该应用性能的提升程度。 这种端到端的评估称为外在评估(extrinsic evaluation)。 外在评估是唯一能够确定语言模型(或任何组件)的某项改进是否真正有助于当前任务的方法。 因此,在评估作为语音识别或机器翻译等任务组成部分的n元语法(n-gram)语言模型时,可以通过分别使用两个候选语言模型运行语音识别器或机器翻译系统两次,比较哪种模型产生的转录更准确,从而进行评估。 然而,端到端地运行大型自然语言处理系统往往成本高昂。因此,我们需要一种能够快速评估语言模型潜在改进的指标。 内在评估(intrinsic evaluation)是一种不依赖具体应用、直接衡量模型质量的方法。 在下一节中,我们将介绍一种标准的内在评估指标——困惑度(perplexity),它被广泛用于衡量语言模型的性能,无论是简单的n元语法语言模型,还是第9章中更复杂的神经网络大语言模型。 评估任何机器学习模型,至少需要三个不同的数据集:训练集(training set)、开发集(development set,也称为验证集 validation set)和测试集(test set)。 训练集用于学习模型的参数。对于简单的n元语法语言模型来说,训练集就是从中统计n元组频率的语料库,随后将这些频率归一化为概率值,构建语言模型。 测试集则是一组与训练集完全不重叠的独立数据,用于评估模型的表现。我们需要一个独立的测试集来无偏估计训练出的模型在面对未知数据时的泛化能力。如果一个机器学习模型完美地拟合了训练数据,但在其他任何数据上表现都很差,那么它在实际应用中将毫无用处。因此,通过模型在这些“未见过”的测试集或测试语料上的表现来衡量n元语法模型的质量。 我们应该如何选择训练集和测试集呢?测试集应能反映我们希望使用该模型的语言场景。如果打算将语言模型用于化学讲座的语音识别,那么测试集就应该是化学讲座的文本;如果打算将其用于中译英的酒店预订请求翻译系统,那么测试集就应该是酒店预订请求的文本;如果希望语言模型具备通用性,那么测试集就应涵盖多种类型的文本。在这种情况下,可以从不同来源收集大量文本,然后将其划分为训练集和测试集。划分时要格外小心;如果构建的是一个通用模型,就不希望测试集仅包含来自单一文档或某一位作者的文本,因为这不能很好地衡量模型的泛化能力。 因此,如果手头有一个语料库,并希望比较两个不同n元语法模型的表现,可以将数据划分为训练集和测试集,并在训练集上训练两个模型的参数。然后,可以比较这两个训练好的模型在测试集上的拟合程度。 但“拟合测试集”到底意味着什么呢?标准答案很简单:哪个语言模型给测试集分配了更高的概率,就意味着它对测试集的预测更准确,因此是更好的模型。给定两个概率模型,更优的模型就是那个能够更好预测测试数据细节的模型,因此它会给测试数据分配更高的概率。 由于估指标是基于测试集概率的,因此非常重要的一点是:不能将测试集中的句子泄露到训练集中。假设我们试图计算某个特定“测试”句子的概率,如果这个测试句子包含在训练语料中,那么当它出现在测试集中时,我们会错误地给它分配一个虚高的概率。我们将这种情况称为在测试集上训练。在测试集上训练会引入偏差,使所有概率看起来都偏高,并会导致下面将要介绍的基于概率的评估指标——困惑度(perplexity)出现严重偏差。 即使没有在测试集上进行训练,如果多次对语言模型在测试集上进行测试(每次在模型修改之后),也可能会无意中根据测试集的特点对模型进行调优,因为我们可能会注意到哪些修改使模型表现更好。因此,只应在模型完全准备就绪之后,对测试集进行一次或极少数几次测试。 正因如此,通常还会引入第三个数据集,称为开发集(development test set)或简称验证集(devset)。在最终阶段之前,所有的模型调优和测试都使用这个开发集。只有当确信模型已经调优完毕后,才在测试集上进行一次最终测试,以评估模型的真实表现。 那么,该如何将数据划分为训练集、开发集和测试集呢?我们希望测试集尽可能大,因为一个过小的测试集可能会偶然不具备代表性。但同时,也希望拥有尽可能多的训练数据。最低限度上,希望选择一个足够大的测试集,以便能够有足够强的统计能力,检测出两个候选模型之间是否存在统计显著的差异。此外,开发集必须与测试集来自相同的文本类型,因为它的目标就是用来预测模型在测试集上的表现。 3.1 N元模型 目录 3.3 评估语言模型:困惑度(Perplexity)
我们前面提到,评估语言模型的方法是看哪个模型为测试集分配了更高的概率。 一个更优的语言模型在预测下一个词方面表现得更好,因此在测试集中遇到每个词时会“更不惊讶”(即分配更高的概率)。 事实上,一个完美的语言模型能够准确预测语料中的每一个下一个词,将其概率设为1,而所有其他词的概率为0。 因此,给定一个测试语料库,更好的语言模型会比较差的模型分配更高的整体概率。 然而,实际上我们并不直接使用原始概率作为评估语言模型的指标。 原因在于,测试集(或任何序列)的概率依赖于其中的词数或词元(token)数量;文本越长,测试集的概率就越小。 我们更希望使用一个以词为单位、按长度归一化的指标,这样就可以在不同长度的文本之间进行比较。 我们使用的这个指标是一种基于概率的函数,称为困惑度(perplexity),它是自然语言处理中最重要的评估指标之一,既用于评估大型语言模型,也用于评估 n 元模型。 某个测试集上语言模型的困惑度(有时缩写为PP或PPL),是指测试集概率的倒数(即1除以测试集的概率),并按词数进行归一化。 正因如此,它有时也被称为每词困惑度或每词元困惑度。 为了按词数 N 归一化,我们对概率取 N 次方根。1 对于一个测试集 $W = w_1 w_2 ... w_N$,其困惑度定义如下: $$ \begin{align*} \text{perplexity}(W) &= P(w_1w_2 ... w_N )^{-\frac{1}{N}} \\ &= \sqrt[N]{\frac{1}{P(w_1w_2 ... w_N )}} \tag{3.14} \end{align*} $$或者,也可以利用链式法则展开 $W$ 的概率: $$ \text{perplexity}(W) = \sqrt[N]{\prod_{i=1}^{N} \frac{1}{P(w_i | w_1 ... w_{i-1})}} \tag{3.15} $$需要注意的是,由于公式(3.15)中使用了倒数,词序列的概率越高,困惑度就越低。 因此,语言模型在数据上的困惑度越低,模型表现越好。 最小化困惑度等价于根据语言模型最大化测试集的概率。 为什么困惑度要使用概率的倒数呢? 实际上,这个倒数来源于信息论中交叉熵率(cross-entropy rate)的原始定义。对于有兴趣的读者,详细解释可以在进阶章节 3.7 中找到。目前,我们只需要记住:困惑度与概率成反比。 计算测试集 $W$ 的困惑度的具体细节取决于我们使用的语言模型类型。 下面以一个一元(unigram)语言模型为例,其测试集 $W$ 的困惑度定义如下(即所有词的一元概率倒数的几何平均): $$ \text{perplexity}(W) = \sqrt[N]{\prod_{i=1}^{N}\frac{1}{P(w_i)}} \tag{3.16} $$如果使用二元(bigram)语言模型来计算测试集 $W$ 的困惑度,它依然是一个几何平均值,但这次是基于二元概率的倒数: ...
我们从一个任务开始:计算 $P(w|h)$,也就是在给定某个历史上下文 $h$ 的条件下,某个词 $w$ 出现的概率。 假设上下文 $h$ 是 The water of Walden Pond is so beautifully,我们想知道下一个词是“蓝色”的概率: $$ P(\text{blue}|\text{The water of Walden Pond is so beautifully}) \tag{3.1} $$一种估算这个概率的方法是通过相对频率计数:找一个非常大的语料库,统计 The water of Walden Pond is so beautifully 这段上下文出现的次数,再统计它后面紧接着出现 blue 的次数。 这其实是在回答这样一个问题:“在我们看到 $h$ 历史中,有多少次后面紧接着出现了词 $w$?”如下所示: $$ \begin{align*} &P(\text{blue}|\text{The water of Walden Pond is so beautifully}) \\ = &\frac{\text{C(The water of Walden Pond is so beautifully blue)}}{\text{C(The water of Walden Pond is so beautifully)}} \tag{3.2} \end{align*} $$如果有一个足够大的语料库,就可以通过这两个计数来估算这个概率。 但即使是整个互联网的文本也不足以提供对完整句子的准确估计。 这是因为语言具有创造性:人们不断在创造新的句子,我们无法指望对完整句子这样长的结构获得足够的统计次数。 因此,我们需要更聪明的方法来估计,在给定出现历史 $h$ 的条件下,某个词 $w$ 的概率,或者整个词序列 $W$ 的概率。 ...
“你总是那么迷人!”他微笑着说道,这时我偶尔会鞠个躬,他们也注意到了一辆四匹马拉的马车,心生向往。 由简·奥斯汀语料的三元模型生成的随机句子 正如一句老话所说:“预测很难——尤其是预测未来。” 但如果尝试预测一些看起来简单得多的事情呢?比如一个人接下来会说什么词。 举个例子,下面这句话接下来可能会出现什么词: The water of Walden Pond is so beautifully ... 你可能会觉得,可能的词是blue、green或者clear,但不太可能是refrigeratornor或this。 在本章中,我们将引入语言模型(Language Models,简称LMs)来精确化这种直觉。 语言模型能够为每一个可能的下一个词分配一个概率。 它不仅可以为一个完整的句子分配概率,还能告诉我们,以下这段话在文本中出现的概率: all of a sudden I notice three guys standing on the sidewalk。 比下面这个词语顺序被打乱的版本出现的可能性要大得多: on guys all I of notice sidewalk three a sudden standing the 那我们为什么要去预测下一个词,或者去计算一个句子的概率呢? 其中一个原因是生成文本时需要选择更符合语境的词。 例如,我们可以纠正一些语法或拼写错误,比如 Their are two midterms 中,“There”被误写成了“Their”,或者“Everything has improve”中,“improve”应为“improved”。 因为“There are”比“Their are”更常见,“has improved”也比“has improve”更有可能出现,所以语言模型可以帮助用户选择更符合语法的表达。 再比如,语音识别系统要判断你说的是 I will be back soonish(我很快就回来),而不是 I will be bassoon dish (我将成为低音管盘),就需要知道“back soonish”这个组合更有可能。 语言模型还可以帮助增强和替代交流系统(augmentative and alternative communication,AAC)(Trnka 等,2007;Kane 等,2017)。 一些身体不便、无法说话或打手语的人可以通过注视或其它动作从菜单中选择词语,语言模型可以辅助这类系统预测可能的词。 ...