Skip to content
知识

/knowledge/natural-language-processing

自然语言处理

如何让机器读懂文字。从数词到注意力——从一袋词元,到一个能把整句话装在脑中的模型,这一路的历程。

学于
自然语言处理COMP90042 · 数据科学硕士
时间
墨尔本大学,2024
应用于
气候事实核查器
阅读 / 复习
约 14 分钟阅读2026-06-24

语言是我们经常要求计算机处理的最杂乱的数据。一列电子表格本身就是数字;而一句话是 一串符号,它的含义取决于顺序、上下文、语气,以及写作者从未明说的一大堆共同假设。自然语言处理(NLP)就是弥合这道鸿沟的领域——把文本变成模型能够计算的 东西,再把模型的输出变回人能使用的语言。

本页走完整条弧线,与我在墨尔本大学所学的相同:从最古老的招数(数词)到每个现代 语言模型背后的架构(关注正确的词)。每一步的存在,都是为了修复前一步的某个具体弱点。

01

NLP 是什么,以及为什么难

NLP 涵盖任何输入或输出是人类语言的任务:把一条评论分类为正面或负面、从合同中 抽取公司名称、把中文翻译成英文、回答一个问题、总结一份报告,或者生成一句话中的 下一个词。它们的共同点在于,其原材料——文本——抗拒大多数统计所依赖的那些整洁假设。

四个难点反复出现:

  • 歧义。「I saw her duck」是两个不同的句子,取决于 duck 是 一只鸟还是一个动作。人类毫无察觉地就化解了它;而模型必须被给予足够的上下文才能 做到同样的事。
  • 稀疏性。可能的句子数量实际上是无穷的,所以你将遇到的大多数词的 组合,从未出现在你的训练数据中。好的方法能从见过的泛化到没见过的。
  • 顺序与长程依赖。「The dog that chased the cat that ran across the road was fast」——这个动词与十个词之前的名词保持一致。含义存在于结构 之中,而不只是当下那一袋词里。
  • 符号接地鸿沟。词是离散的符号,本身不带任何相似性的概念。catkitten 这两个字符串没有任何地方告诉计算机它们 是相关的。NLP 的许多进步,其实都是在制造一种有用的相似性概念。

记住这四点——下面的每一项技术都是对其中一个或多个的回答。

02

经典流水线

在任何建模之前,原始文本会被清洗并切成单元。这个预处理并不光鲜,但它为下游的 一切设定了上限——模型的好坏,至多只能与你喂给它的词元一样好。

原始文本分词规范化表示建模输出
传统的 NLP 流水线。现代端到端模型把其中几步折叠进了网络内部,但这些概念性的阶段依然成立。

分词

分词把一个字符串切成单元——通常是词,但越来越多是子词。 按空格切分看似显然,直到你遇到「don't」「U.S.A.」、连字符词、表情符号,或者根本 词与词之间没有空格的中文。现代系统大多使用像字节对编码这样的子词 方案,它学习一份由高频片段组成的词表,于是像 tokenisation 这样的 稀有词就变成 token + isation。这在仍能表示任何词的同时 保持词表小巧,也是对稀疏性问题的直接回答。

规范化

一旦你有了词元,你通常会缩减那些对你的任务无关紧要的变化:

  • 大小写折叠——Appleapple(小心:它丢失了 公司与水果的区别)。
  • 词干提取粗暴地砍掉后缀(runningrunstudiesstudi);词形还原用词典映射到 真正的词根(bettergood)。词形还原更慢,但更正确。
  • 停用词移除丢弃高频、低信息量的词(theofis)——对关键词方法有帮助,对任何语法承载含义的场景有害。

03

把词变成数字

模型需要向量,而不是字符串。第一类答案把一篇文档视为一袋词——对哪些 词出现的计数,完全忽略顺序。

原始计数会过度奖励常见词,所以标准的修正是 TF-IDF(词频 × 逆文档 频率)。当一个词在本文档中频繁、却在整个文集中稀有时,它给出 高分——恰恰是那些让一篇文档与众不同的词。

tf-idf(t,d)=tf(t,d)log ⁣(Ndf(t))\text{tf-idf}(t, d) = \text{tf}(t, d)\cdot\log\!\left(\frac{N}{\text{df}(t)}\right)

这里 tf(t, d) 是词 t 在文档 d 中出现的频次,N 是文档总数,df(t) 是有多少篇文档包含 t。在 每篇文档中都出现的词(如 the)得到 log(N/N) = 0,于是被 自动忽略;在数千篇中只出现于一篇的词,得到很大的权重。n 元组(相邻词 的对或三元组,如 not_good)找回了一点点被袋装词丢掉的词序。

TF-IDF 快速、透明,至今仍是文档分类与检索中一个真正强大的基线。它的弱点是符号 接地鸿沟:carautomobile 就和 carbanana 一样毫不相关,因为每个词都是它自己独立的维度。

04

词嵌入

修复了接地问题的突破是分布假说:一个词的含义由它结伴出现的词所 捕捉。出现在相似上下文中的词——teacoffee——应当拥有 相似的表示。

词嵌入把这变成几何。每个词成为一个由几百个数字构成的稠密向量,经过 学习,使得用在相似上下文中的词彼此落得很近。word2vec 通过训练一个小 网络来从邻词预测某词(CBOW)或从某词预测邻词(skip-gram)来学习它们;GloVe 则通过分解一个全局共现矩阵达到同样目的。著名的结果是:含义 变成了算术:

vec(king)vec(man)+vec(woman)vec(queen)\text{vec}(\text{king}) - \text{vec}(\text{man}) + \text{vec}(\text{woman}) \approx \text{vec}(\text{queen})

