Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python seq2seq注意窥视编码器状态绕过最后一个编码器隐藏状态_Python_Tensorflow_Recurrent Neural Network - Fatal编程技术网

Python seq2seq注意窥视编码器状态绕过最后一个编码器隐藏状态

Python seq2seq注意窥视编码器状态绕过最后一个编码器隐藏状态,python,tensorflow,recurrent-neural-network,Python,Tensorflow,Recurrent Neural Network,在seq2seq模型中,我想使用编码结束时的隐藏状态从输入序列中读取更多信息 因此,我返回隐藏状态并在其上构建一个新的子网。这很管用。然而,我有一个疑问:这应该变得更加复杂,因此我有效地依赖于拥有所有必要的信息,以便将附加任务编码到隐藏状态 然而,如果seq2seq解码器使用注意机制,它基本上会窥视编码器端,有效地绕过编码结束时的隐藏状态。因此,并非seq2seq网络所依赖的所有信息都在编码结束时以隐藏状态编码 从理论上讲,这是否意味着我必须不使用注意机制,而是使用plain-vanilla-s

在seq2seq模型中,我想使用编码结束时的隐藏状态从输入序列中读取更多信息

因此,我返回隐藏状态并在其上构建一个新的子网。这很管用。然而,我有一个疑问:这应该变得更加复杂,因此我有效地依赖于拥有所有必要的信息,以便将附加任务编码到隐藏状态

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

从理论上讲,这是否意味着我必须不使用注意机制,而是使用plain-vanilla-seq2seq,以便在编码结束时最大限度地利用隐藏状态?这显然会牺牲seq2seq任务的大部分效率

只是想确认一下我的怀疑。基本上:通常,seq2seq模型中的最后一个编码器隐藏状态将包含解码的所有相关信息。但随着人们的关注,情况不再如此,对吗

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

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


总之,您应该尝试不同的方法,看看哪种模型最适合您的数据。如果不了解你的数据或进行一些测试,就不可能推测注意力机制、CNN等是否有任何好处

但是,如果您使用的是中提供的tensorflow seq2seq模型,请允许我分享一些与您的问题相关的关于
Embedded_attention_seq2seq()
attention_decoder()
中实现的注意机制的观察结果:

  • 解码器的隐藏状态是用编码器的最终状态初始化的……所以注意不能“有效地绕过编码结束时的隐藏状态”IMHO
  • embedding\u attention\u seq2seq()
    中的以下代码在最后一个时间步骤
    encoder\u 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)
      ....
    
  • 注意状态通过学习的线性组合与解码器输入相结合

    x=线性([inp]+attns,输入大小,真)

    #运行RNN。

    cell\u输出,状态=cell(x,状态)

  • linear()
    执行W,b矩阵运算,将组合输入+attn降秩到解码器输入大小中。”。模型将学习W和b的值

    摘要:注意状态与输入到解码器的输入相结合,但编码器的最后一个隐藏状态作为解码器的初始隐藏状态输入,而不需要注意


    最后,注意力机制仍有最后一种编码状态可供使用,只有在培训期间得知这是最好的做法时才会“绕过”它。

    总之,您应该尝试不同的方法,看看哪种模型最适合您的数据。如果不了解你的数据或进行一些测试,就不可能推测注意力机制、CNN等是否有任何好处

    但是,如果您使用的是中提供的tensorflow seq2seq模型,请允许我分享一些与您的问题相关的关于
    Embedded_attention_seq2seq()
    attention_decoder()
    中实现的注意机制的观察结果:

  • 解码器的隐藏状态是用编码器的最终状态初始化的……所以注意不能“有效地绕过编码结束时的隐藏状态”IMHO
  • embedding\u attention\u seq2seq()
    中的以下代码在最后一个时间步骤
    encoder\u 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)
      ....
    
  • 注意状态通过学习的线性组合与解码器输入相结合

    x=线性([inp]+attns,输入大小,真)

    #运行RNN。

    cell\u输出,状态=cell(x,状态)

  • linear()
    执行W,b矩阵运算,将组合输入+attn降秩到解码器输入大小中。”。模型将学习W和b的值

    摘要:注意状态与输入到解码器的输入相结合,但编码器的最后一个隐藏状态作为解码器的初始隐藏状态输入,而不需要注意


    最后,注意力机制仍有最后一个编码状态可供使用,只有在训练期间得知这是最好的做法时才会“绕过”它。

    Thx,谢谢你的回复。是的,我使用的是seq2seq模型。代码中说,这里的注意机制是基于Gramar作为一门外语()。在那篇文章中,我了解到注意力解码器查看编码器(“为了产生每个输出符号Bt,在编码器LSTM状态上使用注意机制。”)。通过旁路,我不是说忽略。我假设解码器的“主要”输入是编码器的状态(在编码结束时)。然而,如果解码器也使用注意直接窥视编码器侧,则编码器_状态不一定携带解码器使用的所有信息-因此部分绕过编码器_状态。所以如果我的目标是使用encod