Tensorflow:Word2vec CBOW模型

时间:2016-05-23 15:29:06

标签: python tensorflow word2vec

我是tensorflow和word2vec的新手。我刚研究了使用Skip-Gram算法训练模型的word2vec_basic.py。现在我想使用CBOW算法进行训练。如果我只是反转train_inputstrain_labels,这是否可以实现?

3 个答案:

答案 0 :(得分:13)

我认为CBOW模型不能简单地通过翻转train_inputs中的train_labelsSkip-gram来实现,因为CBOW模型架构使用了[the, brown]模型架构的总和周围单词的向量作为分类器预测的单个实例。例如,您应该同时使用quick来预测the,而不是使用quick来预测generate_batch

enter image description here

要实现CBOW,您必须编写新的data生成器函数,并在应用逻辑回归之前总结周围单词的向量。我写了一个例子,你可以参考:https://github.com/wangz10/tensorflow-playground/blob/master/word2vec.py#L105

答案 1 :(得分:9)

对于CBOW,您只需要更改代码word2vec_basic.py的几个部分。总体而言,培训结构和方法是相同的。

我应该在word2vec_basic.py中更改哪些部分?

1)它生成训练数据对的方式。因为在CBOW中,您正在预测中心词,而不是上下文词。

library(BETS) Receitamensal <- BETS.deflate(BETS.get(7544), BETS.GET(433), type='perc') Gastomensal <- BETS.deflate(BETS.get(7546), BETS.GET(433), type='perc') 的新版本将是

generate_batch

然后将为CBOW提供新的训练数据

def generate_batch(batch_size, bag_window):
  global data_index
  span = 2 * bag_window + 1 # [ bag_window target bag_window ]
  batch = np.ndarray(shape=(batch_size, span - 1), dtype=np.int32)
  labels = np.ndarray(shape=(batch_size, 1), dtype=np.int32)  
  buffer = collections.deque(maxlen=span)
  for _ in range(span):
    buffer.append(data[data_index])
    data_index = (data_index + 1) % len(data)
  for i in range(batch_size):
    # just for testing
    buffer_list = list(buffer)
    labels[i, 0] = buffer_list.pop(bag_window)
    batch[i] = buffer_list
    # iterate to the next buffer
    buffer.append(data[data_index])
    data_index = (data_index + 1) % len(data)
  return batch, labels

与Skip-gram的数据相比

data: ['anarchism', 'originated', 'as', 'a', 'term', 'of', 'abuse', 'first', 'used', 'against', 'early', 'working', 'class', 'radicals', 'including', 'the']

#with bag_window = 1:
    batch: [['anarchism', 'as'], ['originated', 'a'], ['as', 'term'], ['a', 'of']]
    labels: ['originated', 'as', 'a', 'term']

2)因此,您还需要更改变量形状

#with num_skips = 2 and skip_window = 1:
    batch: ['originated', 'originated', 'as', 'as', 'a', 'a', 'term', 'term', 'of', 'of', 'abuse', 'abuse', 'first', 'first', 'used', 'used']
    labels: ['as', 'anarchism', 'originated', 'a', 'term', 'as', 'a', 'of', 'term', 'abuse', 'of', 'first', 'used', 'abuse', 'against', 'first']

train_dataset = tf.placeholder(tf.int32, shape=[batch_size])

3)损失功能

train_dataset = tf.placeholder(tf.int32, shape=[batch_size, bag_window * 2])

注意 inputs = tf.reduce_sum(embed,1),正如Zichen Wang所说。

就是这样!

答案 2 :(得分:6)

基本上,是的:

对于给定的文本the quick brown fox jumped over the lazy dog:,窗口大小为1的CBOW实例将是

([the, brown], quick), ([quick, fox], brown), ([brown, jumped], fox), ...