用于训练和推理的Tensorflow嵌入

问题描述 投票:1回答:2

我正在尝试使用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作为输入?
tensorflow nlp word-embedding machine-translation
2个回答
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. 它允许任意输入形状,这有助于实现简单灵活。

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


0
投票

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

  • 关于第一个问题,我看了source code后面的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,因为它仅将输入转发到解码器,GreedyEmbeddingHelper确实将[èmbedding_lookup`作为第一个输入,] documentation中提到。 >
© www.soinside.com 2019 - 2024. All rights reserved.