应该对可变长度序列上的RNN注意权重进行重新标准化,以“掩盖”零填充的影响吗?

问题描述 投票:7回答:2

需要说明的是,我指的是Hierarchical Attention Networks for Document Classification所描述类型的“自我关注”并实施了许多地方,例如:here。我不是指在编码器 - 解码器模型(即Bahdanau)中使用的seq2seq类型的注意,虽然我的问题可能也适用于那个......我只是不熟悉它。

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

然而,在我所看到的每一个注意力实施中,都没有注意掩盖或以其他方式取消零填充对注意力的影响。这对我来说似乎不对,但我担心也许我错过了一些东西,因为没有其他人似乎对此感到困扰。

例如,考虑长度为2的序列,零填充到长度为5.最终,这会导致注意权重被计算为类似0填充向量的softmax,例如:

权重= softmax([0.1,0.2,0,0,0])= [0.20,0.23,0.19,0.19,0.19]

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

mask = [1,1,0,0,0]

然后将权重重新标准化为总和为1.这将导致:

权重= [0.48,0.52,0,0,0]

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

有一段时间我认为可能最重要的是注意力量(即比率)的相对值,因为梯度无论如何都不会通过零填充。但是,为什么我们会使用softmax而不是exp(。),如果归一化无关紧要? (加上,这无法解释性能提升......)

tensorflow machine-learning deep-learning rnn attention-model
2个回答
3
投票

好问题!我相信您的关注是有效的,填充编码器输出的零注意分数确实会影响注意力。但是,您必须记住几个方面:

  • 有不同的得分函数,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

希望这能说服你重新规范化并不是那么重要,尽管如果实际应用可能会加速学习。


0
投票

BERT implementation应用填充掩码来计算注意力得分。向非填充注意力得分添加0并将-10000添加到填充注意力得分。与其他注意力得分值相比,e ^ -10000是非常小的w.r.t.

attention_score = [0.1, 0.2, 0, 0, 0]
mask = [0, 0, -10000, -10000] # -10000 is a large negative value 
attention_score += mask
weights = softmax(attention_score)
© www.soinside.com 2019 - 2024. All rights reserved.