RNN对可变长度序列的注意权重是否应重新标准化为"掩盖"零填充的影响?

时间:2018-03-27 21:27:06

标签: tensorflow machine-learning deep-learning rnn attention-model

要明确,我指的是&#34;自我关注&#34; Hierarchical Attention Networks for Document Classification中描述的类型,并实现了许多地方,例如:here。我指的是编码器 - 解码器模型(即Bahdanau)中使用的seq2seq类型的注意,虽然我的问题可能也适用于那个...我对它不熟悉。< / p>

自我关注基本上只计算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,零填充效果&#34;降水&#34;注意力量。在softmax操作之后,通过将权重乘以二进制掩码,即

,可以很容易地修复这个问题
  

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

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

  

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

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

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

2 个答案:

答案 0 :(得分:3)

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

  • 有不同的分数函数,tf-rnn-attention中的分数函数使用简单的线性+ tanh +线性变换。但即使这个分数函数也可以学会输出负分数。如果您查看代码并假设inputs由零组成,则向量v由于偏差而不一定为零,而带u_omega的点积可以将其进一步提升为低负数(在换句话说,具有非线性的简单NN可以做出正面预测和负面预测。低负分数不会降低softmax的高分。

  • 由于存储技术,存储桶中的序列通常具有大致相同的长度,因此不太可能有一半的输入序列用零填充。当然,它并没有解决任何问题,只是意味着在实际应用中,填充的负面影响自然是有限的。

  • 你最后提到过它,但我也要强调它:最终有人参与的输出是编码器输出的加权和,即 relative < / em>值实际上很重要。在这种情况下,以您自己的示例计算加权和:

    • 第一个是0.2 * o1 + 0.23 * o2(其余为零)
    • 第二个是0.48 * o1 + 0.52 * o2(其余的也是零)


    是的,第二个矢量的幅度是两倍大,并且它不是一个关键问题,因为它会进入线性层。但o2的相对注意力仅比屏蔽时高7%。

    这意味着即使注意力量在学习忽略零输出方面做得不好,对输出向量的最终效果仍然足以让解码器将正确的输出考虑在内,在这种情况下,专注于o2

希望这让你相信,重新规范化并不是那么重要,但如果实际应用可能会加快学习速度。

答案 1 :(得分:0)

BERT implementation应用填充蒙版来计算注意力得分。 非填充注意分数加0,填充注意分数加-10000。与其他注意力得分值相比,e ^ -10000很小。

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)