Self-Attention with Relative Position Representations
摘要
在原始transformer,位置信息通过加一个position的embedding实现,(因为position开始也是一个one-hot)
本文提出将 自注意力 考虑 token之间的距离位置信息
相对位置表示 比 绝对位置表示 在机器翻译任务上提升(BERT为啥不用相对位置?感觉因为机器翻译这个任务更关注token之间的相对位置)
并且发现:结合 绝对位置表示 和 相对位置表示,没有进一步提升
做法
一句话看成graph,把token看成节点,token之间的边用向量表示,
首先要理解position_embedding就是position的embedding,即比如one-hot的position是[1,2,3,4,5,6,…]则position_embedding就是对[1,2,3,4,5,6,…]进行embedding
代码:
https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/layers/common_attention.py 的dot_product_attention_relative
方法
由 dot_product_attention_relative
方法 里面的 _generate_relative_positions_embeddings
方法可知:
相对位置表示,先构造 [length_q, length_k] 的one-hot矩阵,再将 [length_q, length_k]
进行embedding_lookup
成[length_q, length_k, hidden_size] 即Relative-position-embedding
之后在 _relative_attention_inner
方法将 Relative-position-embedding 计算入原始注意力里:
由 length == length_k == length_q
Relative-position-embedding = [length, length, hidden_size]
和input_x[length, batch, hidden_size] 进行matmul得到一个tensor [batch,length,length],
这个tensor加到原始那个attention matrix
Relative-position-embedding = [length, length, hidden_size] 和 input_x [length, batch, hidden_size] 进行matmul,这个还是不太理解