Word2Vec 是一种流行的用于生成词嵌入(Word Embeddings)的无监督学习模型,它由 Google 的一个团队在 2013 年提出。它的主要目的是将单词映射到一个连续的向量空间,使得语义相似的单词在这个空间中靠得更近。
Word2Vec 有两种主要的模型架构:Skip-Gram 和 Continuous Bag of Words (CBOW)。两者使用不同的策略来预测单词的上下文。
一.Skip-Gram:中心词来预测周围词
Skip-Gram
模型是 Word2Vec 中的一种重要架构,其主要目的是通过已知的单词(中心词)预测其上下文中的其他单词
。Skip-Gram 模型的设计初衷是捕捉单词之间的语义关系和上下文信息,使得相似语义的单词在向量空间中距离更近。
模型原理
Skip-Gram 模型的核心思想是利用一个中心词来预测其周围的上下文词。给定一个单词序列 ( w_1, w_2, , w_T ),中心词 ( w_t ) 的任务是根据其上下文 ( w_(t-j) 到 ( w_(t+j)(这里 ( j ) 是一个窗口大小参数)来预测上下文中的单词。
目标函数
Skip-Gram 模型的目标是最大化给定中心词 ( w_t ) 时预测上下文词 ( w_{t+j} ) 的概率。具体来说,模型的目标函数可以表示为:
∏ t = 1 T ∏ j = − c c P ( w t + j ∣ w t ) \prod_{t=1}^{T} \prod_{j=-c}^{c} P(w_{t+j} | w_t) t=1∏Tj=−c∏cP(wt+j∣wt)
其中:
- ( T ) 是整个文本中的单词数。
- ( c ) 是上下文窗口的大小(即有多少个单词被视为上下文)。
- ( P(w_(t+j) | w_t) ) 是在给定中心词 ( w_t ) 下预测上下文词 ( w_(t+j) ) 的概率。
训练过程
Skip-Gram 模型的训练过程通常涉及以下步骤:
-
数据预处理:
- 将文本转换为单词序列。
- 创建中心词和上下文词的对(例如,若窗口大小为 2,并且中心词为 "machine",则上下文可能是 "I" 和 "learning")。
-
初始化参数:
- 为每个单词初始化输入和输出嵌入向量。输入向量用于表示中心词,输出向量用于表示上下文词。
-
训练:
- 对于每对中心词和其上下文词,利用负采样 (Negative Sampling)或层次 Softmax(Hierarchical Softmax)来计算概率。
- 更新参数以最大化正确上下文词的概率,最小化错误上下文词的概率。通过反向传播算法计算梯度并更新嵌入向量。
负采样
由于输出层的计算涉及大量的单词,Skip-Gram 模型通常使用负采样来提高计算效率。负采样选择一些"负样本"来训练,通常是随机选择词汇表中的单词,但与中心词不同。例如,假设我们需要预测上下文单词 "learning",会将其作为正样本,同时随机选择几个不相关的单词作为负样本。
模型架构
Skip-Gram 模型的简单架构包含两层神经网络:
- 输入层:接收一个单词的独热编码表示。
- 隐藏层:没有激活函数,直接将输入词的嵌入向量通过权重矩阵得到隐藏层输出。
- 输出层:经过 Softmax 层,`计算中心词 ( w_t ) 对于每个上下文词 ( w_(t+j)的条件概率。
示例
给定一句话:"I love natural language processing",若选择"natural"为中心词,窗口大小为 1,模型将训练以下样本对:
- 中心词: "natural",上下文词: "love"
- 中心词: "natural",上下文词: "language"
代码示例
以下是使用 Python 的 Gensim 库实现 Skip-Gram 模型的示例:
python
from gensim.models import Word2Vec
# 示例语料
sentences = [
['i', 'love', 'natural', 'language', 'processing'],
['deep', 'learning', 'is', 'important'],
['machine', 'learning', 'is', 'fun'],
]
# 训练 Word2Vec 模型(使用 Skip-Gram)
model = Word2Vec(sentences, vector_size=100, window=1, min_count=1, sg=1) # sg=1 表示使用 Skip-Gram
# 获取某个词的向量
vector = model.wv['natural']
print("Vector for 'natural':", vector)
# 获取与某个词最相似的词
similar_words = model.wv.most_similar('learning', topn=5)
print("Most similar words to 'learning':", similar_words)
优点
- 高效捕捉语义信息:Skip-Gram 模型能够有效捕捉单词的语义和上下文信息,生成能够反映单词关系的向量。
- 灵活性:可以通过调整窗口大小和最小词频等参数对模型表现进行优化。
- 可扩展性:适用于大规模文本数据,能够处理数百万的单词。
二.CBOW根据中心词来预测周围词
CBOW(Continuous Bag of Words)模型是 Word2Vec 中的另一种架构,主要用于通过上下文单词预测中心单词。与 Skip-Gram 模型相反,CBOW 使用多个上下文单词来预测一个单一的目标词。此模型的目标是最大化给定上下文单词时,预测目标词的概率。
模型原理
CBOW 模型的核心思想是将上下文中的多个单词嵌入到一个向量空间,然后通过这些上下文向量预测中心单词。给定上下文 ( w_{t-c}, w_(t-c+1), w_(t+c)(这里 ( c ) 为上下文窗口大小),模型的目标是预测中心词 ( w_t )。
目标函数
CBOW 模型的目标函数可以表示为最大化在给定上下文的情况下预测目标词的概率:
P ( w t ∣ w t − c , w t − c + 1 , ... , w t + c ) P(w_t | w_{t-c}, w_{t-c+1}, \ldots, w_{t+c}) P(wt∣wt−c,wt−c+1,...,wt+c)
训练过程
CBOW 模型的训练过程包括以下几个步骤:
-
数据预处理:
- 将文本数据转换为单词序列。
- 根据窗口大小获取上下文词与对应目标词的对。例如,如果选择窗口大小为 2,且目标词是 "language",上下文将是 ["I", "love", "natural", "processing"]。
-
初始化参数:
- 为每个单词初始化相应的输入和输出嵌入向量,输入向量用于表示上下文词,输出向量用于表示预测的中心词。
-
训练:
- 对于每个上下文词和目标词组合,利用负采样 或层次 Softmax来计算概率。
- 更新参数以最大化实际目标词的概率,同时最小化错误输出的概率。可使用反向传播算法进行计算并更新嵌入矩阵。
负采样
CBOW 模型同样使用负采样的方式来提高计算效率。模型会从词汇表中随机选择一些不相关的单词作为负样本,以减少计算量。
模型架构
CBOW 模型包括以下几个部分:
- 输入层:接收多个上下文单词的独热编码表示。
- 隐藏层:无激活函数,将上下文单词的嵌入向量通过权重矩阵相加得到隐藏层的输出。这个输出向量是所有上下文词向量的平均值或总和。
- 输出层:经过 Softmax 层计算每个词的概率,最终输出为预测的中心词。
代码示例
使用 Python 的 Gensim 库实现 CBOW 模型的示例:
python
from gensim.models import Word2Vec
# 示例语料
sentences = [
['i', 'love', 'natural', 'language', 'processing'],
['deep', 'learning', 'is', 'important'],
['machine', 'learning', 'is', 'fun'],
]
# 训练 Word2Vec 模型(使用 CBOW)
model = Word2Vec(sentences, vector_size=100, window=2, min_count=1, sg=0) # sg=0 表示使用 CBOW
# 获取某个词的向量
vector = model.wv['language']
print("Vector for 'language':", vector)
# 获取与某个词最相似的词
similar_words = model.wv.most_similar('learning', topn=5)
print("Most similar words to 'learning':", similar_words)
优点
- 捕捉上下文信息:CBOW 模型通过多个上下文单词来形成更全面的上下文表示,从而有效地捕捉语义信息。
- 计算高效:由于输入是多个上下文词,可以在训练中更好地进行并行计算。
- 适应性强:在各种特定任务中,只需调整窗口大小和其他参数即可优化模型效果。
CBOW 模型通过利用上下文词来预测目标词的机制,在自然语言处理领域表现出色。其灵活的框架和高效的训练方法,使得它成为了许多 NLP 应用的基础,为理解和处理复杂的语言结构提供了强大的支持。