返回

词嵌入三巨头:Word2vec 模型详解

人工智能

文本表征在自然语言处理(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 模型的训练采用负采样技术,从目标词的上下文词中随机负采样出部分词语作为负例。训练过程如下:

  1. 给定一个训练样本 (w_t, w_c),其中 w_t 是目标词,w_c 是上下文词。
  2. 计算目标词 w_t 和上下文词 w_c 之间的共现概率。
  3. 负采样 k 个负例词 w_n。
  4. 计算目标词 w_t 和负例词 w_n 之间的共现概率。
  5. 构建训练样本 (w_t, w_c, w_n1, w_n2, ..., w_nk)。
  6. 使用训练样本更新模型参数。

基于 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 技术的底层原理,并将其应用到实际的项目开发中。