Tensorflow嵌入用于训练和推理

时间:2019-02-17 20:25:58

标签: tensorflow nlp word-embedding machine-translation

我正在尝试使用tensorflow编写简单的神经机器翻译代码。但是我对张量流嵌入的理解有些困惑:

  • 我不了解tf.contrib.layers.embed_sequence(inputs, vocab_size=target_vocab_size,embed_dim=decoding_embedding_size)
  • 之间的区别

 dec_embeddings = tf.Variable(tf.random_uniform([target_vocab_size, decoding_embedding_size]))
 dec_embed_input = tf.nn.embedding_lookup(dec_embeddings, dec_input)

在这种情况下,我应该一个人使用另一个吗?

  • 我不了解的第二件事是关于tf.contrib.seq2seq.TrainingHelper和tf.contrib.seq2seq.GreedyEmbeddingHelper。我知道在翻译的情况下,我们主要使用TrainingHelper进行训练(使用上一个目标来预测下一个目标),并使用GreedyEmbeddingHelper进行推理(使用上一个时间步来预测下一个目标)。 但是我不知道它是如何工作的。特别是使用的不同参数。例如,为什么在TrainingHelper中需要序列长度(为什么不使用EOS)?为什么他们两个都不使用embedding_lookup或embedding_sequence作为输入?

2 个答案:

答案 0 :(得分:2)

我想您来自this seq2seq教程。即使这个问题开始变得老套了,我也会尝试为像我这样路过的人解答:

  • 对于第一个问题,我查看了exists后面的source code,实际上是使用 select User.*, Doc.LastDoc FROM de_Users AS Us LEFT JOIN ( SELECT UserID,MAX(DataFi) AS LastDoc FROM de_doc GROUP BY UserID ) as Doc ON Doc.UserID = Us.ID_U AND Doc.LastDoc = Us.DataFi -- this was missing ORDER BY Us.Name ASC, Doc.LastDoc DESC; 。因此,它只是包装好了,并为您创建了嵌入矩阵(tf.contrib.layers.embed_sequence)。尽管这很方便且不那么冗长,但是使用tf.nn.embedding_lookup似乎并没有直接的方式来访问嵌入。因此,如果需要,您必须使用相同的名称空间来查询用作嵌入矩阵的内部变量。我必须承认上面教程中的代码令人困惑。我什至怀疑他在编码器和解码器中使用了不同的嵌入。
  • 第二个问题:
  • 我想使用序列长度或嵌入是等效的。
  • tf.Variable(tf.random_uniform([target_vocab_size, decoding_embedding_size]))不需要embed_sequence,因为它仅将输入转发到解码器,TrainingHelper确实将embedding_lookup作为第一个输入,如documentation

答案 1 :(得分:1)

如果我对您的理解正确,那么第一个问题是关于tf.contrib.layers.embed_sequencetf.nn.embedding_lookup之间的区别。

根据官方文档(https://www.tensorflow.org/api_docs/python/tf/contrib/layers/embed_sequence

  

典型的用例是重用编码器和解码器之间的嵌入。

我认为tf.contrib.layers.embed_sequence是为seq2seq模型设计的。

我发现了以下帖子:

@ispirmustafa提到的地方:

  

embedding_lookup不支持无效的ID。

另外,在另一篇文章中:tf.contrib.layers.embed_sequence() is for what?

@ user1930402说:

  
      
  1. 通过使用tensorflow.contrib.layers.embed_sequence构建具有多个以特征为输入的门的神经网络模型时,可以在保留深度的同时减少网络中的参数数量。例如,它消除了LSTM的每个门执行其自己的特征线性投影的需要。
  2.   
  3. 它允许任意输入形状,这有助于实现简单而灵活的方式。
  4.   

对于第二个问题,很抱歉我没有使用TrainingHelper并且无法回答您的问题。