Keras 中 Bi-LSTM bahdanau attention 的任何好的实现?

数据挖掘 深度学习 喀拉斯 序列到序列 语言模型 注意机制
2022-02-21 16:06:23

从过去的几周开始,我一直在尝试学习序列到序列的机器翻译建模,但我找不到任何实施了 bahdanau 注意力的好的示例/教程。我确实遇到过很多人们实施注意力的例子,但主要是在 gru(或)luong attention(或)过时的代码上。

有没有人在你已经实现(或)尝试过的 keras 中遇到过任何好的 bahdanau 注意力模型实现?我真的很想学习编码部分,但没有找到关于实现的好材料?

请帮忙。

3个回答

这是有助于理解它的 Deeplearning.ai 笔记本。带注意力的神经机器翻译

tensorflow-tutorials-for-text 中,他们实现了 bahdanau 注意力层,通过给出编码器输入、解码器隐藏状态和解码器输入来生成上下文向量。

编码器类只是将编码器输入与编码器状态一起从嵌入层传递到 GRU 层并返回编码器输出和编码器状态。

如果我们使用 LSTM 而不是 GRU,那么状态将是 state_h,state_c 的大小(batch_size,units)。

在解码器部分,它们传递解码器输入、编码器输出和状态(初始化使用编码器状态以供剩余使用解码器状态)。

当我们在Decoder中给出上述三个参数时,BahdanauAttention Layer会使用encoder_outputs和states来计算contex_vector和weights。我们也可以使用AdditiveAttention-Layer它是 Bahdanau 式的注意力。其中查询是我们的解码器状态,值是我们的编码器输出。

这是我遇到的使用 TF 后端在 Keras 中引起注意的好教程之一。

Luong 的注意力出现在 Bahdanau 之后,尽管它有一些简化,但通常被认为是对前者的改进。

我见过的预写层都没有完全实现 Luong 或 Bahdanu 的注意力,但只实现了其中的关键部分。已经表明,在以任何基本形式引入注意力后,性能都会有很大的提升。尽管将学习到的注意力权重传递给后续时间步似乎有很大的好处,但具体的实现似乎并不那么重要。

Bahdanau 和 Luong 以及 2014-2018 年出现的后续注意力模型现在在大多数情况下都被自我注意力所取代。自注意力是谷歌在 2018 年引入的(尽管他们可能受到了早期关于内部注意力的论文的启发)

由于有十几种注意力类型,并且每种类型都可能有几种实现方式,因此这有时可能会引起许多人的困惑。以下链接包含 Attention 演变的简化渲染,并展示了如何在 6 行代码中实现注意力: https ://towardsdatascience.com/create-your-own-custom-attention-layer-understand-all-flavours- 2201b5e8be9e