本文为Google在2017年发表的一片关于注意力机制的文章。
GitHub:https://github.com/jadore801120/attention-is-all-you-need-pytorch
主要介绍了 自注意力机制 和 多头注意力机制。
Model
编码器由N = 6个相同层的堆栈组成。 每层都有两个子层。 第一个是多头自注意力机制,第二个是简单的全连接网络。 我们在两个子层的每一层周围采用了残差连接,然后进行层归一化。 也就是说,每个子层的输出是 LayerNorm (x + Sublayer(x)),其中 Sublayer(x) 是由子层本身实现的功能。 为了促进这些残差连接,模型中的所有子层以及嵌入层均产生尺寸为dmodel = 512的输出。
解码器还也由N = 6个相同层的堆栈组成。 除了每个编码器层中的两个子层之外,解码器还插入第三子层,该第三子层对编码器堆栈的输出执行多头注意力。 与编码器类似,我们在每个子层周围采用残差连接,然后进行层归一化。 作者还修改了解码器堆栈中的自注意力子层,以防止位置关注后续位置。 这种掩盖,加上输出嵌入被一个位置偏移的事实,确保了对位置i的预测只能依赖于小于i位置的已知输出。
Scaled Dot-Product Attention
输入由维数为dk的queries和keys以及维数为dv的values组成。 我们使用所有keys计算query的点积,将每个键除以 \sqrt{dk},然后应用softmax函数获得值的权重。
其公式如下:
Multi-Head Attention
与使用dmodel维的keys,values和queries执行单个注意功能相比,我们发现将queries,keys和values分别以不同的维度dk,dk和dv线性投影h次得到的结果更好。
多头注意力机制允许模型在不同位置共同关注来自不同表示子空间的信息。
其公式为: