4.1.1 语言模型与子词分词(BPE、SentencePiece 等)
这一小节的目标,是把“语言”从符号序列变成可以计算的概率对象,并解释为什么几乎所有现代 NLP/LLM 都离不开子词分词。
4.1.1.1 语言模型
语言模型(Language Model, LM) 的核心任务: 给定一个词(或 token)序列 \(w_1, w_2, \dots, w_T\),估计这整个序列出现的概率
\[ P(w_1, w_2, \dots, w_T) \]
或更常用的条件形式
\[ P(w_t \mid w_1, \dots, w_{t-1}) \]
即“在前面已经看到的内容条件下,下一个词是什么的概率”。
利用概率论中的链式法则(chain rule),可以把整体概率拆成一连串条件概率的乘积:
\[ P(w_1,\dots,w_T) = \prod_{t=1}^T P(w_t \mid w_1,\dots,w_{t-1}) \]
这就是“预测下一个词”的数学形式。无论是传统 n-gram 模型,还是后面 4.2 节要介绍的大型自回归 Transformer 语言模型,都是在近似和建模这类条件概率。
在工程实践中,语言模型主要用于:
- 评估一句话是否“自然”(概率越大越自然)
- 生成新文本(按概率采样或取最大概率的下一个词)
- 作为其它任务(翻译、问答、对话、代码生成、机器人语言理解)的基础模块
评价指标上,困惑度(perplexity) 常被用来衡量语言模型好坏: 直观理解上,它刻画“模型平均每一步在多少个候选 token 之间摇摆”。困惑度越低,说明模型越“不困惑”,预测越准确。
【图 4-1 占位:语言模型示意图】 建议画一个简单示意:左侧是词序列 “机器人 / 把 / 杯子 / …”,箭头指向右侧一个“softmax 概率分布”柱状图,表示下一个词的概率分布。
4.1.1.2 N-gram 模型
在真实语言里,\(P(w_t \mid w_1,\dots,w_{t-1})\) 依赖的上下文可能非常长,直接建模几乎不可能。N-gram 模型 通过一个强但简单的假设来简化问题:
第 \(\displaystyle t\) 个词只依赖前面最近的 \((n-1)\) 个词,而不管更早的历史。
即 n 阶马尔可夫假设:
\[ P(w_t \mid w_1,\dots,w_{t-1}) \approx P(w_t \mid w_{t-n+1},\dots,w_{t-1}) \]
于是整句的概率就变成:
\[ P(w_1,\dots,w_T) \approx \prod_{t=1}^T P(w_t \mid w_{t-n+1},\dots,w_{t-1}) \]
常见的几种 n-gram:
- Unigram(一元组):每个词独立,\(P(w_t)\)
- Bigram(二元组):只看前一个词,\(P(w_t \mid w_{t-1})\)
- Trigram(三元组):看前两个词,\(P(w_t \mid w_{t-2}, w_{t-1})\)
参数估计很直观: 在语料库里数共现次数,比如 bigram:
\[ \hat{P}(w_t \mid w_{t-1}) = \frac{\text{count}(w_{t-1}, w_t)}{\text{count}(w_{t-1})} \]
数据稀疏和平滑(smoothing) 即使在很大的语料库里,很多 n-gram 组合仍然从未出现,简单的计数估计会得到概率 0,导致整句概率为 0。为此需要平滑技术:
- 加一(Laplace)平滑:全部计数 +1,避免 0 概率
- Kneser–Ney 平滑:更精细地折扣高频 n-gram,将概率质量分配给低阶模型,是实际应用中非常强大的平滑方法
N-gram 模型的优点是直观、易实现、解释性好,但局限也很明显:
- 上下文窗口固定、短(一般 n≤5),难以捕获长距离依赖
- 高阶 n-gram 参数量膨胀严重,极易稀疏
- 需要大量人工设计特征和复杂平滑
这也为后续的神经语言模型 和 Transformer-based LLM 铺垫了背景:它们在本质上也是语言模型,但放弃了简单的 n-gram 结构,使用深度网络来拟合长期依赖关系(详见 4.2 节)。
【图 4-2 占位:N-gram 概率图】 一条横向词序列,画出 bigram 的有向边(从前一个词指向后一个词,边上标概率),旁边再画一个 trigram 概率公式。
4.1.1.3 子词分词
语言模型需要先把原始文本切成离散 token,才能定义上面的概率分布。最朴素的做法是“按空格切词”,但这在很多场景中会出问题:
- 词汇表如果只包含完整单词,生僻词、人名、技术术语 会变成 OOV(Out-of-Vocabulary)
- 黏着语、形态丰富的语言(如德语、土耳其语)一个词可以拼成非常长的复合词
- 对中文、日文等无空格语言,“按词切分”本身就是困难任务
子词分词(subword tokenization) 就是折衷方案: 把词拆成更小的子单元(子词、字块、甚至字节),既比字符更长、表达能力更强,又比完整词更泛化。这样,模型只要掌握有限的子词,就能组合出近乎无限的单词。
Byte Pair Encoding(BPE)
BPE 原本是一种数据压缩算法,被 Sennrich 等人改造为子词分词方法,用于机器翻译等任务。 其基本思想:
- 从字符级 开始,将训练语料中的每个词看作字符序列。
- 统计所有相邻符号(初始是字符对)的出现频率。
- 找出出现频率最高的一对符号,把它们合并成一个新的符号(子词)。
- 在整个语料中替换这对符号,更新符号序列。
- 重复 2–4 步,直到达到预设的词表大小(例如 32k 或 50k 子词)。
举个简单例子(极简示意):
- 初始:
l o w,l o w e r,n e w,n e w e r - 多次合并之后:
lo w,lo wer,ne w,ne wer,再进一步可能变成low,lower,new,newer
在机器人/多模态场景中,BPE 的优势尤其明显: 当遇到新的对象名(如“电动三轮广告车”)时,模型仍然可以把它拆成若干已知子词组合,而不是完全陌生的一个 token。
SentencePiece 与 Unigram LM
SentencePiece 是 Google 提出的一个子词分词工具,核心特点是:从** 原始字符序列**直接训练子词模型,不依赖预先分词。
它支持两类常见的子词模型:
- BPE 模式:基本同上,只是集成在统一工具中
- Unigram 语言模型(Unigram LM):为候选子词集合建立一个概率模型,对一句话所有可能的分词方式求概率,选择整体概率最大的那一种。
SentencePiece 还有几个工程上重要的特性:
- 语言无关:可以直接处理日文、中文、混合语种等,无需先用特定语言的分词器
- 直接训练与解码:既提供训练子词词表,也负责编码/解码,方便端到端部署
- 对空格等也视作普通字符,避免“空格信息丢失”的问题
在大模型和 VLA 场景中,我们通常只需要统一、稳定的 tokenization(如 BPE/Unigram + SentencePiece 实现),就能在多任务、多语言、多机器人之间共享同一语言模型。
【图 4-3 占位:BPE/SentencePiece 分词过程示意】 左侧是原始句子,下面列出“字符级表示 → 若干轮合并 → 最终子词序列”的过程,中间可附上合并频率排名的小表格。
4.1.2 词向量、上下文表示(word2vec、ELMo 等)
这一小节从“离散 token 编号”走向“连续向量空间表示”,是从统计 NLP 过渡到神经表示学习的关键步骤。
4.1.2.1 静态词向量
传统做法中,每个单词只是一个 ID,模型无法直接比较“机器人”和“机械臂”的相似程度。词向量(word embedding) 通过把每个词映射为一个实数向量,能让模型在几何空间中“感受”词义相近性。
背后的直觉是著名的分布式假设:
在相似上下文中出现的词,其语义也相似。
word2vec
Mikolov 等人提出的 word2vec 模型是静态词向量的代表,使用一个小型神经网络在大规模语料上自监督训练。
两种典型结构:
- CBOW(Continuous Bag-of-Words):给定中心词周围的上下文词,预测中心词
- Skip-gram:给定中心词,预测其左右上下文词;对稀有词效果更好
训练时常用的技巧包括:
- 层次 softmax:用 Huffman 树加速输出层计算
- 负采样(negative sampling):只采样少量“负例”单词来更新参数,大幅加速训练
训练结束后,每个词对应一个固定维度的向量(如 100 维、300 维),在这个向量空间里:
- 语义相近的词距离较近(cosine 相似度高)
- 有时还能观察到线性关系,如 \(\text{vec}(\text{“国王”})\) - \(\text{vec}(\text{“男人”})\) + \(\text{vec}(\text{“女人”})\) \approx \(\text{vec}(\text{“女王”})\)
其他静态词向量方法如 GloVe,可以看作对词共现矩阵的某种因子分解,也在许多 NLP 任务中表现良好。
【图 4-4 占位:词向量空间示意图】 通过二维投影展示若干词(如 “机器人”“机械臂”“猫”“狗”)在平面上的位置,同类词聚在一起。
4.1.2.2 上下文表示
静态词向量有一个致命缺陷:同一个词在不同语境中的含义不同,但它的向量是固定的。
比如“银行”在中文中可以是“金融机构”也可以是“河岸”;静态 embedding 无法区分这两种含义。为解决多义词问题,研究者提出了上下文敏感(contextualized)词表示 。
ELMo:基于双向语言模型的上下文向量
ELMo(Embeddings from Language Models)是早期具有代表性的上下文表示方法。它的做法是:先训练一个深层双向语言模型(biLM),然后把每个词的表示定义为这个 biLM 内部隐藏状态的函数(通常是不同层表示的加权和)。
关键特点:
- 模型结构:字符级 CNN + 多层 BiLSTM + 语言模型目标(从左到右和从右到左)
- 对于句子中的每个词,ELMo 输出一个向量,这个向量取决于整句上下文
- 将这些向量作为附加特征喂给下游模型(如问答、自然语言推断、情感分析),能显著提升性能
与静态词向量相比,上下文表示有几点明显优势:
- 一词多义:可以根据句子动态区分意义(河边的“银行”和金融“银行”得到不同向量)
- 表达能力更强:深层网络可以捕获语法、语义乃至一些世界知识
- 迁移性好:在大语料上预训练,再迁移到各种下游任务
ELMo 之后,BERT、GPT 等基于 Transformer 的预训练模型进一步统一了“语言建模 + 上下文表示 + 下游任务微调”的范式(详见 4.2 节),但 ELMo 清晰体现了**“从语言模型内部状态抽取表示”** 的思想。
【图 4-5 占位:静态 vs 上下文词向量对比】 同一个词 “bank” 在两句
- “I went to the bank to deposit money.”
- “He sat on the river bank.” 中的表示:上图静态 embedding 是同一点,下图上下文 embedding 是两处不同的位置。
4.1.2.3 预训练词向量的作用
无论是静态词向量(word2vec/GloVe),还是上下文表示(ELMo/BERT 系列),共同点是:可以在海量无标注文本上预训练,然后作为下游任务的“通用特征”。
在工程实践中,这带来几方面好处:
- 更好的初始化 将下游模型的嵌入层初始化为预训练词向量,而不是随机初始化,用少量标注数据就能达到更高性能,并更快收敛。
- 显著提升小数据任务的效果 许多任务(尤其是领域特定任务,比如“机器人操作日志理解”“工业说明书理解”)标注数据很少。预训练词向量可以把互联网大规模语料中学到的语言知识迁移过来,提高泛化能力。
- 统一多任务、多领域表示空间 使用同一套预训练向量,多种任务共享一个表示空间,使得跨任务迁移、更大规模的多任务训练更容易实现。这为后续“统一视觉–语言–动作表示”的 VLA 模型打下了先验基础。
- 在机器人场景中的具体价值
- 对自然语言指令的理解更鲁棒(可以识别各种同义表达)
- 可以把人类使用的专业术语、品牌名等编码进机器人可用的向量空间
- 与视觉、动作表示对齐时,语言侧已经有较好的几何结构,便于跨模态对齐
在现代 LLM 中,“预训练 +(可能的)微调”几乎成为默认范式。4.2 节可以被看作是将“预训练词向量”扩展到“预训练整套语言模型”的自然结果。
4.1.3 常见任务:机器翻译、问答、摘要等
在掌握语言模型与向量表示之后,最典型的应用场景就是各种“序列到序列”任务。这里简要介绍三类与后续 VLA 特别相关的任务:机器翻译、自动问答和文本摘要。
4.1.3.1 机器翻译
机器翻译(Machine Translation, MT) 的目标是: 给定源语言句子 \(\mathbf{x}\),生成语义等价的目标语言句子 \(\mathbf{y}\)。
发展脉络(非常简略版):
- 基于规则 / 统计的传统翻译
- 基于语法和词典的规则系统
- 统计机器翻译(SMT):学习“翻译模型 + 语言模型”,典型如短语翻译 + n-gram 语言模型
- 神经机器翻译(Neural Machine Translation, NMT)
使用一个端到端的神经网络直接建模 \(P(\mathbf{y} \mid \mathbf{x})\),
- 早期采用 RNN 编码器–解码器结构
- Bahdanau 等人引入注意力机制(attention),解码时可以软对齐到源句的不同部分,大幅提升性能
- 后来 Transformer 架构成为主流翻译模型(与 2.4 节呼应)
- 子词与开放词汇翻译 由于翻译需要处理大量人名、地名、新词,NMT 特别依赖子词分词。Sennrich 等工作表明,用 BPE 进行子词分词可以显著改善罕见词和未登录词的翻译质量。
机器翻译在具身智能中的作用非常直接: 机器人系统如果希望跨语言工作(例如同时接受中文和英文指令),可以使用统一的多语言表示空间或翻译模块,将不同语言映射到统一的语义指令表示,再交给 VLA 模型进行决策。
【图 4-6 占位:NMT Encoder–Decoder 结构示意】 左边源句 token 序列,经过编码器变成一串向量;右边解码器逐步生成目标句,每一步从注意力层“查看”源句不同位置。
4.1.3.2 自动问答
自动问答(Question Answering, QA) 任务要求系统根据输入的问题,返回一个自然语言答案。根据是否给定上下文,可以大致分成:
- 机器阅读理解(Machine Reading Comprehension, MRC) 给定一段文本(如维基百科文章)和一个问题,从文本中找出答案。 典型数据集如 SQuAD:每个问题的答案是文章中的一个文本片段。
- 开放域问答(Open-domain QA) 系统可以检索整个知识库或搜索引擎结果,然后综合得到答案。这里通常需要“检索 + 阅读 + 生成”三段式管线。
- 封闭书问答(Closed-book QA) 模型完全依赖参数中“记住”的知识,不提供外部文档。例如直接问 LLM “谁提出了 ELMo”。
早期的 QA 系统通常采用“特征工程 + 机器学习”,或者 “检索 + 规则匹配”。现代 QA 系统则多依赖预训练语言模型,通过:
- 编码问题和文档,使用注意力/交互模块找出答案 span
- 或直接由生成式模型输出答案文本
在机器人场景中,自动问答能力可以自然扩展为:
- 解释型问答:用户询问“你为什么没有抓起杯子?”,机器人根据视觉、状态和任务规划给出语言解释(见 4.4.3)。
- 知识问答:机器人可回答“这个零件的材质是什么”“这个操作步骤下一步是什么”,帮助人类在任务中获取信息。
这些都依赖足够强的语言理解和生成能力,而这些能力本质上都来自于强大的语言模型 + 上下文表示 。
4.1.3.3 文本摘要
文本摘要(Text Summarization) 任务希望模型从长文本中压缩出简短而信息密集的摘要。在现代 NLP 中通常分为两大类:
- 抽取式摘要(Extractive Summarization)
- 从原文中选出若干“重要句子/片段”,按一定顺序拼接成摘要
- 摘要中的句子是原文的子集,不生成新句子
- 生成式(抽象式)摘要(Abstractive Summarization)
- 模型“理解”原文要点后,用自己的语言重新组织句子
- 可以使用原文中没有出现过的表述,更接近人类写作风格
早期抽象式摘要往往采用编码器–解码器结构,结合注意力和指针机制(pointer-generator),既能生成新文本,又能“复制”原文中的关键词语,缓解 OOV 问题。
模型评价上,ROUGE 系列指标被广泛使用,通过比较系统摘要和人工摘要之间的 n-gram 重合来评估质量。
在具身智能和机器人系统中,摘要能力的应用场景包括:
- 实验日志与传感器数据的“语言摘要”:把长时间运行的机器人操作日志自动总结成自然语言报告,帮助研究人员快速了解结果。
- 环境描述压缩:将复杂场景感知结果压缩成高层语言描述(如“桌子上有三个杯子,其中一个是红色”),再交给上层规划模块。
- 人机交互中的简短回顾:机器人执行一长串动作后,用一两句话向用户简单汇报自己做了什么,有利于建立信任和可解释性。
【图 4-7 占位:抽取式 vs 抽象式摘要对比】 左边:原文多句,系统选出其中几句高亮连接成摘要;右边:模型生成几句新文本,箭头指向原文不同部分,表示它综合了多个来源。
本节从语言模型 → N-gram → 子词分词 → 词向量与上下文表示 → 典型 NLP 任务 搭建了一个最基础的 NLP 知识框架。后续 4.2 节会在此基础上,引入大规模 Transformer 语言模型及其在多模态、具身智能中的角色,从“会说话的模型”进一步走向“会理解、会行动的机器人大脑”。