“Word2Vec”的版本间的差异
(→训练方法) |
小 (→Skip-gram 模型) |
||
| 第110行: | 第110行: | ||
在Skip-gram中,词向量即为嵌入层之后所得到的向量,而不同于CBOW,Skip-gram的输出矩阵W'虽然也可以用来作为获得词向量的依据,但是其含义是中心词在上下文中的角色,在学习词汇之间关系的任务中可能使用W'作为词向量会有更好的表现。 | 在Skip-gram中,词向量即为嵌入层之后所得到的向量,而不同于CBOW,Skip-gram的输出矩阵W'虽然也可以用来作为获得词向量的依据,但是其含义是中心词在上下文中的角色,在学习词汇之间关系的任务中可能使用W'作为词向量会有更好的表现。 | ||
| − | 相比之下,Skip- | + | 相比之下,Skip-gram的效果要优于CBOW,这是因为CBOW在平均了词向量之后丧失了词汇的位置信息,丢失了词汇之间的关联性,因此目前各种工程实现中常用Skip-gram模型。 |
==='''训练方法'''=== | ==='''训练方法'''=== | ||
2025年6月6日 (五) 13:23的版本
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{ 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):
负采样只更新与目标词和少数“负样本”相关的参数,而不是计算整个 softmax。而“负样本”代表没有出现在上下文中、但被人为采样出来“假装”是上下文的词,一般采用词频过高或者过低的词汇。相反,“正样本”就是真实共现的词对,也就是模型要学习的正确上下文关系。而负采样的目的就是最大化正样本的出现概率:
其中,\sigma是sigmoid函数,同时最小化负样本的出现概率:
合并起来就是新的目标函数:
这样一来,计算的代价下降了许多。
层次 Softmax(Hierarchical Softmax):
层次softmax的核心思路是构建一个霍夫曼树,每个叶节点代表一个词汇,而预测一个词汇就是沿着树走的一条路径,对应的也就是一个不断重复的二分类问题,目标函数就可以变化为:
应用领域
- 自然语言处理(语义分析、机器翻译、文本分类)
- 推荐系统
- 信息检索
- 其他领域(如生物信息学、社会科学)
优缺点
优点
- 计算高效
- 能捕捉语义和语法关系
- 适用于大规模语料库
局限性
- 无法处理多义词(Polysemy)
- 依赖局部上下文,忽略全局信息
- 需要大量训练数据
相关技术与扩展
- GloVe(Global Vectors for Word Representation)
- FastText
- BERT 和 Transformer 模型
- 动态词嵌入(如 ELMo)
开源实现与工具
- Gensim 库
- TensorFlow / PyTorch 实现
- 原始 C 语言实现(Google Code)