“Word2Vec”的版本间的差异
(→技术原理:) |
|||
| 第307行: | 第307行: | ||
===== 技术原理: ===== | ===== 技术原理: ===== | ||
| + | |||
| + | ====== ·基础架构: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>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>L_{\text{NSP}} = -\log P(\text{IsNext} \mid A, B) | ||
| + | |||
| + | </math> | ||
| + | |||
| + | ====== ·微调阶段: ====== | ||
| + | 在预训练后,BERT 可被快速迁移到下游任务,如:文本分类(情感分析)、序列标注(命名实体识别)、问答系统,只需在最后加上一层简单的任务特定结构,并用少量数据进行微调即可。 | ||
===== 总结与对比: ===== | ===== 总结与对比: ===== | ||
| + | 深度双向建模:BERT 同时利用左上下文与右上下文,解决传统语言模型单向建模的局限; | ||
| + | |||
| + | 动态词表示:同一个词在不同句子中的表示不同,能处理多义词与上下文依赖; | ||
| + | |||
| + | Transformer 架构支持全局依赖建模,相比 RNN 更并行高效; | ||
| + | |||
| + | 统一多任务结构:BERT 能处理分类、标注、问答等多类任务,具备高度迁移能力; | ||
| + | |||
| + | 与 Word2Vec/GloVe 对比:Word2Vec/GloVe 生成的是固定词向量、语境无关,BERT 输出的是上下文相关的词表示,能捕捉复杂句法语义关系; | ||
==== 动态词嵌入(如 ELMo) ==== | ==== 动态词嵌入(如 ELMo) ==== | ||
2025年6月8日 (日) 15:34的版本
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领域引起了广泛关注和应用。
N-gram 模型
N-gram模型基于一种简化的假设,即一个词的出现概率只依赖于它前面有限数量的词,而不是整个句子的全部历史。通过这种方式,语言建模问题被大大简化,可以通过局部上下文来近似建模词与词之间的关系。在N-gram模型中,"N"指的是窗口的大小。例如,当N为2时,称为二元模型(bigram),意味着每个词的出现只依赖于它前面的一个词;当N为3时,称为三元模型(trigram),每个词的出现依赖于前面两个词。为了建立这样的模型,通常需要在大量文本数据中统计各类词序列的出现频率,根据频率来估计词与上下文之间的关联强度。N-gram模型的基本思想非常直接:频繁一起出现的词组会被赋予较高的联合出现概率,从而在生成或理解语言时优先考虑。
由于自然语言极其丰富和多样,哪怕拥有大规模的训练语料,许多合理的词序列也未必在数据中出现过。因此,N-gram模型面临数据稀疏的问题。为了缓解这一问题,研究者们提出了各种平滑技术,为未出现过的词组分配合理的小概率。此外,N-gram模型还有其他局限,比如它只能建模固定长度的上下文,难以捕捉长距离的依赖关系;并且当N值增大时,模型的参数数量也会迅速膨胀,导致存储和计算成本变得很高。因此,在实际应用中通常只采用二元或三元模型,以在建模效果和计算资源之间取得平衡。
N-gram模型在统计语言建模、语音识别、机器翻译、信息检索等多个领域中长期发挥着基础性作用。它不仅为自然语言处理技术的发展奠定了重要的理论和实践基础,还启发了后续更加复杂、表达能力更强的语言建模方法。作为自然语言处理演进过程中不可或缺的一步,N-gram模型至今仍在许多简单任务中发挥着实际价值,并以其简洁有效的方法论为后续研究提供了重要借鉴。
潜在语义分析(Latent Semantic Analysis, LSA)
1990 年提出的 LSA 是最早试图从统计信息中抽取语义结构的方法。旨在从大规模文本数据中自动抽取潜在的语义结构。LSA 的核心思想是:词语的含义可以通过它们在不同文档中的共现模式来推断。具体来说,LSA 首先构建一个词-文档共现矩阵,矩阵中的每一行对应一个词,每一列对应一篇文档,矩阵元素表示词在文档中出现的频率或加权频率。为了从这种高维稀疏矩阵中提取有用的语义信息,LSA 采用了奇异值分解(Singular Value Decomposition, SVD)技术,将原始矩阵分解为三个矩阵的乘积,并截断只保留最大的若干个奇异值。这一降维过程使得词语和文档可以被映射到一个低维连续空间,在这个空间中,语义上相似的词和文档会被映射到彼此接近的位置。
LSA 的优势在于它能在一定程度上缓解词义多样性(polysemy)和同义性(synonymy)问题,揭示出词语之间的隐含关联关系。特别是在小到中等规模的语料库上,LSA 能够有效提取出有意义的语义结构,并在文档检索、文本分类等早期应用中取得了良好的效果。然而,LSA 也存在显著的局限性。首先,LSA 是一种无监督统计方法,它不区分不同类型的语义关系,容易混合不相关的信息。其次,由于 SVD 分解需要对整个共现矩阵进行全局运算,当词表规模和文档数量巨大时(如百万级、十亿级词量),计算成本极高且内存占用极大,在大规模语料上难以实际应用。
神经网络语言模型(Neural Network Language Model, NNLM)
进入 2000 年代,随着神经网络方法的发展,Yoshua Bengio 等人在 2003 年提出了神经网络语言模型(Neural Network Language Model, NNLM),这是第一个显式将词语表示为连续向量并联合训练语言建模任务的框架。在传统的 N-gram 语言模型中,词语被作为离散的符号处理,缺乏内部结构,无法体现词语之间的语义联系。而 NNLM 首次提出将每个词映射为一个低维稠密向量,并通过神经网络在端到端训练中自动优化这些词向量,能够有效捕捉词序和上下文信息。其基本结构包括一个输入层,将上下文词以 one-hot 向量形式编码;一个嵌入层,将稀疏编码映射到连续空间形成词向量;一个非线性隐藏层,建模上下文特征;以及一个输出层,生成词表中下一个词的概率分布。通过这种方式,NNLM 不仅提升了语言模型的预测性能,还首次引入了“词嵌入”(Word Embedding)这一重要概念,为后续自然语言处理方法的发展奠定了基础。但NNLM 由于模型包含复杂的非线性变换,同时输出层需计算整个词表大小的概率分布,使得训练过程在大规模语料上极为缓慢,计算开销和内存需求极高。此外,NNLM通常只能处理固定长度的上下文,限制了对长程依赖的建模能力。
为了克服传统神经网络语言模型(NNLM)只能建模固定长度上下文的局限,递归神经网络语言模型(Recurrent Neural Network Language Model, RNNLM)被提出。RNNLM 由 Tomas Mikolov 等人在 2010 年提出,其核心思想是通过递归连接隐藏层,使得网络在处理当前输入词时,能够同时参考前一时刻的隐藏状态,从而理论上具备建模任意长度上下文依赖的能力。在 RNNLM 中,每个时间步输入当前词的嵌入表示,并结合前一时刻的隐藏层状态,通过共享的隐藏权重矩阵更新新的隐藏状态,进而预测下一个词的概率分布。与 NNLM 的静态上下文窗口不同,RNNLM 的隐藏层作为一种动态记忆,可以不断累积和更新序列信息,因此更加灵活,能够捕捉到语言中远距离的依赖关系。RNNLM 的出现显著提升了语言建模的表达能力,使得模型能够更自然地处理复杂的语言现象,例如主谓一致、跨句关系等。然而,RNNLM 也存在明显的效率问题。由于递归连接的特性,每一步的隐藏状态更新都依赖前一步的计算结果,导致训练过程必须严格顺序进行,难以并行加速。同时,RNNLM 在每一个时间步都需要进行大规模矩阵乘法运算,尤其在输出层面对大词表进行归一化时,计算量和存储需求依然非常巨大。此外,传统的基本 RNN 结构在实际应用中还容易遭遇梯度消失或梯度爆炸的问题,使得模型在处理很长序列时训练变得困难。
技术原理
Word2vec 的目的在于为每个词汇都分配一个稠密的向量,能够做到相比传统的稀疏向量(如 one-hot 编码),更具表达能力和计算效率。形式上也就是,如果词汇表为 [math]\displaystyle{ V }[/math],每个词 [math]\displaystyle{ w\inV }[/math] 被映射为向量 [math]\displaystyle{ \mathbf{v}_w \in \mathbb{R}^d }[/math],其中 [math]\displaystyle{ d \ll |V| }[/math]。
Word2vec使用两种模型架构中的任何一种来生成词汇的分布式表示:连续词袋模型(CBOW)或Skip-gram。在这两种架构中,word2vec 在遍历语料库时都会考虑单个词和滑动上下文窗口,这种设计来源于分布式假设,由语言学家 Zellig Harris 在1954年提出。它的核心思想是:“上下文相似的词具有相似的意义”(You shall know a word by the company it keeps)。即如果两个词在相似的上下文中出现,那么它们的意义可能也相似。
CBOW 可被视为一项 "填空 "任务,其中词汇嵌入代表了词汇影响上下文窗口中其他词汇相对概率的方式。语义相似的词应该以相似的方式影响这些概率,因为语义相似的词应该在相似的语境中使用。上下文词语的顺序不会影响预测(词袋假设)。
Skip-gram与CBOW相反,模型使用当前词来预测周围的语境词窗口。与较远的上下文词相比,Skip-gram更重视附近的上下文词。
模型训练完成后,学习到的词向量会被放置在向量空间中,这样,在语料库中具有共同语境的词(即语义和句法上相似的词)就会在空间中彼此靠近。相异程度较高的词在空间中的位置则相距较远。
模型架构
CBOW
CBOW(Continuous Bag of Words)模型是一种经典的词嵌入(Word Embedding)模型,由 Mikolov 等人在 2013 年提出,是 Word2Vec 的两种核心架构之一。CBOW 通过上下文词汇预测当前词,从而学习词向量。CBOW 的输入是目标词周围的上下文词汇(窗口内的相邻词),输出是对目标词 [math]\displaystyle{ V_t }[/math] 的预测。模型的目标是:根据上下文词汇预测中心词。设定窗口大小为 [math]\displaystyle{ 2c }[/math],即在目标词左右各取 [math]\displaystyle{ c }[/math] 个词作为上下文,那么对于中心词 [math]\displaystyle{ w_t }[/math],其上下文为:[math]\displaystyle{ C_t = \{w_{t-c}, \ldots, w_{t-1}, w_{t+1}, \ldots, w_{t+c} \} }[/math]。模型的结构分为三层,分别是输入层、嵌入层(Embedding)、输出层。
输入层:
每个上下文词 [math]\displaystyle{ w_{t+i} }[/math] 以 one-hot 向量表示为:
[math]\displaystyle{ \mathbf{x}_{t+i} \in \mathbb{R}^{|V|} }[/math]
其中 [math]\displaystyle{ |V| }[/math] 为词汇表大小。词向量通过嵌入矩阵 [math]\displaystyle{ W \in \mathbb{R}^{|V| \times N} }[/math] 得到:
[math]\displaystyle{ \mathbf{v}_{t+i} = W^\top \mathbf{x}_{t+i} }[/math]
嵌入层:
对上下文词向量求平均,获得上下文表示向量:
[math]\displaystyle{ \mathbf{h}_t = \frac{1}{2c} \sum_{\substack{-c \le i \le c \\ i \ne 0}} \mathbf{v}_{t+i} }[/math]
输出层:
设输出矩阵为 [math]\displaystyle{ W' \in \mathbb{R}^{|V| \times N} }[/math],对应词 [math]\displaystyle{ w_j }[/math] 的输出得分为:
[math]\displaystyle{ u_j = \mathbf{v}'_j \cdot \mathbf{h}_t }[/math]
对所有词使用 softmax 得到目标词的预测概率:
[math]\displaystyle{ P(w_t = j \mid C_t) = \frac{\exp(u_j)}{\sum_{k=1}^{|V|} \exp(u_k)} = \frac{\exp(\mathbf{v}'_j \cdot \mathbf{h}_t)}{\sum_{k=1}^{|V|} \exp(\mathbf{v}'_k \cdot \mathbf{h}_t)} }[/math]
优化目标:
最大化整个语料的预测对数概率,即最小化负对数似然损失函数(NLL):
[math]\displaystyle{ \mathcal{L} = - \frac{1}{T} \sum_{t=1}^{T} \log P(w_t \mid C_t) }[/math]
词向量提取:
训练完成后,词向量可以从输入嵌入矩阵 [math]\displaystyle{ W }[/math] 提取,也可以从输出矩阵 [math]\displaystyle{ W' }[/math] 提取,或者对两者进行平均得到最终词向量。
Skip-gram 模型
Skip-gram 是 Word2Vec 的另一种核心模型,由 Mikolov 等人于 2013 年提出。与 CBOW(通过上下文预测中心词)不同,Skip-gram 是通过中心词预测上下文词,适合捕捉罕见词的语义,尤其在大规模语料上表现优异。Skip-gram的模型结构也分为三层:输入层、投影层、输出层。同样假设窗口大小为 [math]\displaystyle{ 2c }[/math],对于中心词 [math]\displaystyle{ w_t }[/math],其上下文为:[math]\displaystyle{ C_t = \{w_{t-c}, \ldots, w_{t-1}, w_{t+1}, \ldots, w_{t+c} \} }[/math]。
输入层:一段文本中心词汇[math]\displaystyle{ w_t }[/math]的one-hot编码作为输入向量 [math]\displaystyle{ \mathbf{x}_t \in \mathbb{R}^{|V|} }[/math]。
投影层:
输入向量与嵌入矩阵 [math]\displaystyle{ W \in \mathbb{R}^{V \times d} }[/math] 相乘,得到词向量 [math]\displaystyle{ \mathbf{h} }[/math]: [math]\displaystyle{ \mathbf{h} = W^\top \mathbf{v} }[/math]
输出层:
对于上下文中每个词 [math]\displaystyle{ w_{t+j} }[/math]([math]\displaystyle{ j \in \{-c,\ldots,-1,1,\ldots,c\} }[/math]),计算其预测概率:
[math]\displaystyle{ P(w_{t+j} \mid w_t) = \frac{\exp(\mathbf{v}'_{w_{t+j}} \cdot \mathbf{v}_t)}{\sum_{w \in V} \exp(\mathbf{v}'_w \cdot \mathbf{v}_t)} }[/math]
其中,[math]\displaystyle{ W' \in \mathbb{R}^{|V| \times N} }[/math] 是输出权重矩阵,[math]\displaystyle{ \mathbf{v}'_w }[/math] 是对应词的输出向量。
优化目标:
Skip-gram 通过最大化所有中心词和上下文词对的条件概率来训练模型,损失函数为负对数似然:
[math]\displaystyle{ \mathcal{L} = - \frac{1}{T} \sum_{t=1}^T \sum_{\substack{-c \le j \le c \\ j \ne 0}} \log P(w_{t+j} \mid w_t) }[/math]
词向量提取:
在Skip-gram中,词向量即为嵌入层之后所得到的向量,而不同于CBOW,Skip-gram的输出矩阵W'虽然也可以用来作为获得词向量的依据,但是其含义是中心词在上下文中的角色,在学习词汇之间关系的任务中可能使用W'作为词向量会有更好的表现。
相比之下,Skip-gram的效果要优于CBOW,这是因为CBOW在平均了词向量之后丧失了词汇的位置信息,丢失了词汇之间的关联性,因此目前各种工程实现中常用Skip-gram模型。
训练方法
无论是CBOW还是Skip-gram,总是需要遍历整个词表,因此计算代价很大,所以就有了两种近似的计算方法,负采样与层次softmax。这两个是 Word2Vec 中非常重要的训练加速策略,它们用于高效地优化输出词的概率分布。
负采样(Negative Sampling):
负采样的核心思想在于将原始问题转换成一个二分类问题,让模型只区分正样本和负样本,例如在Skip-gram中,对于一个中心词 [math]\displaystyle{ w_t }[/math] 和一个正确的上下文词 [math]\displaystyle{ w_o }[/math],正确的上下文词被称为正样本。同时人为给出错误的上下文文本 [math]\displaystyle{ w'_{o_i} }[/math],也就是负样本。负样本的采样一般按照词频[math]\displaystyle{ U }[/math]的[math]\displaystyle{ 3/4 }[/math]次方作为采样概率,即:
[math]\displaystyle{ P(w'_{o_i}) \propto U(w'_{o_i})^0.75 }[/math]
负采样目的在于最小化负样本与中心词一起出现的概率,同时最大化正样本与中心词一起出现的概率,将softmax替换为sigmoid函数,得到新的损失函数:
[math]\displaystyle{ \mathcal{L}_{Skip-gram} = log\sigma(\mathbf{v}^\top_{w_o} \mathbf{v}_{w_t}) + \sum^{k}_{i=1}log\sigma(-\mathbf{v}^\top_{w'_{o_i}} \mathbf{v}_{w_t}) }[/math]
其中,[math]\displaystyle{ \sigma }[/math] 是sigmoid函数,[math]\displaystyle{ k }[/math] 为负样本个数。同样,该方法也能应用在CBOW模型中,只是负样本变成了中心词:
[math]\displaystyle{ \mathcal{L}_{CBOW} = log\sigma(\mathbf{v}^\top_{w_t} \mathbf{h}) + \sum^{k}_{i=1}log\sigma(-\mathbf{v}^\top_{w'_{o_i}} \mathbf{h}) }[/math]
不过在实际应用中大多数时候使用Skip-gram,因此负采样在CBOW中的应用很少。
层次 Softmax(Hierarchical Softmax):
层次softmax的核心思路是构建一个霍夫曼树,每个叶节点代表一个词汇,而预测一个词汇就是沿着树走的一条路径,对应的也就是一个不断重复的二分类问题,目标函数就可以变化为:
应用领域
- 自然语言处理(语义分析、机器翻译、文本分类)
- 推荐系统
- 信息检索
- 其他领域(如生物信息学、社会科学)
优缺点
优点
捕捉语义和语法关系:
通过上下文预测(Skip-gram/CBOW),可学习到单词的分布式表示,相似语义或语法角色的词在向量空间中距离相近。
支持线性类比关系(如“国王 - 男 + 女 ≈ 女王”)。
适用于大规模数据:
可高效训练数十亿级别的语料,内存消耗相对较低。
通用性强:
词向量可作为下游任务(如文本分类、机器翻译)的特征输入,提升模型性能。
局限性
无法处理多义词(Polysemy):
每个词仅对应单一向量,无法区分不同上下文中的多义性(如“苹果”指水果或公司)。
依赖局部上下文:
仅基于窗口内的局部共现信息,忽略文档级或语料级的全局统计特征(如GloVe的优势)。
需要大量训练数据:
小规模语料下生成的词向量质量较差,难以捕捉低频词语义。
静态词向量(Static Embeddings):
词向量在训练后固定,无法动态适应不同上下文(后续模型如ELMo、BERT解决了这一问题)。
窗口大小敏感:
表现受上下文窗口大小影响,过大或过小均可能导致语义捕捉不充分。
未考虑词序信息:
Skip-gram和CBOW模型忽略窗口内词的顺序关系(后续改进如Seq2Vec或Transformer可解决)。
相关技术与扩展
5.1 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”)
5.2 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 基于局部上下文与子词结构,适合细粒度语义与动态扩展;
应用场景广泛:在文本分类、命名实体识别、搜索排序、拼写纠错、推荐系统中广泛使用;
5.3 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)
开源实现与工具
- Gensim 库
- TensorFlow / PyTorch 实现
- 原始 C 语言实现(Google Code)