明确地说,我指的是Hierarchical Attention Networks for Document Classification中描述的类型的“自我关注”,并实现了很多地方,例如:here。我是而不是,是指编码器-解码器模型(即Bahdanau)中使用的seq2seq注意类型,尽管我的问题也可能适用于此...我只是不太熟悉。

自我注意基本上只计算RNN隐藏状态的加权平均值(均值池的概括,即未加权平均值)。当同一批中有可变长度的序列时,通常会将它们补零到该批中最长序列的长度(如果使用动态RNN)。计算每个序列的注意权重时,最后一步是softmax,因此注意权重总和为1。

但是,在我所看到的每个注意力实现中,都没有采取任何措施掩盖或消除零填充对注意力权重的影响。这对我来说似乎是错误的,但是我担心我可能会丢失一些东西,因为似乎没有其他人对此感到不安。

例如,考虑一个长度为2的序列,长度为5,零填充,最终导致将注意力权重计算为相似填充0的向量的softmax,例如:



并且因为exp(0)= 1,所以零填充实际上会“降低”注意力权重。在softmax操作之后,可以通过将权重乘以二进制掩码即



然后将权重总和归一化为1。这将导致:



当我这样做时,几乎总能看到性能的提升(就我模型的准确性而言-我正在进行文档分类/回归)。那么为什么没人这样做呢?

一段时间以来,我认为可能最重要的是注意力权重的相对值(即比率),因为梯度无论如何都不会通过零填充。但是,如果归一化无关紧要,为什么为什么要全部使用softmax而不是exp(.)呢? (此外,这不能解释性能的提高...)

最佳答案

好问题!我相信您的关注是正确的,填充编码器输出的关注得分为零确实会影响关注。但是,您必须牢记以下几个方面:

  • 有不同的得分函数,tf-rnn-attention中的一个得分函数使用简单的线性+ tanh +线性变换。但是,即使这个分数函数也可以学习输出负分数。如果您看一下代码并想象inputs由零组成,则矢量v不一定会由于偏置而为零,并且带有u_omega的点积可以将其进一步提升为低负数(换句话说,具有非线性特征的纯简单NN可以做出正面和负面的预测)。低的负分数不会降低softmax中的高分数。
  • 由于采用了存储桶技术,存储桶中的序列通常具有大致相同的长度,因此输入序列的一半不太可能用零填充。当然,它不能解决任何问题,仅意味着在实际应用中,填充的负面影响自然会受到限制。
  • 您最后提到了它,但我也想强调一下:最终的人为输出是编码器输出的加权和,即相对值实际上很重要。以您自己的示例为例,并在这种情况下计算加权和:
  • 第一个是0.2 * o1 + 0.23 * o2(其余为零)
  • 第二个是0.48 * o1 + 0.52 * o2(其余的也是零)

  • 是的,第二个向量的大小是原来的两倍,这不是关键问题,因为它随后进入了线性层。但是对o2的相对关注仅比使用屏蔽时高了7%。

    这意味着即使注意权重在学习忽略零输出方面做得不好,对输出矢量的最终影响仍然足以使解码器考虑正确的输出,在这种情况下,专心于o2
    希望这能使您相信重新标准化不是那么关键,但是如果实际应用的话可能会加快学习速度。

    关于tensorflow - 是否应该将可变长度序列上的RNN注意权重重新归一化为 "mask"零填充的影响?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49522673/

    10-12 21:09