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,这个还是不太理解