符号约定沿用符号体系,新增:
符号 含义 词 出现在词 上下文中的次数 词 的总出现次数 词 出现在词 上下文中的概率 加权函数,控制高频词对的权重 GloVe 中词 作为中心词/上下文词的向量 GloVe 中词 和词 的偏置项
1. word2vec 的局限性:局部 vs 全局
word2vec 通过滑动窗口逐对处理词,本质上是局部上下文方法。考虑以下语料:
The cat sits on the mat. The dog sits on the mat. The cat and the dog play together.
word2vec 需要多次遍历窗口才能捕捉到”cat”和”dog”共享”sits”、“mat”等上下文——它无法直接利用”cat 和 dog 在所有句子中与哪些词共现了多少次”这一全局统计信息。
这引出了另一种思路:能否直接对全局共现矩阵建模?
2. GloVe:全局词向量
GloVe(Global Vectors)由 Pennington 等人于 2014 年提出,核心思想是:词向量应当编码全局共现统计中蕴含的语义关系。
2.1 共现概率比
首先构建一个 的共现矩阵 ,其中 表示词 在词 的上下文窗口中出现次数。定义共现概率:
GloVe 的关键洞察是:共现概率的比值比纯粹的概率值更能编码语义。考虑三个词 、 和探测词 :
| 探测词 | |||
|---|---|---|---|
| solid | 8.9 | ||
| gas | 0.094 | ||
| water | ≈ 1.0 | ||
| fashion | ≈ 1.0 |
- 当 与 ice 相关但不与 steam 相关(solid),比值 >> 1
- 当 与 steam 相关但不与 ice 相关(gas),比值 << 1
- 当 与两者都相关或都不相关(water, fashion),比值 ≈ 1
直观理解仅看 本身,你只知道”solid”偶尔出现在”ice”旁边。但比值 告诉你:solid 更偏向 ice 而不是 steam。这个”偏向”信息才是区分语义的关键。
word2vec 间接利用了这种信息(通过负采样让共现词的向量靠近),但 GloVe 直接对共现概率比建模。
2.2 模型
GloVe 希望词向量 和 的内积能够编码概率比:
这个等式来自以下推导:我们希望 近似 ,而 。引入偏置项 吸收 , 平衡对称性,最终得到上述形式。
损失函数为加权最小二乘:
其中加权函数 的设计非常关键:
典型参数:,。
加权函数的作用
- 低频词对( 小):权重小,因为统计不靠谱——“cat”和”quantum”可能只共现了 1 次,纯属巧合
- 高频词对( 大):权重截断为 1,防止”the”和”a”这种无意义高频词对主导训练
- 的幂次:在低频和高频之间平滑过渡,既不过度信任低频统计,也不被高频词对淹没
相比之下,word2vec 的负采样用 来处理类似问题,但 GloVe 的加权机制更精细——它直接作用于共现矩阵的每个元素。
2.3 GloVe vs word2vec
| 方面 | word2vec | GloVe |
|---|---|---|
| 统计视角 | 局部窗口,逐对训练 | 全局共现矩阵,一次性建模 |
| 训练方式 | 随机梯度下降,在线学习 | 加权最小二乘,可批量优化 |
| 稀有词 | Skip-gram 更好 | 依赖共现矩阵,稀疏时表现差 |
| 高频词 | 负采样截断 | 加权函数截断 |
| 并行性 | 较差(在线更新) | 较好(矩阵分解风格) |
实际应用中两者效果接近,但 GloVe 的全局视角使其在词类比任务上略优,word2vec 的局部视角使其在稀有词上略优。
3. 词嵌入的共同瓶颈:OOV 问题
word2vec 和 GloVe 都有一个根本限制:每个词必须有独立的向量。这意味着:
- 词汇表外的词(Out-Of-Vocabulary, OOV)无法处理
- “cat”和”cats”需要两个完全独立的向量,无法共享词根信息
- 对于形态丰富的语言(如土耳其语、芬兰语),词汇表爆炸
例如,传统词嵌入无法理解”unhappiness” = “un” + “happy” + “ness”——即使”happy”已经有了很好的向量。
4. 子词嵌入(Subword Embeddings)
4.1 fastText
fastText 的解决方案简单而有效:每个词表示为其字符 n-gram 向量之和。
以词 “where” 为例,加上边界标记 < 和 > 后变成 <where>。取 的字符 trigram:
<wh, whe, her, ere, re>词 “where” 的向量 = 所有 trigram 向量之和 + 词本身的向量。
这使得 fastText 能够:
- 处理 OOV:未见过的词 “wheres” 可以由 trigram
<wh, whe, her, ere, res, es>的向量和表示 - 共享词根:“where” 和 “wherever” 共享 trigram
whe, her, ere,向量自然相近 - 捕捉拼写规律:前缀、后缀、词根等形态信息自动编码在 n-gram 中
4.2 BPE(Byte Pair Encoding)
BPE 是当今 LLM 分词器的核心算法,minimind 使用的正是 BPE tokenizer。它从字符级别开始,通过迭代合并最频繁的字符对来构建子词词汇表。
算法流程:
- 初始化:词汇表 = 所有字符 + 结束符
- 统计所有相邻符号对的频率
- 合并频率最高的符号对为一个新符号
- 重复步骤 2-3,直到词汇表达到预设大小
具体例子:
初始语料(每个词后加 _ 表示词尾):
low_ lower_ lowest_ newer_ wider_字符级拆分:
l o w _ l o w e r _ l o w e s t _ n e w e r _ w i d e r _统计频率最高的相邻对:e r 出现 4 次 → 合并为 er:
l o w _ l o w er _ l o w e s t _ n e w er _ w i d er _继续:er _ 出现 3 次 → 合并为 er_:
l o w _ l o w er_ l o w e s t _ n e w er_ w i d er_继续:l o 出现 3 次 → 合并为 lo:
lo w _ lo w er_ lo w e s t _ n e w er_ w i d er_经过足够多次合并后,词汇表可能包含:low, er, est, er_, new, wid 等子词。
这样,“lowest” 被切分为 low + est,而 “lower” 被切分为 low + er,共享了词根 low。
BPE 与 LLM 分词器minimind 的 BPE tokenizer 词表大小为 6400,远小于 Qwen2(151,643)或 Llama 3(128,000),但这是小模型的有意设计——更小的词表意味着更小的 embedding 层和输出层,显著降低小模型的参数占比。
以 minimind-3 为例:,,embedding 层参数量 ,占总参数 的约 。如果使用 的词表,embedding 层将占用 ,占比飙升到 。
4.3 WordPiece 与 SentencePiece
| 方法 | 选择合并的准则 | 代表模型 |
|---|---|---|
| BPE | 频率最高 | GPT 系列、minimind |
| WordPiece | 最大似然提升() | BERT |
| Unigram | 从大词表开始,逐步剪枝 | SentencePiece(T5、LLaMA) |
WordPiece 与 BPE 类似,但合并时选择使训练数据似然提升最大的对,而非单纯频率最高。例如,un + ##affable 即使频率不高,但如果合并后大幅提升语言模型概率,也会被优先合并。
SentencePiece 将空格也视为普通字符(用 ▁ 表示),因此可以处理任何语言,并且分词是可逆的——直接拼接 tokens 即可还原原文。
5. 从子词嵌入到 BERT
子词嵌入解决了 OOV 问题,但仍然是静态的:同一个子词嵌入在所有上下文中保持不变。
下一节我们将看到 BERT 如何将子词嵌入与 Transformer 的上下文建模能力结合,为每个 token 生成上下文相关的表示——同一个词在不同句子中会有不同的向量。这是从”静态词向量”到”动态上下文表示”的关键跃迁。
参考文献
- Pennington, J., Socher, R., & Manning, C. (2014). GloVe: Global Vectors for Word Representation. EMNLP 2014.
- Bojanowski, P., et al. (2017). Enriching Word Vectors with Subword Information. TACL 2017.
- Sennrich, R., Haddow, B., & Birch, A. (2016). Neural Machine Translation of Rare Words with Subword Units. ACL 2016.