【问题标题】:Tensorflow Embedding for training and inference用于训练和推理的 TensorFlow 嵌入
【发布时间】:2019-07-11 06:03:56
【问题描述】:

我正在尝试使用 tensorflow 编写一个简单的神经机器翻译。但是我对 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


    【解决方案1】:

    我想你来自this seq2seq 教程。虽然这个问题开始老了,但我会尽量为像我这样路过的人回答:

    • 第一个问题,我看了tf.contrib.layers.embed_sequence后面的source code,其实是使用tf.nn.embedding_lookup。所以它只是包装它,并为您创建嵌入矩阵 (tf.Variable(tf.random_uniform([target_vocab_size, decoding_embedding_size])))。虽然这很方便且不那么冗长,但通过使用embed_sequence,似乎没有直接访问嵌入的方法。因此,如果您愿意,您必须使用相同的名称空间查询用作嵌入矩阵的内部变量。我不得不承认,上面教程中的代码令人困惑。我什至怀疑他在编码器和解码器中使用了不同的嵌入。
    • 第二个问题:
    • 我猜它相当于使用序列长度或嵌入。
    • TrainingHelper 不需要embedding_lookup,因为它只将输入转发到解码器,GreedyEmbeddingHelper 确实将embedding_lookup 作为第一个输入,如documentation 中所述。

    【讨论】:

      【解决方案2】:

      如果我理解正确,第一个问题是关于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,无法回答您的问题。

      【讨论】:

        猜你喜欢
        • 2016-06-20
        • 1970-01-01
        • 1970-01-01
        • 2017-02-16
        • 2020-02-05
        • 1970-01-01
        • 1970-01-01
        • 2018-01-06
        • 1970-01-01
        相关资源
        最近更新 更多