需要说明的是,我指的是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(。),如果归一化无关紧要? (加上,这无法解释性能提升......)
好问题!我相信您的关注是有效的,填充编码器输出的零注意分数确实会影响注意力。但是,您必须记住几个方面:
inputs
由零组成,矢量v
不一定是零因为偏差而且u_omega
的点积可以将它进一步提升到低负数(换句话说,简单的NN具有非线性可以做出积极和消极的预测)。低负分数不会降低softmax的高分。0.2 * o1 + 0.23 * o2
(其余为零)
第二个是0.48 * o1 + 0.52 * o2
(其余的也是零)
是的,第二个矢量的幅度是两倍大,并不是一个关键问题,因为它会进入线性层。但对o2
的相对关注仅比屏蔽时高出7%。
这意味着即使注意权重在学习忽略零输出方面做得不好,对输出向量的最终效果仍然足以使解码器考虑正确的输出,在这种情况下专注于o2
。希望这能说服你重新规范化并不是那么重要,尽管如果实际应用可能会加速学习。
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)