Tensorflow 2 中的注意力机制

数据挖掘 喀拉斯 张量流 注意机制
2021-09-23 05:49:12

在过去的几天里,我阅读了注意力背后的理论,何时应用它以及有哪些类型。我认为我对这个概念有一个不错的初步理解,但现在我想将我得到的一些见解应用到我自己的项目中,我发现自己陷入了在 TF 中实现注意力的问题。快速链接到 TF Attention

注意层要求我至少提供查询和值。如果我已经错了,请纠正我,但这是我对它们的想法:

  1. 查询:这些是我的解码器的隐藏状态
  2. 值:这些是我的编码器的隐藏状态

到现在为止还挺好。我正在努力解决的问题是我不知道解码器的隐藏状态可能来自哪里。我想实现一个自我注意机制。所以我的解码器隐藏状态是动态生成的,在实际应用注意力层之前我无法知道它们。文档中提供的示例对我没有帮助,因为它专注于我已经有一些查询序列的问题。

除了提到的 TF 注意力层是否适用于 self-attention 之外,我如何解释不同的输入?

2个回答

在 self-attention 中,不是解码器参与编码器,而是层参与自身,即查询和值是相同的。

在实践中,这通常在多头设置中完成。您可以将其视为每个人都专注于从隐藏状态中收集不同类型的信息。在多头注意力中H 头,您首先将状态线性投影到 H 查询向量, H 关键向量,和 H值向量,应用注意力,连接生成的上下文向量并将它们投影回相同的维度。

在 2018 年一篇具有里程碑意义的论文之前和之后,“注意力”术语会有所不同——注意力就是你所需要的。

2018年之前

  • 这里的'query'是前一个时间步的解码器的隐藏状态。
  • 'Values' - 编码器的所有隐藏状态

请记住——“查询”涉及所有“值”

到现在为止还挺好。注意力机制在 2014 年至 2017 年间被广泛用于提高 RNN 的性能。然后在 2018 年,一篇革命性的论文问世——注意力就是你所需要的。这意味着它的标题所说的 - 基本上抛弃你的 RNN 并只使用 Attention 来编码序列。通过使用自我注意,模型能够在输入序列中的时间步之间建立关系并对其进行编码。不需要RNN。

因此,在 2018 年之后,您可以在输入序列或输出序列上独立使用自注意力。您不需要传统的 RNN 作为编码器或解码器。注意力机制本身完成了 RNN 的工作。所以你有一个使用注意力模型的编码器和解码器。在这种情况下,查询和值(以及键)都来自前一层输出。计算是这样的:

  • 获取每个单词的词嵌入,然后从嵌入向量创建三个向量——键、查询、值。这些是从训练期间找到的权重矩阵创建的
  • 现在获取每个单词并通过将查询向量(当前单词)与我们正在评分的相应单词的关键向量的点积来计算分数。
  • 将分数除以关键向量的维度的平方根以标准化值以获得更稳定的梯度。
  • Softmax这个
  • 将每个值向量乘以 Softmax 分数以放大相关词并淹没不相关词。
  • 最后一步是对加权值向量求和。这会在这个位置产生自注意力层的输出(对于第一个词)