也许通过一个具体的例子来理解这一点可能会有所帮助:假设您有一条 19 字的推文,并且您想将其转换为另一种语言。您为单词创建嵌入,然后通过 128 个单元的双向 LSTM 层传递它。编码器现在为每条推文输出 256 维的 19 个隐藏状态。
假设解码器是单向的,有 128 个单元。它开始翻译单词,同时在每个时间步并行输出隐藏状态。
现在您想让 Bahdanau 注意到上述等式。您想提供解码器的 s_tminus1 和编码器 (hj) 的所有隐藏状态,并希望使用以下步骤获取上下文:
生成 v * (w * s_tminus1 + u*hj)
采用上述的 softmax 得到每条推文的 19 个注意力权重,然后将这些注意力权重乘以编码器隐藏状态,得到加权和,这只是上下文。
请注意,在 Bahdanau 模型中,解码器应该是单向的。然后形状如下:
假设对齐层的 n=10 个单位来确定 w,u。那么:s_tminus1 和 hj 的形状将是 (?,128) 和 (?,19,256)。请注意,s_tminus1 是 t-1 时的单个解码器隐藏状态,hj 是双向编码器的 19 个隐藏状态。
我们必须将 stminus1 扩展为 (?,1,128) 以便稍后沿时间轴进行添加。 w,u,v 的层权重将由框架自动确定为 (?,128,10)、(?,256,10) 和 (?,10,1)。请注意 self.w(stminus1) 如何计算出 (?,1,10)。这被添加到每个 self.u(hj) 以给出 (?,19,10) 的形状。结果被馈送到 self.v ,输出是 (?,19,1) ,这是我们想要的形状 - 一组 19 个权重。 Softmaxing 这给出了注意力权重。
将此注意力权重与每个编码器隐藏状态相乘并求和即可返回上下文。
希望这可以阐明各种张量和权重形状的形状。
回答您的其他问题 - ht 和 hs 的尺寸可以不同,如上例所示。至于你的另一个问题,我已经看到 2 个向量被连接起来,然后对它们应用了一个权重..至少这是我记得在原始论文中读到的内容