为什么我们在实现Attention时需要一个for循环手册?

问题描述

请耐心等待。

这对某些人来说可能难以理解,因为我添加了伪代码支持我不清楚的内容。我一直在关注一个教程,有人提到我们需要在目标序列上定义一个 for 循环,因为我们正在使用 LSTM 使用注意力机制进行机器翻译。

我已经做了一些看起来像 keras 的东西。

这是伪代码

h = encoder(input) # For getting input sequences for calculation attention weights and context vector
decoder_hidden_state = 0 # Hidden state
decoder_cell_state = 0 # Cell state
outputs = []

for t in range(Ty): # Ty being the length of the target sequence
    context = calc_attention(decoder_hidden_state,h) # decoder_hiddent_state(t-1),h(1),......h(Tx)
    decoder_output,decoder_hidden_state,decoder_cell_state = decoder_lstm(context,init = [decoder_hidden_state,decoder_cell_state])
    probabilities = dense_layer(o)
    outputs.append(probabilities)

model = Model ( input,outputs)

我不清楚的是为什么我们要使用 for 循环,据说“在常规的 seq2seq 中,我们一次性传入整个目标输入序列,因为输出是一次性计算的。但是我们需要在 Ty 步骤上循环,因为每个上下文都取决于先前的状态"

但我认为在注意力的情况下也可以这样做,因为如果我只是删除 for 循环。

就像下面这段代码,它是普通seq2seq的解码器部分

decoder_inputs_placeholder = Input(shape=(max_len_target,))
decoder_embedding = Embedding(num_words_output,EMbedDING_DIM)
decoder_inputs_x = decoder_embedding(decoder_inputs_placeholder)
decoder_lstm = LSTM(
   LATENT_DIM,return_sequences=True,return_state=True,)

如果我想添加注意力,我不能在这里定义状态并调用 calc_attention 函数,该函数将在解码时返回特定时间步的上下文,并且可以像之前在伪代码中所做的那样传递给 lstm 调用

decoder_outputs,decoder_cell_state = decoder_lstm(
   decoder_inputs_x,initial_state=[decoder_hidden_state,decoder_cell_state]
)
decoder_outputs = decoder_dense(decoder_outputs)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)