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