9.3 词嵌入与语义空间

上一节介绍了 Tokenizer 如何将文本切分成 Token 序列。本节深入探讨下一步:如何将这些 Token 转换成能够捕捉语义的数学向量——词嵌入(Word Embedding)技术如何实现语义表示。
9.3.1 从离散到连续:表示学习的动机
计算机处理文本的第一步是把文字转换成数字。最直观的方法是独热编码(One-hot Encoding)。
独热编码的工作方式
假设我们的词汇表只有五个词:「股票」「债券」「利率」「银行」「市场」。独热编码为每个词分配一个位置,用 0 和 1 表示:
股票 → [1, 0, 0, 0, 0]
债券 → [0, 1, 0, 0, 0]
利率 → [0, 0, 1, 0, 0]
银行 → [0, 0, 0, 1, 0]
市场 → [0, 0, 0, 0, 1]这种表示有三个严重问题:
维度灾难。真实的中文词汇表可能有几十万个词。每个词的向量长度就是词汇表大小——几十万维,绝大多数位置都是 0。这种稀疏表示存储效率极低,计算成本极高。
语义鸿沟。在独热编码中,「股票」和「债券」的距离与「股票」和「香蕉」的距离完全相同——都是两个不同的位置。编码没有捕捉到「股票」和「债券」都是金融资产这一语义关系。
泛化困难。如果模型学会了「股票价格上涨」这个模式,它无法自动推广到「债券价格上涨」,因为「股票」和「债券」在独热编码中毫无关联。
独热编码把每个词当作孤立的符号,丢失了词与词之间的语义关系。我们需要一种表示方法,让语义相近的词在数学空间中也彼此接近。
分布式表示的思路
与独热编码相反,分布式表示(Distributed Representation)用一组连续的实数来表示每个词。这组数字不再是只有一个位置为 1 的稀疏向量,而是每个维度都携带信息的稠密向量。
股票 → [0.82, -0.15, 0.43, ..., 0.21] (假设 300 维)
债券 → [0.79, -0.12, 0.38, ..., 0.18] (和股票很接近)
香蕉 → [-0.31, 0.67, -0.22, ..., 0.54] (和股票很远)分布式表示的核心优势在于:语义相似的词会被映射到向量空间中相近的位置。「股票」和「债券」的向量接近,因为它们在语义上相关;「股票」和「香蕉」的向量相距甚远,因为它们几乎没有语义联系。
表示学习的目标
表示学习(Representation Learning)的任务是:从大量文本数据中自动学习出这种有意义的向量表示。我们不需要手工定义「股票应该和债券接近」——让模型自己从语料中发现这种关系。
这正是词嵌入技术要解决的问题。
9.3.2 分布式假设:语义来自上下文
词嵌入的理论基础是分布式假设(Distributional Hypothesis)。
Firth 的经典论断
1957 年,英国语言学家 John Rupert Firth 提出了一个著名观点:
“You shall know a word by the company it keeps.” (通过一个词的伴随词,你就能了解这个词。)
这句话的含义是:一个词的意思由它经常出现的上下文决定。如果两个词总是出现在相似的上下文中,它们的意思就相近。
共现统计与语义相似性
考虑以下句子:
央行宣布下调存款准备金率
央行决定降低贷款利率
央行表示将保持流动性合理充裕「央行」这个词频繁与「宣布」「决定」「利率」「准备金」等词共同出现。另一个词「美联储」可能出现在类似的上下文中:
美联储宣布加息 25 个基点
美联储决定维持利率不变
美联储表示将继续缩表尽管「央行」和「美联储」是不同的词,但它们的上下文模式高度相似:都与「宣布」「决定」「利率」等词共现。根据分布式假设,这意味着它们在语义上相近——都是货币政策制定机构。
分布式假设的理论根源可以追溯到结构主义语言学。索绪尔(Ferdinand de Saussure)在 20 世纪初就提出:语言符号的意义来自它与其他符号的关系,而非符号本身。分布式假设是这一思想在计算语言学中的具体体现。
从假设到算法
分布式假设为词嵌入学习提供了方向:
- 统计每个词出现的上下文模式
- 上下文模式相似的词,赋予相似的向量表示
- 上下文模式不同的词,向量表示应当不同
接下来介绍的 Word2Vec 正是这一思想的经典实现。
9.3.3 Word2Vec:词嵌入的里程碑
2013 年,Google 的 Tomas Mikolov 等人发布了 Word2Vec,这是词嵌入技术的里程碑。它用一种高效的方式把分布式假设转化为可学习的模型。
两种训练架构
Word2Vec 提供了两种训练方式,思路互补:
CBOW(Continuous Bag of Words):用上下文预测中心词
给定一个词的周围词,预测这个词本身。例如:
上下文: [央行, 宣布, 存款, 准备金率]
目标词: 下调模型的任务是:看到「央行」「宣布」「存款」「准备金率」这些上下文词,预测中间空缺的词是「下调」。
Skip-gram:用中心词预测上下文
思路相反——给定中心词,预测它周围可能出现的词:
中心词: 下调
目标: 预测周围词是 [央行, 宣布, 存款, 准备金率]模型的任务是:看到「下调」这个词,预测它的上下文可能包含「央行」「准备金」等词。
两种方法各有优势:CBOW 训练更快,适合大规模语料;Skip-gram 对低频词的表示更准确,在较小语料上效果更好。
训练过程的直观理解
Word2Vec 的训练过程可以这样理解:
- 初始化:为词汇表中的每个词随机分配一个向量(比如 300 维)
- 预测:用当前向量进行预测任务(CBOW 或 Skip-gram)
- 对比:比较预测结果和真实答案
- 调整:如果预测错误,微调相关词的向量,使预测更准确
- 迭代:在大量文本上重复步骤 2-4
经过数十亿词的训练,语义相近的词的向量会逐渐聚集在一起。模型并不知道「股票」和「债券」都是金融资产——它只是发现这两个词总是出现在相似的上下文中,于是把它们的向量调整到相近的位置。
负采样:提升训练效率
Word2Vec 面临一个计算瓶颈:词汇表可能有几十万词,每次预测都要计算所有词的概率,计算量巨大。
负采样(Negative Sampling)解决了这个问题。它的思路是:不需要计算所有词的概率,只需要区分正确答案和随机选的错误答案。
例如,在 Skip-gram 中预测「下调」的上下文:
- 正样本:「准备金」确实出现在「下调」附近(应该预测为「是」)
- 负样本:随机选几个词如「香蕉」「电影」(应该预测为「否」)
模型只需要学会区分真正的上下文词和随机词,不需要在整个词汇表上做计算。这让 Word2Vec 能够在普通计算机上高效训练。
对于经管类学生,理解 Word2Vec 的核心思想比掌握数学细节更重要。关键点是:(1)语义来自上下文共现;(2)通过预测任务学习向量;(3)负采样让训练变得高效。不需要推导梯度公式或理解 softmax 归一化。
9.3.4 词向量的语义性质
训练好的词向量展现出多种有意义的语义性质。
相似词的向量接近
在向量空间中,语义相关的词会聚集在一起:
| 查询词 | 最近邻词(按余弦相似度) |
|---|---|
| 股票 | 股份、证券、股市、A 股、港股 |
| 利率 | 利息、基准利率、贷款利率、存款利率 |
| 通胀 | 通货膨胀、物价、CPI、涨价 |
| 央行 | 中央银行、人民银行、美联储、欧央行 |
这种聚类完全是从数据中自动学习的,没有人工标注「股票」和「股份」是近义词。
向量算术:语义关系的编码
Word2Vec 最著名的发现是向量算术(Vector Arithmetic)。词向量之间的加减运算能够捕捉语义关系:
king - man + woman ≈ queen
国王 - 男人 + 女人 ≈ 女王这个等式的含义是:从「国王」的向量中减去「男人」的向量,再加上「女人」的向量,得到的结果最接近「女王」的向量。
这说明词向量不仅捕捉了词的位置信息,还编码了词之间的语义关系。「国王」和「女王」的关系,与「男人」和「女人」的关系,在向量空间中呈现为相似的方向。
金融领域也存在类似的关系:
股票 - 买入 + 卖出 ≈ 做空
央行 - 中国 + 美国 ≈ 美联储
GDP - 总量 + 增速 ≈ 经济增长率词向量捕捉的语义关系类型
研究表明,词向量能够编码多种语义关系:
| 关系类型 | 示例 |
|---|---|
| 同义关系 | 利润 ≈ 盈利 |
| 上下位关系 | 银行 → 金融机构 |
| 部分整体 | 利息 → 贷款 |
| 属性关系 | 中国 : 北京 = 美国 : 华盛顿 |
| 动作对象 | 降息 : 利率 = 降准 : 准备金 |
词向量的局限性
静态词向量也有明显的局限:
多义词问题。「银行」既可以指金融机构,也可以指河岸。但在 Word2Vec 中,「银行」只有一个向量,无法区分不同含义。
上下文无关。词向量一旦训练完成就固定不变。无论「苹果」出现在「苹果公司发布新产品」还是「苹果富含维生素」中,它的向量都相同。
稀有词表示差。低频词的上下文样本少,学到的向量质量较差。专业术语、新词往往是低频词。
无法处理未登录词。词汇表之外的词(Out-of-Vocabulary,OOV)没有向量表示。
GloVe(Global Vectors for Word Representation)是斯坦福大学 2014 年提出的另一种词嵌入方法。与 Word2Vec 的预测思路不同,GloVe 直接对词共现矩阵进行分解。两者效果相近,但 GloVe 的训练更稳定。在实践中,两者常作为词嵌入的基准选择。
9.3.5 从静态词向量到上下文相关嵌入
Word2Vec 和 GloVe 都属于静态词向量——每个词有且只有一个固定的向量表示。这限制了它们处理多义词和上下文相关语义的能力。
上下文相关嵌入的思路
2018 年之后,一种新的思路兴起:不再为每个词分配固定向量,而是根据词所在的具体句子动态生成向量。
句子 1: "我去银行取钱"
句子 2: "河的银行长满了芦苇"
静态词向量:
银行 → [0.5, 0.3, ...] (两个句子相同)
上下文相关嵌入:
句子 1 中的"银行" → [0.8, 0.2, ...] (金融机构语义)
句子 2 中的"银行" → [-0.2, 0.7, ...] (河岸语义)同一个词「银行」,在不同句子中获得不同的向量。向量不再是词的属性,而是词在特定上下文中的语义表示。
技术演进脉络
上下文相关嵌入的发展经历了几个阶段:
| 阶段 | 代表模型 | 关键创新 |
|---|---|---|
| 静态词向量 | Word2Vec、GloVe | 分布式表示、向量算术 |
| 上下文嵌入初期 | ELMo(2018) | 双向 LSTM 生成上下文向量 |
| Transformer 时代 | BERT(2018) | 自注意力机制、预训练-微调范式 |
| 大语言模型 | GPT 系列、Claude | 大规模预训练、涌现能力 |
与 RAG 的关系
本章介绍的 RAG 系统使用的嵌入模型(如 bge-small-zh-v1.5、text-embedding-3-small)都是上下文相关嵌入模型。它们继承了 Word2Vec 的核心思想——语义相似则向量接近——但克服了静态词向量的局限。
当你把一段金融政策文本送入嵌入模型时,模型会:
- 读取整段文本,理解上下文
- 为这段文本生成一个向量,编码其语义信息
- 这个向量反映的是文本在当前上下文中的含义
这就是为什么向量检索能够实现语义搜索:查询「降准政策」和文档「下调存款准备金率」虽然字面不同,但它们的语义向量接近,因此能被检索到。