首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gensim Doc2Vec与tensorflow Doc2Vec

gensim Doc2Vec与tensorflow Doc2Vec
EN

Stack Overflow用户
提问于 2016-10-04 03:13:27
回答 1查看 16.7K关注 0票数 55

我正在尝试比较我的Doc2Vec实现(通过tf)和gensims实现。似乎至少在视觉上,天才的表现更好。

我运行了下面的代码来训练gensim模型和下面的tensorflow模型。我的问题如下:

  1. 我的tf实现Doc2Vec是正确的。基本上,是否应该将单词向量和文档向量连接起来来预测某个上下文中的中间单词?
  2. gensim中的window=5参数是否意味着我在两边使用两个单词来预测中间的一个?或者是两边的5号。问题是,有相当多的文件小于10长度。
  3. 对于Gensim为什么表现得更好,有什么见解吗?我的模型和他们的实现方式有什么不同吗?
  4. 考虑到这实际上是一个矩阵分解问题,为什么TF模型甚至得到了答案?由于这是一个秩不足的问题,因此有无限的解。<- -最后一个问题只是一个奖励。

根西姆

代码语言:javascript
复制
model = Doc2Vec(dm=1, dm_concat=1, size=100, window=5, negative=10, hs=0, min_count=2, workers=cores)
model.build_vocab(corpus)
epochs = 100
for i in range(epochs):
    model.train(corpus)

TF

代码语言:javascript
复制
batch_size = 512
embedding_size = 100 # Dimension of the embedding vector.
num_sampled = 10 # Number of negative examples to sample.


graph = tf.Graph()

with graph.as_default(), tf.device('/cpu:0'):
    # Input data.
    train_word_dataset = tf.placeholder(tf.int32, shape=[batch_size])
    train_doc_dataset = tf.placeholder(tf.int32, shape=[batch_size/context_window])
    train_labels = tf.placeholder(tf.int32, shape=[batch_size/context_window, 1])

    # The variables   
    word_embeddings =  tf.Variable(tf.random_uniform([vocabulary_size,embedding_size],-1.0,1.0))
    doc_embeddings = tf.Variable(tf.random_uniform([len_docs,embedding_size],-1.0,1.0))
    softmax_weights = tf.Variable(tf.truncated_normal([vocabulary_size, (context_window+1)*embedding_size],
                             stddev=1.0 / np.sqrt(embedding_size)))
    softmax_biases = tf.Variable(tf.zeros([vocabulary_size]))

    ###########################
    # Model.
    ###########################
    # Look up embeddings for inputs and stack words side by side
    embed_words = tf.reshape(tf.nn.embedding_lookup(word_embeddings, train_word_dataset),
                            shape=[int(batch_size/context_window),-1])
    embed_docs = tf.nn.embedding_lookup(doc_embeddings, train_doc_dataset)
    embed = tf.concat(1,[embed_words, embed_docs])
    # Compute the softmax loss, using a sample of the negative labels each time.
    loss = tf.reduce_mean(tf.nn.sampled_softmax_loss(softmax_weights, softmax_biases, embed,
                                   train_labels, num_sampled, vocabulary_size))

    # Optimizer.
    optimizer = tf.train.AdagradOptimizer(1.0).minimize(loss)

更新:

看看jupyter笔记本电脑这里 (我有两个型号在这里工作和测试)。在最初的分析中,仍然觉得gensim模型表现得更好。

EN

回答 1

Stack Overflow用户

发布于 2017-08-19 02:44:53

老掉牙的问题,但对未来的游客来说,答案是有用的。以下是我的一些想法。

tensorflow实现中存在一些问题:

  • window为1边大小,因此window=55*2+1 = 11字。
  • 请注意,对于doc2vec的PV版本,batch_size将是文档的数量。因此train_word_dataset形状将是batch_size * context_window,而train_doc_datasettrain_labels形状将是batch_size
  • 更重要的是,sampled_softmax_loss不是negative_sampling_loss。它们是softmax_loss的两个不同的近似。

所以对于OP列出的问题:

  1. doc2vectensorflow中的这种实现是以自己的方式工作和正确的,但它与gensim实现和论文都不一样。
  2. 正如上面所说的,window是单面大小的.如果文档大小小于上下文大小,则将使用较小的文档大小。
  3. gensim实现更快的原因有很多。首先,对gensim进行了大量的优化,所有操作都比简单的python操作更快,特别是数据I/O。其次,gensim中的min_count过滤等预处理步骤会减少数据集的大小。更重要的是,gensim使用negative_sampling_loss,它比sampled_softmax_loss快得多,我想这是主要原因。
  4. 当有很多东西的时候,找到一些东西会更容易吗?开玩笑的;-) 确实,这个非凸优化问题有很多解,所以这个模型只会找到一个局部最优解。有趣的是,在神经网络中,大多数局部最优是“足够好”。观察到随机梯度下降似乎比大批梯度下降更好的局部最优,尽管这仍然是目前研究中的一个谜。
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39843584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档