“Word2Vec”的版本间的差异
(→应用领域) |
|||
| 第5行: | 第5行: | ||
Word2Vec 由 Tomas Mikolov 及其团队于 2013 年在 Google Research 提出。Tomas Mikolov 在布尔诺理工大学(Brno University of Technology)完成了神经网络语言建模的博士研究后,加入 Google后,与 Kai Chen、Greg Corrado 和 Jeffrey Dean 等人合作,致力于大规模数据下的词表示学习问题。面对传统方法在大规模语料处理上的局限,Mikolov 团队提出了两种简洁高效的浅层神经网络架构,即 Continuous Bag-of-Words(CBOW)和 Continuous Skip-gram,统称为 Word2Vec。Word2Vec 实现了在数十亿词级别的数据上快速训练高质量词向量的目标,一经发布便在NLP领域引起了广泛关注和应用。 | Word2Vec 由 Tomas Mikolov 及其团队于 2013 年在 Google Research 提出。Tomas Mikolov 在布尔诺理工大学(Brno University of Technology)完成了神经网络语言建模的博士研究后,加入 Google后,与 Kai Chen、Greg Corrado 和 Jeffrey Dean 等人合作,致力于大规模数据下的词表示学习问题。面对传统方法在大规模语料处理上的局限,Mikolov 团队提出了两种简洁高效的浅层神经网络架构,即 Continuous Bag-of-Words(CBOW)和 Continuous Skip-gram,统称为 Word2Vec。Word2Vec 实现了在数十亿词级别的数据上快速训练高质量词向量的目标,一经发布便在NLP领域引起了广泛关注和应用。 | ||
| − | + | ==='''GloVe(Global Vectors for Word Representation)'''=== | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | ===''' | ||
==== 背景: ==== | ==== 背景: ==== | ||
| 第249行: | 第59行: | ||
·支持线性类比关系,类似 Word2Vec(如“king - man + woman ≈ queen”) | ·支持线性类比关系,类似 Word2Vec(如“king - man + woman ≈ queen”) | ||
| − | === | + | === FastText === |
==== 背景: ==== | ==== 背景: ==== | ||
| 第302行: | 第112行: | ||
应用场景广泛:在文本分类、命名实体识别、搜索排序、拼写纠错、推荐系统中广泛使用; | 应用场景广泛:在文本分类、命名实体识别、搜索排序、拼写纠错、推荐系统中广泛使用; | ||
| − | === | + | === BERT 模型 === |
==== 背景: ==== | ==== 背景: ==== | ||
| 第357行: | 第167行: | ||
与 Word2Vec/GloVe 对比:Word2Vec/GloVe 生成的是固定词向量、语境无关,BERT 输出的是上下文相关的词表示,能捕捉复杂句法语义关系; | 与 Word2Vec/GloVe 对比:Word2Vec/GloVe 生成的是固定词向量、语境无关,BERT 输出的是上下文相关的词表示,能捕捉复杂句法语义关系; | ||
| − | === | + | === 动态词嵌入( ELMo): === |
==== 背景: ==== | ==== 背景: ==== | ||
2025年6月8日 (日) 16:09的版本
Word2Vec 是一种将词语(Word)映射为连续向量(Vector)的高效建模技术,由 Google 的 Tomas Mikolov 团队于 2013 年提出。通过在大规模文本语料中自动学习,Word2Vec 将每个词表示为一个低维、稠密、连续的向量(Embedding),这种向量能够捕捉词语之间的语义和句法关系。与传统将词视为离散 ID 的方法(如 N-gram)不同,Word2Vec 将词嵌入到连续空间中,相似意义的词在向量空间中距离更近,为后续复杂模型(如 Transformer)奠定了基础。
Word2Vec 的底层是一个浅层神经网络,采用 Skip-gram 或 Continuous Bag-of-Words(CBOW)两种架构进行训练。训练后得到的词向量(Word Embedding)被广泛应用于自然语言处理(NLP)任务中,包括机器翻译(Machine Translation)、信息检索(Information Retrieval)、文本分类(Text Classification)和情感分析(Sentiment Analysis)等,成为当前 NLP 领域的重要基础方法之一。
历史背景
Word2Vec 由 Tomas Mikolov 及其团队于 2013 年在 Google Research 提出。Tomas Mikolov 在布尔诺理工大学(Brno University of Technology)完成了神经网络语言建模的博士研究后,加入 Google后,与 Kai Chen、Greg Corrado 和 Jeffrey Dean 等人合作,致力于大规模数据下的词表示学习问题。面对传统方法在大规模语料处理上的局限,Mikolov 团队提出了两种简洁高效的浅层神经网络架构,即 Continuous Bag-of-Words(CBOW)和 Continuous Skip-gram,统称为 Word2Vec。Word2Vec 实现了在数十亿词级别的数据上快速训练高质量词向量的目标,一经发布便在NLP领域引起了广泛关注和应用。
GloVe(Global Vectors for Word Representation)
背景:
GloVe 是由斯坦福大学的 Jeffrey Pennington、Richard Socher 和 Christopher D. Manning 于 2014 年提出,旨在结合传统基于计数的模型(如 LSA)和 Word2Vec 的优势,提出一种高效的全局词向量训练方法。
技术原理:
GloVe 是一种基于全局共现信息来学习词向量的方法,与 Word2Vec 不同,它不依赖上下文窗口中的预测任务,而是采用词与词之间在整个语料库中共现频率的统计信息来构造词语之间的关系。
GloVe 的设计灵感来自以下关键观察:词语的语义关系可以通过它们与其他词共现的比例来表达,而不是仅通过是否共现或是否邻近。例如,“ice” 和 “steam” 都与 “water” 有很强的共现关系,但 “ice” 更倾向与 “cold” 共现,而 “steam” 更倾向与 “hot” 共现。GloVe 试图让词向量之间的差异或比例能反映出这种语义关系。
在训练之前,GloVe 首先对整个语料库构建一个 共现矩阵[math]\displaystyle{ X }[/math]:
·每个元素 [math]\displaystyle{ X_{ij} }[/math] 表示词[math]\displaystyle{ j }[/math]在词 [math]\displaystyle{ i }[/math] 的上下文窗口中出现的次数;
·矩阵是稀疏且高维的,规模为 [math]\displaystyle{ V \times V }[/math],其中 [math]\displaystyle{ V }[/math] 是词汇表大小。
GloVe 的一个重要设计理念是:两个词之间的语义关系可由它们对其他词的共现比值刻画。对于一个目标词 [math]\displaystyle{ i }[/math],考虑两个上下文词 [math]\displaystyle{ j }[/math] 和 [math]\displaystyle{ k }[/math],如果 [math]\displaystyle{ i }[/math] 与 [math]\displaystyle{ j }[/math] 的共现频率远高于与 [math]\displaystyle{ k }[/math],则两者在语义上的关联也会不同。
定义贡献概率为:
[math]\displaystyle{ P_{ik} = \frac{X_{ik}}{\sum_{k'} X_{ik'}} }[/math]
GloVe 期望通过学习得到的词向量 [math]\displaystyle{ w_i }[/math],能使词之间的向量关系满足下列公式形式:
[math]\displaystyle{ F(\mathbf{w}_i, \tilde{\mathbf{w}}_j, X_{ij}) = \mathbf{w}_i^\top \tilde{\mathbf{w}}_j + b_i + \tilde{b}_j \approx \log X_{ij} }[/math]
即目标是让词向量的点积加上偏置项逼近共现频率的对数值,而不是原始频数,后者变化范围太大。
为了实现上述目标,GloVe 构建了以下加权平方误差损失函数:
[math]\displaystyle{ J = \sum_{i,j=1}^{V} f(X_{ij}) \cdot \left( \mathbf{w}_i^\top \tilde{\mathbf{w}}_j + b_i + \tilde{b}_j - \log X_{ij} \right)^2 }[/math]
其中:
[math]\displaystyle{ X_{ij} }[/math]: 词 [math]\displaystyle{ i }[/math] 和 [math]\displaystyle{ j }[/math] 的共现次数;
[math]\displaystyle{ \mathbf{w}_i }[/math] 、[math]\displaystyle{ \tilde{\mathbf{w}}_j }[/math] : 词向量;
[math]\displaystyle{ f(x) }[/math]:权重函数(防止高频词主导优化);
[math]\displaystyle{ b_i }[/math] , [math]\displaystyle{ {b}_j }[/math]:偏置项。
这个函数可以防止高频词主导模型训练,也避免了低频词对整体模型质量的影响。
总结与对比:
·不同于 Word2Vec:Word2Vec 是基于预测任务(局部上下文窗口);而 GloVe 是基于矩阵分解(全局共现频率);
·相比传统 LSA(SVD):GloVe 使用非线性权重函数,训练时不需要全局矩阵分解,更高效;
·适合全局语义关系建模,尤其在大规模语料训练中表现优异;
·支持线性类比关系,类似 Word2Vec(如“king - man + woman ≈ queen”)
FastText
背景:
FastText 是由 Facebook AI Research 的 Armand Joulin、Tomas Mikolov 等人于 2016 年提出,旨在解决 Word2Vec 模型在处理罕见词、词形变化(如复数、时态)等方面的能力不足。其核心理念是在训练过程中引入子词信息,以增强词向量对形态的建模能力。
技术原理:
FastText 的核心思想是:将词视为子词(subword)n-gram 的组合体,而不是独立的原子单位。这一设计增强了模型对罕见词、形态变化词以及未登录词(OOV)的表示能力。
·子词建模(Subword Embedding):
每个单词 [math]\displaystyle{ w }[/math] 被划分为若干个字符 n-gram,例如设置 n = 3~6 时:
对于词 “where”,首先在其两端添加边界符号(如 < 和 >),构成:<where>,然后提取字符 n-gram 得到: <wh, whe, her, ere, re>,包括完整词本身 "where",最终表示为一个 n-gram 集合 [math]\displaystyle{ G_w }[/math]。
词向量的表示为其所有 n-gram 向量的平均或和:
[math]\displaystyle{ v_w = \sum_{g \in G} w_g z_g }[/math]
其中:
[math]\displaystyle{ z_g }[/math] 是 n-gram [math]\displaystyle{ g }[/math] 的嵌入向量;
[math]\displaystyle{ G_w }[/math] 是词 [math]\displaystyle{ w }[/math] 的所有子词集合。
这种表示方式让模型在遇到未登录词时,也可以通过其组成子词获取合理向量。
·模型结构与训练:
FastText 延续了 Word2Vec 的 Skip-gram 架构,但输入词不再是 one-hot 编码的词本身,而是其所有 n-gram 的组合。训练目标为:给定中心词(子词组合向量),预测其上下文词。即最大化如下目标函数:
[math]\displaystyle{ L_{\text{Skip-gram}} = \sum_{(w_t, w_o) \in D} \left[ \log \sigma\left( \mathbf{v}_{w_o}^\top \mathbf{v}_{w_t} \right) + \sum_{i=1}^{k} \mathbb{E}_{w_i' \sim P_n(w)} \log \sigma\left( -\mathbf{v}_{w_i'}^\top \mathbf{v}_{w_t} \right) \right] }[/math]
其中:
[math]\displaystyle{ w }[/math] 是由子词构成的中心词向量;
[math]\displaystyle{ v_{wo} }[/math] 是上下文词向量;
负采样 [math]\displaystyle{ P_n(w) }[/math] 用于高效近似 softmax。
FastText 的训练过程本质上是端到端地联合优化所有子词的向量表示,以提升整体语义建模能力。
总结与对比:
子词增强表示能力:FastText 通过引入 n-gram,有效表示未登录词与形态变化词;
面向多语言与拼写多样化语言(如芬兰语、德语)效果显著优于 Word2Vec;
与 Word2Vec 相比:Word2Vec 只能对词表中出现过的词进行建模,FastText 可泛化到未出现的新词,具备更强的鲁棒性与泛化能力;
与 GloVe 相比:GloVe 基于全局共现信息构建稠密表示,适合静态建模,FastText 基于局部上下文与子词结构,适合细粒度语义与动态扩展;
应用场景广泛:在文本分类、命名实体识别、搜索排序、拼写纠错、推荐系统中广泛使用;
BERT 模型
背景:
BERT 是由 Google AI Language 团队于 2018 年提出的一种预训练语言表示模型,发表在论文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》中。该模型首次将 深度双向 Transformer 编码器 应用于语言建模任务,并通过大规模语料上的预训练 + 微调机制,在多个自然语言处理任务上取得了 SOTA(state-of-the-art)成绩。
BERT 的设计动机是解决传统语言模型(如 Word2Vec、GloVe)在上下文建模、语义歧义处理和句子级理解方面的不足,特别是在建模“一个词在不同上下文中含义不同”这一关键问题。
技术原理:
·基础架构:Transformer Encoder:
BERT 构建在 Transformer 架构之上,具体使用了 多层 Transformer 编码器堆叠(通常 BERT-base 为 12 层,BERT-large 为 24 层)。Transformer 由 Vaswani 等人在 2017 年提出,其最大特点是 完全基于注意力机制(Self-Attention),无需使用 RNN 或 CNN,可并行处理任意长度的输入。
每层包含:
多头自注意力机制(Multi-Head Self-Attention);
前馈神经网络(Feed-Forward Layer);
残差连接 + 层归一化。
Transformer 中每个词的表示会综合考虑所有其他词对它的影响,因此能捕捉复杂的依赖结构。
·输入方式表示:
BERT 的输入不只是单词序列,而是词 + 位置 + 句子类型三重嵌入之和:Input Embedding = Token Embedding + Position Embedding + Segment Embedding
例如用于句子对任务(如问答)时,Segment A 表示第一句话,Segment B 表示第二句话。输入序列结构为:[CLS] 句子A [SEP] 句子B [SEP],其中[CLS] 用于分类任务的特殊标记;[SEP] 是句子分隔符。
·预训练阶段:
BERT 采用两种 自监督学习任务在大规模语料(如 Wikipedia 和 BooksCorpus)上进行训练:
(1)Masked Language Model(MLM):随机遮蔽输入序列中约 15% 的词,模型需预测被 []MASK 替换的词是什么,本质上是一个多分类任务:
[math]\displaystyle{ L_{\text{MLM}} = - \sum_{i \in M} \log P(w_i \mid x_{\text{masked}}) }[/math]
(2)Next Sentence Prediction(NSP):输入两个句子 A 和 B,任务是判断 B 是否是 A 的真实下一句,是一个二分类任务:
[math]\displaystyle{ L_{\text{NSP}} = -\log P(\text{IsNext} \mid A, B) }[/math]
·微调阶段:
在预训练后,BERT 可被快速迁移到下游任务,如:文本分类(情感分析)、序列标注(命名实体识别)、问答系统,只需在最后加上一层简单的任务特定结构,并用少量数据进行微调即可。
总结与对比:
深度双向建模:BERT 同时利用左上下文与右上下文,解决传统语言模型单向建模的局限;
动态词表示:同一个词在不同句子中的表示不同,能处理多义词与上下文依赖;
Transformer 架构支持全局依赖建模,相比 RNN 更并行高效;
统一多任务结构:BERT 能处理分类、标注、问答等多类任务,具备高度迁移能力;
与 Word2Vec/GloVe 对比:Word2Vec/GloVe 生成的是固定词向量、语境无关,BERT 输出的是上下文相关的词表示,能捕捉复杂句法语义关系;
动态词嵌入( ELMo):
背景:
LMo(Embeddings from Language Models)是由 Allen Institute for AI(AI2)的 Matthew Peters 等人在 2018 年 NAACL 上提出的预训练词嵌入方法。ELMo 是 NLP 中首个大规模应用上下文动态词向量的模型,突破了 Word2Vec 和 GloVe 中“一个词一个向量”的静态表示限制。其提出背景在于自然语言中存在大量多义词与语义歧义现象(如 "bank" 表示“银行”或“河岸”),传统静态词向量模型无法根据上下文动态调整词的含义表示。而 ELMo 利用双向语言模型(BiLM)捕捉词的上下文依赖关系,为每个词生成可变的、语境敏感的表示。
技术原理:
ELMo 基于传统语言模型(Language Model, LM),但引入了以下三个关键技术点:
·双向语言模型(BiLM):
一个正向语言模型(从左到右):[math]\displaystyle{ P(w_1, w_2, \ldots, w_T) = \prod_{t=1}^{T} P(w_t \mid w_1, \ldots, w_{t-1}) }[/math]
一个反向语言模型(从右到左):[math]\displaystyle{ P(w_T, \ldots, w_1) = \prod_{t=1}^{T} P(w_t \mid w_{t+1}, \ldots, w_T) }[/math]
这两个模型均使用深层 LSTM(Long Short-Term Memory) 网络进行建模,层数通常为两层。
·多层表示聚合机制:
ELMo 并不是仅提取 LSTM 的最后一层输出作为词向量,而是将所有层的隐状态按照加权方式聚合,从而获得更加丰富的语义特征。
每个词的 ELMo 表示由以下公式给出:
[math]\displaystyle{ \text{ELMo}(w_t) = \gamma \sum_{j=0}^{L} s_j \cdot \mathbf{h}_t^{(j)} }[/math]
其中:
[math]\displaystyle{ \mathbf{h}_t^{(j)} }[/math] 表示第 [math]\displaystyle{ j }[/math] 层对词 [math]\displaystyle{ w_t }[/math] 的隐状态,是前向和后向语言模型的连接结果。
[math]\displaystyle{ s_j }[/math] 是第[math]\displaystyle{ j }[/math]层的可学习权重,表示该层对最终表示的贡献程度;
[math]\displaystyle{ γ }[/math] 是可学习缩放因子,控制整体表示的幅度。
·训练与迁移使用:
ELMo 先在大规模语料上训练语言模型(如 1 Billion Word Benchmark),然后将训练好的表示迁移到下游任务中,并在下游任务中联合微调(fine-tune)其权重[math]\displaystyle{ s_j }[/math],[math]\displaystyle{ γ }[/math]。这种机制大幅提高了模型对语境、词义变化的感知能力,适用于情感分类(Sentiment Analysis)、问答系统(QA)和自然语言推理(NLI)。
总结与对比:
上下文敏感词向量:ELMo 是首个提供每个词在不同上下文中动态表示的预训练词嵌入;
双向语言模型建模上下文:同时考虑前文与后文,有效捕捉语言结构与语义;
与 Word2Vec/GloVe 对比:ELMo 输出的词向量会随句子变化,是“动态词向量”;
与 BERT 对比:BERT 使用 Transformer 架构,具备更强建模能力,训练代价更高,ELMo 使用 LSTM 架构,计算成本相对较低,更适合中小规模任务。
开源实现与工具
- Gensim 库
- TensorFlow / PyTorch 实现
- 原始 C 语言实现(Google Code)