返回
词嵌入三巨头:Word2vec 模型详解
人工智能
2023-10-31 13:33:23
文本表征在自然语言处理(NLP)中至关重要,它将离散的文本数据转化为连续的向量形式,便于后续机器学习任务的处理。作为文本表征的基石,词嵌入模型应运而生。其中,Word2vec 作为词嵌入三巨头之一,以其高效性和有效性著称。本文将深入剖析 Word2vec 模型,从结构、推导、训练到基于 TensorFlow 的实现,力求为读者呈现一幅全面的技术图景。
Word2vec 模型结构
Word2vec 采用神经网络结构,主要包括两个模型:Skip-gram 和 CBOW(Continuous Bag-of-Words)。
- Skip-gram :以一个目标词为中心,预测其周围上下文中的其他词。
- CBOW :以多个上下文词为输入,预测目标词。
这两种模型本质上是对目标词的分布式表征进行学习。
Word2vec 模型推导
Word2vec 的训练目标是最大化目标词与上下文词之间的共现概率。
Skip-gram
对于给定的目标词 w_t,其 Skip-gram 模型的训练目标函数为:
max ∑(w_i ∈ C(w_t)) log P(w_i | w_t)
其中,C(w_t) 是目标词 w_t 的上下文词集合,P(w_i | w_t) 是在给定目标词 w_t 的情况下,上下文词 w_i 出现的概率。
CBOW
类似地,CBOW 模型的训练目标函数为:
max log P(w_t | C(w_t))
Word2vec 模型训练
Word2vec 模型的训练采用负采样技术,从目标词的上下文词中随机负采样出部分词语作为负例。训练过程如下:
- 给定一个训练样本 (w_t, w_c),其中 w_t 是目标词,w_c 是上下文词。
- 计算目标词 w_t 和上下文词 w_c 之间的共现概率。
- 负采样 k 个负例词 w_n。
- 计算目标词 w_t 和负例词 w_n 之间的共现概率。
- 构建训练样本 (w_t, w_c, w_n1, w_n2, ..., w_nk)。
- 使用训练样本更新模型参数。
基于 TensorFlow 的 Word2vec 实现
使用 TensorFlow 实现 Word2vec 模型相对简单,可参考以下代码:
import tensorflow as tf
class Word2vec:
def __init__(self, vocab_size, embedding_size, window_size):
self.vocab_size = vocab_size
self.embedding_size = embedding_size
self.window_size = window_size
def build(self):
# 构建 Skip-gram 模型
self.target_word = tf.placeholder(tf.int32, shape=[None])
self.context_word = tf.placeholder(tf.int32, shape=[None])
# 嵌入层,将单词映射到词向量
self.embedding = tf.Variable(tf.random_normal([self.vocab_size, self.embedding_size]), name='embedding')
# 构建 softmax 层
self.softmax_weights = tf.Variable(tf.random_normal([self.vocab_size, self.embedding_size]), name='softmax_weights')
self.softmax_biases = tf.Variable(tf.zeros([self.vocab_size]), name='softmax_biases')
# 计算损失
self.loss = tf.nn.sampled_softmax_loss(
weights=self.softmax_weights,
biases=self.softmax_biases,
labels=self.context_word,
inputs=tf.nn.embedding_lookup(self.embedding, self.target_word),
num_sampled=self.window_size)
def train(self, data, epochs, batch_size):
# 构建优化器
optimizer = tf.train.AdamOptimizer()
# 初始化模型
self.build()
# 开始训练
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in range(epochs):
for batch in range(int(len(data) / batch_size)):
# 获取训练数据
batch_data = data[batch * batch_size:(batch + 1) * batch_size]
target_words = [item[0] for item in batch_data]
context_words = [item[1] for item in batch_data]
# 计算损失并更新模型参数
loss = sess.run(self.loss, feed_dict={self.target_word: target_words, self.context_word: context_words})
optimizer.minimize(loss)
## 拓展应用
Word2vec 模型在 NLP 领域有着广泛的应用,包括:
* 文本分类
* 聚类
* 信息提取
* 机器翻译
通过学习 Word2vec 模型,开发者可以深入理解 NLP 技术的底层原理,并将其应用到实际的项目开发中。