第 14 章 深度学习NLP词嵌入

自然语言处理:预训练

本章来源:本文整理自《动手学深度学习》(zh.d2l.ai)第 14 章《自然语言处理:预训练》,原书作者 Aston Zhang、李沐、Zachary C. Lipton、Alexander J. Smola。

本章讲什么

自然语言处理(NLP)要处理的是文字,而计算机无法直接处理文字,必须把词映射成数值向量。这一章讲"词嵌入"——如何让机器理解词义,以及里程碑式的 BERT 是如何预训练的。理解这一章,你就理解了今天大语言模型(GPT、BERT 等)背后的"预训练 + 微调"范式的起源。

词嵌入与 Word2Vec

计算机无法直接处理文字,需要把词映射为实数向量,这就是词嵌入(word embedding)

朴素做法是独热向量:一个词对应一个长度等于词表大小的 0/1 向量。但它很糟糕——任意两个不同词的独热向量余弦相似度恒为 0,完全无法表达词义相似度。"猫"和"狗"的向量跟"猫"和"汽车"的向量一样"不相似"。

Word2Vec自监督方式(无需人工标签,从语料本身构造监督信号)训练稠密向量,使语义相近的词向量相近。它含两个模型:

  • 跳元模型(Skip-Gram):用中心词预测周围的上下文词。
  • 连续词袋(CBOW):反过来,用上下文词的平均预测中心词。

Word2Vec 训练出的向量能捕捉相似性和类比关系(比如"国王"向量 - "男人"向量 + "女人"向量 ≈ "女王"向量),成为 NLP 的基础设施。

近似训练:解决计算瓶颈

Word2Vec 的 softmax 条件概率要对整个词表(几十万到上百万词)求和,每个训练步的梯度计算成本高得不可接受。两种近似方法:

  • 负采样:把"多分类"改成"二分类"——判断一个(中心词, 上下文词)对是否真的来自上下文窗口。对每个正样本随机采样 K 个噪声词作负样本,使每步成本从"与词表大小成正比"降为"与 K 成正比"。
  • 分层 softmax:把词表组织成二叉树(叶子是词),把对整个词表的 softmax 拆成从根到叶子的、对数深度个二分类,计算成本降为词表大小的对数级。

GloVe:利用全局统计

Word2Vec 逐条滑动窗口训练,浪费了语料库的全局统计信息。GloVe 的洞见是:词-词共现计数(全局统计,可预先算好)足以解释跳元模型的损失,且直接拟合这些统计更高效。

一个深刻的理解角度来自共现概率比值:给定"冰"和"蒸汽",词"固体"的概率比值很大(只跟冰相关)、"气体"很小、"水"接近 1——比值能刻画词间关系。GloVe 就是设计词向量函数去拟合这个比值。

子词嵌入

Word2Vec 和 GloVe 都忽略词的内部结构,导致 "helps/helped/helping"、"dog/dogs" 各学各的向量,稀有词和词典外词(OOV)表示差。英语动词有几十种变形、芬兰语名词有十几种变形——不拆词内部结构是明显局限。

  • fastText:子词级跳元模型。每个中心词用其全部字符 n-gram 子词的向量之和表示,结构相似的词共享子词参数,使罕见词、词表外词也能获得合理向量。
  • 字节对编码(BPE):解决"子词长度不固定、词表大小不可控"的问题。从单个字符起步,反复合并语料中最频繁的连续符号对,迭代出子词表。GPT-2、RoBERTa 都用 BPE 生成输入表示。

词的相似性与类比

预训练词向量训好后,可以直接用于两个"探针任务"验证其中蕴含的知识:

  • 词相似度:用 k 近邻 + 余弦相似度,找与查询词最相似的词。
  • 词类比:利用向量算术性质——"man:woman :: son:daughter" 可表述为 vec(son) + vec(woman) - vec(man) 最接近的词应是 vec(daughter)。类比还能捕捉句法信息(时态变化、首都-国家关系)。

"man:woman::son:daughter" 这类小学类比题,是理解"向量空间方向即语义关系"的最佳直觉。

BERT:双向编码

此前的词嵌入(Word2Vec/GloVe)是上下文无关的:同一个词无论什么语境都拿到同一向量,无法处理多义词——"a crane is flying"(鹤)和"a crane driver came"(吊车司机)里的 crane 含义完全不同。

演进逻辑:

  • ELMo:用双向 LSTM 把上下文编码进表示,效果好,但每个下游任务仍要单独设计架构。
  • GPT:用 Transformer 解码器做任务无关的通用模型,但语言模型的自回归特性使它只能从左到右看,无法同时利用左右两侧上下文。
  • BERT:把两者优点结合——用 Transformer 编码器双向编码,且对绝大多数 NLP 任务只需最小架构改动。

BERT 的输入表示是三种嵌入之和:词元嵌入 + 片段嵌入(区分两个句子)+ 可学习的位置嵌入,并插入特殊词元 <cls>(聚合整句信息)和 <sep>(分隔句子)。

BERT 预训练有两个自监督任务

  • 掩码语言模型(MLM):随机遮住 15% 词元,让模型用双向上下文预测。其中 80% 换成 <mask>、10% 换随机词、10% 保持原词(缓解预训练与微调不匹配)。
  • 下一句预测(NSP):判断第二句是否真是第一句的后续,建模句间逻辑关系。

预训练产出的是一份可复用的参数文件——这正是"预训练 + 微调"范式的核心。原始 BERT 在 8 亿词图书语料和 25 亿词维基百科上预训练,BERT_base 有 1.1 亿参数,BERT_large 有 3.4 亿参数。

小结

  • 词嵌入把词映射为稠密向量,让语义相近的词向量相近。
  • Word2Vec 用跳元模型和连续词袋自监督训练词向量。
  • 负采样和分层 softmax 解决对整个词表求和的瓶颈。
  • GloVe 直接拟合词-词共现统计,利用全局信息。
  • 子词嵌入(fastText、BPE)解决稀有词和词典外词问题。
  • 词向量能捕捉相似性和类比关系,是可复用的基础资源。
  • BERT 用 Transformer 编码器做双向编码,用掩码语言模型和下一句预测预训练,是"预训练 + 微调"范式的里程碑。

关键术语

术语 一句话解释
词嵌入 把词映射为稠密实数向量
独热向量 稀疏 0/1 表示,无法表达相似度
跳元模型 用中心词预测上下文词
连续词袋 用上下文词预测中心词
负采样 把多分类改成二分类加噪声样本
分层 softmax 二叉树路径上的二分类
GloVe 直接拟合共现统计的词嵌入
子词嵌入 把词切到子词级(fastText、BPE)
词类比 向量加减表达语义关系
BERT 双向编码的 Transformer 预训练模型
掩码语言模型 遮住词元让模型用双向上下文预测
下一句预测 判断第二句是否是第一句的后续
预训练 + 微调 先在大语料上预训练,再在小任务上微调