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

t-f*_*low 7 machine-learning deep-learning tensorflow attention-model rnn

需要说明的是,我指的是文档分类的分层注意网络中描述的类型的"自我关注" 并实现了许多地方,例如:这里.我不是指在编码器 - 解码器模型(即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(.),如果归一化无关紧要?(加上,这无法解释性能提升......)

Max*_*xim 5

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

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

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