微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么我们在实现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 举报,一经查实,本站将立刻删除。