性别关系被编码为空间中一个一致的方向。余弦相似度——两个向量之间的 夹角——成为衡量两个词有多相关的一个可用度量,这恰恰是 TF-IDF 所缺乏的相似性概念。

问题在于:经典嵌入是静态的。无论是河岸还是储蓄银行,bank 都 只有一个向量。修复它需要一个能读整句话的模型——这就把我们带到了序列。

05

序列模型:RNN 与 LSTM

为了尊重词序,一个循环神经网络(RNN)一次读一个词元,并把一个隐藏 状态向前传递——这是对目前为止所见一切的滚动摘要。原则上,这让网络能在前面所有词的 条件下处理每个词。

实践中,朴素的 RNN 会遗忘。训练它们意味着把梯度乘过每一个时间步,而这些乘积在长 距离上趋向于零——即梯度消失问题。网络学不会一个动词要与二十个词之前的 主语保持一致。

长短期记忆(LSTM)网络用一个独立的细胞状态和一组——决定每一步要遗忘什么、添加什么、读出什么的小型可学习阀门——来 修复这一点。信息现在可以几乎原封不动地沿着细胞状态流过很长的跨度,所以 LSTM 能 捕捉长得多的依赖。多年来,它们是翻译、语音和标注的默认选择。

但它们仍有两个结构性局限:它们严格从左到右读取(所以每一步都要等上一步,使它们 训练缓慢),而且即便有门,单个固定大小的状态对于很长的输入也是瓶颈。两者都败给了 下一个想法。

06

注意力与 Transformer

注意力的洞见是:你不需要把整句话塞进一个滚动状态里。相反,在处理 某个词时,让它直接看向其他每一个词,并拉入那些重要的。对于「the trophy didn't fit in the suitcase because it was too big」中的「it」,注意力让 it回望并对 trophy 赋以很高的权重。

2017 年的论文 Attention Is All You Need 完全抛弃了循环,仅用注意力就 构建了一个模型——Transformer。每个词发出三个向量:一个查询(我在找什么?)、一个(我提供什么?)和一个(我传递什么?)。一个词的新表示是所有值的加权和,其中权重来自它的查询与每个键的 匹配程度:

Attention(Q,K,V)=softmax ⁣(QKdk)V\text{Attention}(Q, K, V) = \text{softmax}\!\left(\frac{Q K^{\top}}{\sqrt{d_k}}\right) V

Q·Kᵀ 这一项把每个词与其他每个词打分;除以 √dₖ 让这些 分数在数值上保持稳定;softmax 把它们变成总和为一的权重;乘以V 则相应地混合各个值。因为这一次性比较所有位置,整个序列是并行处理的, 而非一步一步。还有两个部件让它得以运作:

  • 多头注意力。若干注意力机制并行运行,各自可以专注于一种不同的关系 ——一个头追踪句法,另一个追踪指代——它们的输出再被组合起来。
  • 位置编码。仅有注意力是对顺序盲视的,所以一个编码每个词元位置的信号 被加到它的嵌入上,从而恢复词序。

这也解决了静态嵌入的问题:在 Transformer 中,bank 在「river bank」中 得到的表示与在「central bank」中不同,因为它的向量每一次都是由周围的 上下文构建的。这些就是上下文嵌入,也是这一架构接管整个领域的原因。

07

预训练与大语言模型

Transformer 解锁了一种如今主导 NLP 的训练范式:先预训练,再微调。先用 一个自监督目标在一座未标注文本的大山上训练一个大模型——预测一个被遮盖的词,或预测 下一个词。无需人工标签,所以它基本能从整个网络中学习。然后用一个相对极小的带标签 数据集,把这个通用模型适配到某个具体任务。

由此产生了两个家族:

  • 编码器(BERT 式)一次读完整句话、左右兼顾,并通过遮盖词来训练。它们 为理解而生——分类、命名实体识别、检索。
  • 解码器(GPT 式)从左到右读取,并被训练去预测下一个词元。它们为生成而生,而把它们做大——更多参数、更多数据——正是产生了今天的大语言模型

过去几年最醒目的教训是:一旦模型及其训练数据足够大,许多看起来像推理的东西,都从 这一个简单目标——预测下一个词元——中涌现出来。底层的管道,依然是词元、嵌入和注意力。

08

如何衡量它

一个模型的可信度,至多只能与它的评估一样。正确的指标取决于任务。

对于分类(垃圾邮件 / 非垃圾邮件,论断被支持 / 被驳斥),只要类别 不平衡,准确率就会误导——如果只有 1% 是垃圾邮件,一个永远说「非垃圾邮件」的检测器 能得 99 分。所以你报告精确率(在我标记的当中,有多少是对的)、召回率(在实际存在的当中,我抓到了多少),以及它们的调和平均,即F1 分数

F1=2precisionrecallprecision+recallF_1 = \frac{2 \cdot \text{precision} \cdot \text{recall}}{\text{precision} + \text{recall}}

对于语言建模困惑度衡量模型对留出文本有多惊讶——越低 越好,它大致是模型在多少个等可能的词之间做选择的平均数。对于翻译或摘要这样的生成任务,BLEUROUGE 这样的指标把输出与 人类参考之间重叠的词序列做比较——有用但粗钝,这就是为什么人工评估从未完全消失。

09

我在哪用过它

同样的形态在生产工作中反复出现:一个透明的基线来设定门槛并对数据做合理性检查, 然后在歧义确实需要化解之处用一个上下文模型——再加上一个足够诚实、能把两者区分开来 的评估。

10

60 秒回顾