Python seq2seq注意窥视编码器状态绕过最后一个编码器隐藏状态
在seq2seq模型中,我想使用编码结束时的隐藏状态从输入序列中读取更多信息 因此,我返回隐藏状态并在其上构建一个新的子网。这很管用。然而,我有一个疑问:这应该变得更加复杂,因此我有效地依赖于拥有所有必要的信息,以便将附加任务编码到隐藏状态 然而,如果seq2seq解码器使用注意机制,它基本上会窥视编码器端,有效地绕过编码结束时的隐藏状态。因此,并非seq2seq网络所依赖的所有信息都在编码结束时以隐藏状态编码 从理论上讲,这是否意味着我必须不使用注意机制,而是使用plain-vanilla-seq2seq,以便在编码结束时最大限度地利用隐藏状态?这显然会牺牲seq2seq任务的大部分效率 只是想确认一下我的怀疑。基本上:通常,seq2seq模型中的最后一个编码器隐藏状态将包含解码的所有相关信息。但随着人们的关注,情况不再如此,对吗 更具推测性的是,您是否同意以下可能的解决方案: -为新的子网创建额外的注意机制? -或者,在编码器侧的所有隐藏状态上使用卷积作为新子网的额外输入 有什么想法吗?更容易修复Python seq2seq注意窥视编码器状态绕过最后一个编码器隐藏状态,python,tensorflow,recurrent-neural-network,Python,Tensorflow,Recurrent Neural Network,在seq2seq模型中,我想使用编码结束时的隐藏状态从输入序列中读取更多信息 因此,我返回隐藏状态并在其上构建一个新的子网。这很管用。然而,我有一个疑问:这应该变得更加复杂,因此我有效地依赖于拥有所有必要的信息,以便将附加任务编码到隐藏状态 然而,如果seq2seq解码器使用注意机制,它基本上会窥视编码器端,有效地绕过编码结束时的隐藏状态。因此,并非seq2seq网络所依赖的所有信息都在编码结束时以隐藏状态编码 从理论上讲,这是否意味着我必须不使用注意机制,而是使用plain-vanilla-s
总之,您应该尝试不同的方法,看看哪种模型最适合您的数据。如果不了解你的数据或进行一些测试,就不可能推测注意力机制、CNN等是否有任何好处 但是,如果您使用的是中提供的tensorflow seq2seq模型,请允许我分享一些与您的问题相关的关于
Embedded_attention_seq2seq()
和attention_decoder()
中实现的注意机制的观察结果:
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