明确地说,我指的是Hierarchical Attention Networks for Document Classification中描述的类型的“自我关注”,并实现了很多地方,例如:here。我是而不是,是指编码器-解码器模型(即Bahdanau)中使用的seq2seq注意类型,尽管我的问题也可能适用于此...我只是不太熟悉。
自我注意基本上只计算RNN隐藏状态的加权平均值(均值池的概括,即未加权平均值)。当同一批中有可变长度的序列时,通常会将它们补零到该批中最长序列的长度(如果使用动态RNN)。计算每个序列的注意权重时,最后一步是softmax,因此注意权重总和为1。
但是,在我所看到的每个注意力实现中,都没有采取任何措施掩盖或消除零填充对注意力权重的影响。这对我来说似乎是错误的,但是我担心我可能会丢失一些东西,因为似乎没有其他人对此感到不安。
例如,考虑一个长度为2的序列,长度为5,零填充,最终导致将注意力权重计算为相似填充0的向量的softmax,例如:
并且因为exp(0)= 1,所以零填充实际上会“降低”注意力权重。在softmax操作之后,可以通过将权重乘以二进制掩码即
然后将权重总和归一化为1。这将导致:
当我这样做时,几乎总能看到性能的提升(就我模型的准确性而言-我正在进行文档分类/回归)。那么为什么没人这样做呢?
一段时间以来,我认为可能最重要的是注意力权重的相对值(即比率),因为梯度无论如何都不会通过零填充。但是,如果归一化无关紧要,为什么为什么要全部使用softmax而不是exp(.)呢? (此外,这不能解释性能的提高...)
最佳答案
好问题!我相信您的关注是正确的,填充编码器输出的关注得分为零确实会影响关注。但是,您必须牢记以下几个方面:
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/