原文: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。
译文仅供学习参考,请勿转载或用于商业用途。
原书作者:
在使用分类器时,必须警惕并避免可能造成的各类危害——这些危害不仅存在于朴素贝叶斯分类器中,也存在于后续章节将介绍的其他分类算法中。 一类典型的危害是表征性伤害(representational harms)(Crawford, 2017;Blodgett et al., 2020),即系统通过贬低某个社会群体而造成的伤害,例如强化对该群体的负面刻板印象。 例如,Kiritchenko 和 Mohammad(2018)评估了200个情感分析系统在成对句子上的表现:这些句子内容完全相同,仅在人名上有所区别——一组使用常见的非裔美国人名字(如 Shaniqua),另一组使用常见的欧裔美国人名字(如 Stephanie),这些人名选自 Caliskan 等人(2017)的研究(该研究将在第6章讨论)。 他们发现,大多数系统对包含非裔美国人名字的句子赋予了更低的情感得分和更强烈的负面情绪,这反映出并进一步强化了将非裔美国人与负面情绪相关联的刻板印象(Popp et al., 2003)。 在其他任务中,分类器可能同时引发表征性伤害和其他类型的伤害,例如言论压制(silencing)。 以毒性检测(toxicity detection)这一重要的文本分类任务为例:其目标是识别仇恨言论、辱骂、骚扰或其他形式的有害语言。 尽管这类分类器的初衷是减少社会伤害,但它们本身也可能造成新的伤害。 例如,研究人员发现,一些被广泛使用的毒性检测模型会错误地将某些无害语句标记为“有毒”,仅仅因为这些语句提到了某些身份群体,如女性(Park et al., 2018)、盲人(Hutchinson et al., 2020)或同性恋者(Dixon et al., 2018;Dias Oliva et al., 2021);或者仅仅因为使用了某些语言变体的特征表达,例如非裔美国人白话英语(African-American Vernacular English, AAVE)(Sap et al., 2019;Davidson et al., 2019)。 这类假阳性错误可能导致相关群体自身或关于他们的正当言论被平台屏蔽或压制。 这些问题的根源可能来自训练数据中的偏见或其他缺陷;一般来说,机器学习系统会复制甚至放大其训练数据中存在的偏见。‘但问题也可能源于标签本身(例如人工标注者的偏见)、所使用的资源(如情感词典或预训练词嵌入等模型组件),甚至模型架构本身(例如模型被优化的目标函数)。 尽管目前已有大量研究致力于缓解这些偏见(例如通过审慎选择训练数据来源),但我们尚无普适的解决方案。 因此,在引入任何自然语言处理模型时,都必须认真审视上述因素,并予以明确说明。 一种有效做法是为每个模型版本发布一份模型卡片(model card)(Mitchell et al., 2019)。模型卡片用于记录机器学习模型的关键信息,包括: 所用训练算法及参数 训练数据的来源、动机与预处理方式 评估数据的来源、动机与预处理方式 预期用途与目标用户 模型在不同人口统计群体或其他环境情境下的性能表现 4.11 统计显著性检验 目录 4.13 模型的解释
多项逻辑回归的损失函数将二元逻辑回归的损失函数从 2 个类别推广到了 $K$ 个类别。 回顾一下,二元逻辑回归的交叉熵损失函数(重复自公式 5.23)为: $$ L_{CE}(\hat{y}, y) = -\log p(y|x) = -[y \log \hat{y} + (1 - y)\log(1 - \hat{y})] \tag{4.36} $$多项逻辑回归的损失函数将公式 4.36 中的两项(一项在 $y = 1$ 时非零,另一项在 $y = 0$ 时非零)推广为 $K$ 项。 如上所述,对于多项回归,将 $y$ 和 $\hat{y}$ 都表示为向量。 真实标签 $y$ 是一个包含 $K$ 个元素的向量,每个元素对应一个类别,当正确类别为 $c$ 时,$y_c = 1$,而 $y$ 的其余所有元素均为 0。 分类器将生成一个包含 $K$ 个元素的估计向量 $\hat{y}$,其中每个元素 $\hat{y}_k$ 表示估计的概率 $p(y_k = 1|x)$。 把二元逻辑回归推广,可以得到单个样本 $x$ 的损失函数,它是 $K$ 个输出类别的对数之和,每个项由指示函数 $y_k$ 加权(公式 4.37)。 这实际上就等于正确类别 $c$ 的负对数概率(公式 4.38): ...
使用梯度下降的目标是找到最优的权重:即最小化为模型定义的损失函数。 在下面的公式 4.25 中,我们将明确表示交叉熵损失函数 $L_{CE}$ 是权重的函数。 在机器学习中,我们通常将待学习的参数统称为 $\theta$;在逻辑回归中,$\theta = \{\mathbf{w}, b\}$。 因此,目标是找到一组权重,使得损失函数在所有训练样本上的平均值最小: $$ \hat{\theta} = \underset{\theta}{\mathrm{argmin}} \frac{1}{m} \sum_{i=1}^m L_{CE}( f(x^{(i)};\theta), y^{(i)}) \tag{4.25} $$该如何找到这个(或任何)损失函数的最小值呢? 梯度下降是一种找到函数最小值的方法:找出函数在参数空间 $\theta$ 中哪个方向上升最陡峭,然后朝相反方向移动。 其核心思想是:如果你在峡谷中徒步,想要最快地走到谷底的河流处,可能会环顾四周,找到地面坡度最陡的方向,然后朝着那个方向下坡行走。 对于逻辑回归而言,这个损失函数恰好是凸函数(convex)。 凸函数最多只有一个最小值,不存在会陷入的局部最小值,因此无论从哪个点开始,梯度下降都能保证找到全局最小值。 (相比之下,多层神经网络的损失函数是非凸的,梯度下降在训练神经网络时可能会陷入局部最小值,而永远无法找到全局最优解。) 该算法(以及梯度的概念)是为方向向量设计的,不过我们先考虑一个更简单的可视化场景:假设系统的参数只是一个标量 $w$,如图 4.4 所示。 假设随机初始化 $\mathbf{w}$ 为某个值 $w_1$,并假设损失函数 $L$ 恰好具有图 4.4 所示的形状。 此时,我们需要算法告诉我们,在下一次迭代中,是应该向左移动(使 $w_2$ 小于 $w_1$)还是向右移动(使 $w_2$ 大于 $w_1$),才能到达最小值。 图 4.4 通过迭代找到该损失函数最小值,第一步是沿函数斜率的反方向移动 $\mathbf{w}$。由于斜率为负,需要将 $\mathbf{w}$ 向正方向(右侧)移动。此处上标用于表示学习步骤,因此 $w^1$ 表示 $\mathbf{w}$ 的初始值(即 0),$w^2$ 表示第二步的值,依此类推。 梯度下降算法计算当前点处损失函数的梯度(gradient),并朝其相反方向移动,以此来解决这个问题。 一个多变量函数的梯度是一个向量,指向函数值增长最快的方向。 梯度是斜率在多变量情况下的推广,因此对于像图 4.4 中这样的单变量函数,我们可以非正式地将梯度视为斜率。 图 4.4 中的虚线显示了在点 $\mathbf{w} = w^1$ 处这个假想损失函数的斜率。 可以看到,这条虚线的斜率为负。 因此,为了找到最小值,梯度下降告诉我们应朝相反方向移动:即把 $\mathbf{w}$ 向正方向移动。 ...
我们需要一个损失函数,用于衡量对于一个观测样本 $x$,分类器的输出($\hat{y} = \sigma(\mathbf{w} \cdot \mathbf{x} + b)$)与正确输出($y$,即 0 或 1)的接近程度。 我们将这个函数表示为: $$ L(\hat{y}, y) = \hat{y} \text{ 与真实标签 } y \text{ 的差异程度} \tag{4.20} $$通过一个损失函数来实现这一点,该函数倾向于让训练样本的正确类别标签具有更高的可能性。 这种方法被称为条件最大似然估计(conditional maximum likelihood estimation):我们选择一组参数 $\mathbf{w}$ 和 $b$,在给定样本 $x$ 的条件下,最大化训练数据中真实标签 $y$ 的对数概率。 由此得到的损失函数称为负对数似然损失(negative log likelihood loss),通常简称为交叉熵损失(cross-entropy loss)。 我们应用于单个观测样本 $x$,来推导这个损失函数。 目标是学习一组权重,使其最大化正确标签的概率 $p(y|x)$。 由于只有两种离散结果(1 或 0),这是一个伯努利分布(Bernoulli distribution)。可以将分类器对单个样本产生的概率 $p(y|x)$ 表示如下(注意:当 $y=1$ 时,公式 (5.21) 简化为 $\hat{y}$;当 $y=0$ 时,简化为 $1-\hat{y}$): $$ p(y|x) = \hat{y}^y (1 - \hat{y})^{1-y} \tag{4.21} $$现在对等式两边取对数。这在数学上非常方便,且不会影响结果;因为能使概率最大化的参数值,同样也能使该概率的对数最大化: $$ \begin{align*} \log p(y|x) &= \log[\hat{y}^y (1 - \hat{y})^{1-y}] \\ &= y \log \hat{y} + (1 - y) \log(1 - \hat{y}) \tag{4.22} \end{align*} $$公式 4.22 描述了一个应被最大化的对数似然。 为了将其转换为一个损失函数(即我们需要最小化的量),只需对公式 4.22 取负号。 结果就是交叉熵损失 $L_{CE}$: ...
模型的参数,即权重 $\mathbf{w}$ 和偏置 $b$,是如何学习得到的呢? 逻辑回归是监督分类的一个实例,在该任务中,我们知道每个样本 $x$ 的正确标签 $y$(0 或 1)。 系统通过公式 4. 产生的是 $\hat{y}$,即系统对真实标签 $y$ 的估计值。 我们的目标是学习到一组参数(即 $\mathbf{w}$ 和 $b$),使得每个训练样本的预测值 $\hat{y}$ 尽可能接近其真实标签 $y$。 这需要两个在本章引言中已预示过的组成部分。 第一个一种指标,来衡量当前预测标签 $\hat{y}$ 与真实标注标签 $y$ 之间的接近程度。 我们通常不直接衡量相似性,而是讨论其对立面:系统输出与真实输出之间的距离,并称此距离为损失函数(loss function)或代价函数(cost function)。 在下一节中,我们将介绍逻辑回归以及神经网络中常用的损失函数——交叉熵损失(cross-entropy loss)。 第二个需要的是一个优化算法,用于迭代地更新权重,以最小化该损失函数。 解决这一问题的标准算法是梯度下降(gradient descent);我们将在后续章节中介绍随机梯度下降(stochastic gradient descent)算法。 在接下来的两节中,将以更简单的二元逻辑回归为例来描述这些算法,然后在第 4.8 节中再转向多项逻辑回归。 4.4 多项逻辑回归 目录 4.6 交叉熵损失函数
有时我们需要处理超过两个类别的分类问题。 例如,可能需要进行三类情感分类(正面、负面或中性)。 或者,可能会分配第 17 章将要介绍的一些标签,比如一个词的词性(从 10个、30 个甚至 50 个不同的词性中选择),或一个短语的命名实体类型(从“人名”、“地点”、“组织”等标签中选择)。 或者在大语言模型中,词汇表中 |V| 个词,预测下一个词其中的哪一个,这就是 |V| 分类。 在这种情况下,使用多项逻辑回归(multinomial logistic regression),也被称为Softmax回归(在早期的NLP文献中,有时会看到它被称为最大熵分类器,maxent classifier)。 在多项逻辑回归中,我们希望将每个观测样本标记为 $K$ 个类别中的某一个 $k$,并规定只有一个类别是正确的(有时称为硬分类;一个观测样本不能同时属于多个类别)。 我们采用以下表示方式:每个输入 $\mathbf{x}$ 的输出 $\mathbf{y}$ 将是一个长度为 $K$ 的向量。 如果类别 $c$ 是正确的类别,我们将 $y_c$ 设为1,并将 $\mathbf{y}$ 的所有其他元素设为0,即 $y_c = 1$ 且 $y_j = 0 \quad \forall j \neq c$。 像这样的向量 $\mathbf{y}$(只有一个值为1,其余为0)被称为独热向量(one-hot vector)。 分类器的任务是生成一个估计向量 $\hat{\mathbf{y}}$。 对于每个类别 $k$,值 $\hat{y}_k$ 将是分类器对概率 $p(y_k = 1|\mathbf{x})$ 的估计。 5.3.1 Softmax函数 多项逻辑分类器使用 Sigmoid 函数的一个推广版本,称为Softmax函数,来计算 $p(y_k = 1|\mathbf{x})$。 Softmax函数接收一个包含 $K$ 个任意值的向量 $\mathbf{z} = [z_1, z_2, ..., z_K]$,并将其映射为一个概率分布,其中每个值都在 $[0,1]$ 范围内,且所有值的总和为1。 与Sigmoid函数一样,它也是一种指数函数。 ...
前一节中的 Sigmoid 函数为我们提供了一种方法:对一个输入样本 $x$,计算概率 $P(y = 1|x)$。 那么,如何决定将哪个类别分配给一个测试样本 $x$ 呢? 对于给定的 $x$,如果概率 $P(y = 1|x)$ 大于 0.5,就判定为“是”(即类别 1),否则判定为“否”(即类别 0)。 我们将 0.5 称为决策边界(decision boundary): $$ \text{decision}(x) = \begin{cases} 1 & \text{if } P(y = 1|x) > 0.5 \\ 0 & \text{otherwise} \end{cases} $$接下来,我们通过一些语言任务的例子,来展示如何使用逻辑回归作为分类器。 4.3.1 情感分类 假设我们正在对电影评论文本进行二元情感分类,需要判断是否将情感类别“+”或“−”分配给一篇评论文档 doc。 我们将每个输入样本表示为下表所示的 6 个特征 $x_1$ 到 $x_6$;图 4.2 展示了一个小型测试文档及其提取出的特征向量。 变量 定义 图 5.2 中的值 $x_1$ 文档中正面情感词典词的数量 3 $x_2$ 文档中负面情感词典词的数量 2 $x_3$ $\begin{cases} 1 & \text{if “no” in doc} \\ 0 & \text{otherwise} \end{cases}$ 1 $x_4$ 第一和第二人称代词的数量 3 $x_5$ $\begin{cases} 1 & \text{if “!” in doc} \\ 0 & \text{otherwise} \end{cases}$ 0 $x_6$ 文档词数的自然对数(ln) $\ln(66) = 4.19$ ...
分类的目标是接收一个单一输入(我们将每个输入称为一个 样本(observation)),从中提取一些有用的 特征(features)或属性,并据此将该样本 分类(classify)到一组离散类别中的某一个。 我们用 $x$ 表示输入,输出则来自一个固定的类别集合 $Y = \{y_1, y_2, \dots, y_M\}$。 我们的目标是返回一个预测类别 $\hat{y} \in Y$。 符号 $\hat{y}$(称为 hat 或 尖音符)用于表示估计值或预测值。 有时你也会看到输出类别集合被记作 $C$ 而非 $Y$。 以情感分析为例,输入 $x$ 可能是一篇评论或其他文本,而输出集合 $Y$ 可能是: $$ \{\texttt{positive}, \texttt{negative}\} $$或 $$ \{0, 1\} $$对于语言识别(language identification)任务,输入可能是一段待判定语种的文本,输出集合 $Y$ 则是所有可能的语言,例如: $$ Y = \{\texttt{Abkhaz}, \texttt{Ainu}, \texttt{Albanian}, \texttt{Amharic}, ..., \texttt{Zulu}, \texttt{Zuñi}\} $$实现分类的方法有很多。 一种方法是使用人工编写的规则。 例如,我们可以制定如下规则: 如果单词 “love” 出现在 x 中,且其前未出现单词 “don’t”,则分类为 positive。 人工规则可以作为现代自然语言处理系统的一部分组件。例如,在情感分析中,人工整理的正面词与负面词列表就是此类规则的应用,我们将在下文进一步讨论。 然而,规则往往较为脆弱,随着场景或数据随时间变化,规则可能失效;而且在许多任务中,不同特征之间存在复杂的交互关系(比如上述规则中 “don’t” 对 “love” 的否定作用),人类很难设计出在各种情况下都有效的规则。 另一种我们稍后将介绍的方法是:通过提示(prompting)来要求大语言模型给某些文本加上标签。 提示工程可能非常强大,但也存在明显缺陷:大语言模型常常会产生“幻觉”(hallucinate),可能无法解释为何选择某个特定类别。 ...
En sus remotas p´aginas est´a escrito que los animales se dividen en: a. pertenecientes al Emperador b. embalsamados c. amaestrados d. lechones e. sirenas f. fabulosos g. perros sueltos h. incluidos en esta clasificaci ´on i. que se agitan como locos. j. innumerables. k. dibujados con un pincel fin ´ısimo de pelo de camello l. etc ´etera. m. que acaban de romper el jarr ´on n. que de lejos parecen moscas ...
我们经常需要一种方法来衡量两个单词或字符串之间的相似程度。 正如在后续章节中将看到的,这种需求最常出现在自动语音识别或机器翻译等任务中。在这些场景下,我们需要评估一个词序列与某个参考词序列的相似程度。 编辑距离(edit distance)提供了一种方法,来量化上述关于字符串相似性的合理判断。 更正式地说,两个字符串之间的最小编辑距离(minimum edit distance)被定义为将一个字符串转换为另一个字符串所需的最少编辑操作次数(如插入、删除、替换等操作)。 本节中,我们讲介绍单个词的编辑距离,但是该算法同样适用于整个字符串。 例如,“intention”与“execution”之间的差距为 5(删除一个 i,将 n 替换为 e,将 t 替换为 x,插入 c,将 n 替换为 u)。 为了更直观地理解这一点,可以观察字符串距离最重要的可视化方式:两个字符串之间的对齐(alignment),如图 2.16 所示。 给定两个序列,对齐指的是两个序列子串之间的一种对应关系。 因此,我们说 I 与空字符串对齐,N 与 E 对齐,依此类推。 在对齐的字符串下方是另一种表示方式:一系列符号,表示将上方字符串转换为下方字符串的操作列表:d 表示删除(deletion),s 表示替换(substitution),i 表示插入(insertion)。 图 2.16 将两个字符串之间的最小编辑距离表示为对齐。最后一行给出了将上方字符串转换为下方字符串的操作列表:d 表示删除,s 表示替换,i 表示插入。 我们也可以为每种操作赋予特定的成本或权重。 两个序列之间的莱文斯坦距离(Levenshtein distance)是最简单的加权方式,其中三种操作的代价均为 1(Levenshtein, 1966),我们假设一个字母替换自身(例如t替换t)的代价为 0。 “intention”与“execution”之间的莱文斯坦距离为 5。 莱文斯坦还提出了该度量的一种替代版本,其中每次插入或删除的代价为 1,且不允许替换操作(这等价于允许替换,但将每次替换的代价设为 2,因为任何替换操作都可以用一次插入和一次删除来表示)。 使用此版本,“intention”与“execution”之间的莱文斯坦距离为8。 2.9.1 最小编辑距离算法 如何找到最小编辑距离?可以将其视为一个搜索任务,即在从一个字符串转换到另一个字符串的所有可能编辑路径中,寻找最短路径(即编辑操作序列)。 图 2.17 将编辑距离求解视为一个搜索问题 所有可能的编辑路径构成的空间极为庞大,因此无法进行穷举式搜索。 然而,许多不同的编辑路径最终会到达相同的状态(即相同的字符串)。 为了避免重复计算这些路径,可以在每次遇到某个状态时,只记录到达该状态的最短路径。 实现这一目标的方法是使用动态规划(dynamic programming)。 动态规划是一类算法的统称,由 Bellman(1957)首次提出,其核心思想是采用表格驱动的方式,通过组合子问题的解来求解整体问题。 自然语言处理中最常用的若干算法都基于动态规划,例如维特比算法(Viterbi algorithm,见第17章)和用于句法分析的CKY算法(第18章)。 ...