2、经典词向量模型:Word2Vec、GloVe 与 FastText

说到词向量,咱们得从最经典的几个模型聊起。Word2Vec、GloVe 和 FastText,这三兄弟基本奠定了现代 NLP 的基石。我当年刚入行时,第一个上手的项目就是用 Word2Vec 做电商评论的情感分析,踩了不少坑,也积累了些经验。今天咱们就把它们的原理和特点掰开揉碎了讲清楚。

2.1 Word2Vec:两种核心思路

Word2Vec 是 Google 在 2013 年推出的,核心思想就一句话:一个词的意思,由它周围的词决定。这其实源于语言学里的“分布假说”。Word2Vec 给出了两种实现方式:CBOW 和 Skip-gram。

2.1.1 CBOW(Continuous Bag of Words)

CBOW 的思路很直接:用上下文词预测当前词。比如句子“我/喜欢/吃/苹果”,如果窗口大小为 2,那么用“我”、“喜欢”、“吃”来预测“苹果”。

具体怎么做呢?模型会把上下文词的 one-hot 向量分别乘以一个共享的权重矩阵 W,得到各自的词向量,然后取平均,再经过另一个权重矩阵 W' 和 softmax,输出每个词作为中心词的概率。训练的目标就是让正确词的概率最大。

我的经验:CBOW 训练速度更快,对高频词效果不错。但如果你语料里低频词很多,CBOW 的表现会差一些。我曾在某个垂直领域的小语料上试过,CBOW 对专业术语的向量质量明显不如 Skip-gram。

2.1.2 Skip-gram

Skip-gram 正好反过来:用当前词预测上下文词。还是那个句子,给定“苹果”,模型要预测出“我”、“喜欢”、“吃”。

它的训练过程是:把中心词的 one-hot 向量乘以 W 得到词向量,然后乘以 W' 得到对每个上下文词的预测概率。每个中心词会对应多个上下文词,所以损失函数要对所有上下文词求和。

Skip-gram 的优点是:对低频词更友好。因为每个低频词作为中心词时,会迫使模型去学习它和周围词的关系,相当于给了它更多“露脸”的机会。

选型建议:
  • 语料大、计算资源有限 → 选 CBOW
  • 语料小、低频词多、对质量要求高 → 选 Skip-gram

2.2 GloVe:融合全局统计

Word2Vec 虽然好用,但它有个问题:只用了局部窗口内的共现信息。说白了,它只看一个词周围几个词的关系,忽略了整个语料库的全局统计。

GloVe(Global Vectors)就是来解决这个问题的。它的核心思想是:词向量应该能还原出词与词之间的共现概率比。

具体来说,GloVe 先统计整个语料库的“词-词共现矩阵”,矩阵里的每个元素 X_ij 表示词 i 和词 j 在某个窗口内共同出现的次数。然后模型学习两个词向量,使得它们的点积加上偏置项,能拟合共现次数的对数。

损失函数长这样:

J = Σ f(X_ij) * (w_i · w̃_j + b_i + b̃_j - log(X_ij))²

其中 f 是一个权重函数,用来降低高频共现的权重,避免“the”、“a”这类词主导训练。

我曾经踩过的坑:GloVe 需要先构建共现矩阵,如果语料很大(比如几十 GB),这个矩阵会非常稀疏且巨大。我当时用 16GB 内存的机器跑 10GB 的新闻语料,直接 OOM 了。后来改用内存映射和分块计算才搞定。所以,用 GloVe 前一定评估好你的硬件。

GloVe 和 Word2Vec 的对比,我整理了个表格:

维度 Word2Vec GloVe
核心思想 局部上下文预测 全局共现统计
训练方式 神经网络(预测任务) 加权最小二乘(拟合任务)
数据利用 滑动窗口内共现 全语料共现矩阵
训练速度 快(尤其是 CBOW) 中等(需先构建矩阵)
低频词效果 Skip-gram 较好 一般
内存占用 低 高(共现矩阵)

2.3 FastText:解决 OOV 问题

Word2Vec 和 GloVe 有个共同的硬伤:遇到没见过的词(OOV,Out-of-Vocabulary)就傻眼了。你想想看,如果模型训练时没见过“”,那这个词的向量就是零,或者随机初始化,下游任务直接崩。

FastText 的解决方案很巧妙:把词拆成字符级别的 n-gram。比如“apple”,如果 n=3,会拆成 "ap", "app", "ppl", "ple", "le" 这些子串。每个子串学一个向量,词的最终向量就是所有子串向量的和。

这样做的好处是:即使“”没出现过,但“Chat”和“”的子串可能见过,模型就能拼凑出它的向量。说白了,FastText 学到了词的“拼写规律”。

我个人的习惯:在做中文任务时,FastText 的字符 n-gram 对处理未登录词特别有用。比如“新冠”这个词,虽然训练语料里可能没有,但“新”和“冠”的 n-gram 信息能帮模型猜出它和“病毒”、“疫情”相关。

FastText 的另一个特点是:训练速度极快。它用了一个层级 softmax 和负采样技巧,加上 n-gram 的哈希技巧,能在几小时内处理百亿级别的词。

2.4 三者的核心区别

咱们用一张图来总结这三个模型的核心逻辑:

经典词向量模型核心逻辑对比 Word2Vec 局部上下文预测 CBOW 上下文 → 中心词 Skip-gram 中心词 → 上下文 特点:训练快,低频词弱 特点:低频词好,训练慢 GloVe 全局共现统计 共现矩阵 统计全语料共现次数 拟合 log(X_ij) 特点:利用全局统计 特点:内存占用高 特点:低频词效果一般 FastText 字符 n-gram 子词拆分 apple → ap, app, ppl... 子串向量求和 特点:解决 OOV 问题 特点:训练速度极快 特点:对拼写敏感 三者都是静态词向量,每个词只有一个固定向量,无法处理一词多义

2.5 实际选型建议

说了这么多,到底该用哪个?我根据项目经验总结了几条:

  1. 通用场景,语料大:用 Word2Vec 的 Skip-gram。训练快,效果稳定。
  2. 需要全局语义关系:用 GloVe。它在类比任务(如“国王-王后=男人-女人”)上表现更好。
  3. 有大量未登录词或拼写变体:用 FastText。比如社交媒体文本、专业术语多的领域。
  4. 资源受限:用 Word2Vec 的 CBOW。内存和训练时间都最省。
注意:这三个模型生成的都是静态词向量。什么意思?就是每个词只有一个固定的向量,不管它出现在什么语境里。比如“苹果”这个词,在“吃苹果”和“苹果手机”里向量是一样的。这个问题直到 BERT 等动态模型才解决,咱们后面会讲到。