seq2seq-深入编码器状态的注意力绕过最后编码器隐藏状态

时间:2016-05-18 20:03:07

标签: python tensorflow recurrent-neural-network

在seq2seq-Model中,我想在编码结束时使用隐藏状态从输入序列中读出更多信息。

所以我返回隐藏状态并在其上构建一个新的子网。这很好用。但是,我有一个疑问:这应该变得更加复杂,因此我实际上依赖于将所有必要的信息用于在隐藏状态下编码的附加任务。

然而,如果seq2seq-decoder使用注意机制,它基本上会窥视编码器侧,在编码结束时有效地绕过隐藏状态。因此,并非seq2seq-network所依赖的所有信息都在编码结束时以隐藏状态编码。

理论上,这是否意味着我必须不使用注意机制,而是使用plain-vanilla-seq2seq以便在编码结束时从隐藏状态中获得最大值?这显然会牺牲seq2seq任务的大部分有效性。

只是试着怀疑我确认了。基本上:通常,seq2seq模型中的最后一个编码器隐藏状态将包含用于解码的所有相关信息。但是注意到这已不再是这样了,对吗?

在更具推测性的说明中,您是否同意这些可能的解决方案: - 为新子网创建额外的关注机制? - 或者,在编码器端的所有隐藏状态上使用卷积作为新子网的附加输入?

有什么想法?更容易修复?

THX

1 个答案:

答案 0 :(得分:2)

最重要的是,您应该尝试不同的方法,看看哪种模型最适合您的数据。在不了解您的数据或运行某些测试的情况下,无法推测注意机制,CNN等是否提供任何好处。

但是,如果您正在使用 tensorflow/tensorflow/python/ops/seq2seq.py 中提供的张量流seq2seq模型,请与我分享一些关于embedding_attention_seq2seq()attention_decoder()中与您的问题相关的关注机制的观察结果(s ):

  1. 解码器的隐藏状态初始化为编码器的最终状态...因此注意不会“在编码结束时有效地绕过隐藏状态”恕我直言
  2. embedding_attention_seq2seq()中的以下代码在最后一个时间步encoder_state中传递为第二个参数中的initial_state

      return embedding_attention_decoder(
          decoder_inputs, encoder_state, attention_states, cell,
          num_decoder_symbols, embedding_size, num_heads=num_heads,
          output_size=output_size, output_projection=output_projection,
          feed_previous=feed_previous,
          initial_state_attention=initial_state_attention)
    

    您可以看到initial_state直接在attention_decoder()中使用而未经过任何关注状态:

    state = initial_state
    
    ...
    
    for i, inp in enumerate(decoder_inputs):
      if i > 0:
        variable_scope.get_variable_scope().reuse_variables()
      # If loop_function is set, we use it instead of decoder_inputs.
      if loop_function is not None and prev is not None:
        with variable_scope.variable_scope("loop_function", reuse=True):
          inp = loop_function(prev, i)
      # Merge input and previous attentions into one vector of the right size.
      input_size = inp.get_shape().with_rank(2)[1]
      if input_size.value is None:
        raise ValueError("Could not infer input size from input: %s" % inp.name)
      x = linear([inp] + attns, input_size, True)
      # Run the RNN.
      cell_output, state = cell(x, state)
      ....
    
    1. 注意状态通过学习的线性组合与解码器输入相结合

      x = linear([inp] + attns, input_size, True)

      # Run the RNN.

      cell_output, state = cell(x, state)

    2. ... linear()执行W,b矩阵运算,将组合输入+ attn向下排名到解码器input_size中。该模型将学习W和b的值。

      总结:注意状态与输入到解码器中相结合,但编码器的最后隐藏状态作为解码器的初始隐藏状态被输入而没有引起注意。

      最后,注意机制仍然具有最后的编码状态,并且如果在训练期间学到了最好的事情,它只会“绕过”它。