- transformer(self-attention)优点:
- 注意力机制如何抵消注意力加权位置的平均化导致降低有效分辨率问题?
- LayerNorm与残差连接
- transformer中的数字
- Attention为何采用点积,而不是加法注意力,为什么乘以缩放系数1/√dk?
- 解码器多头注意力如何使用编码器的Q、K?
- transformer中的mask策略?解码器的自主力层如何确保对位置i预测只依赖于小于i的位置的已知输出?
- 编码器和解码器的6个相同layer是循环六次吗?.
- 最开始输入如何获取词embding?
- transformer权重共享
- Transformer计算细节
- 为什么 Encoder 给予 Decoders 的是 K、V 矩阵
transformer(self-attention)优点:
详见Transformer/CNN/RNN的对比(时间复杂度,序列操作数,最大路径长度)
- 每层计算复杂度低
可以并行化的计算量(由所需的最小顺序操作数来衡量 )
三种模型的并行程度:从计算方式上看,只有RNN才需要串行地完成
次序列操作,而self-attention和convolution的n次序列操作均可以并行完成。因为RNN还需要依赖于上一个时间步的隐藏层输出,而其他模型仅仅依赖于输入。
网络中远程依赖之间的路径长度
Path length指的是要计算一个序列长度为n的信息要经过的路径长度。cnn需要增加卷积层数来扩大视野,rnn需要从1到n逐个进行计算,而self-attention只需要一步矩阵计算就可以。所以也可以看出,self-attention可以比rnn更好地解决长时依赖问题。当然如果计算量太大,比如序列长度n>序列维度d这种情况,也可以用窗口限制self-attention的计算数量
- self-attention模型更可解释,attention结果的分布表明了该模型学习到了一些语法和语义信息
注意力机制如何抵消注意力加权位置的平均化导致降低有效分辨率问题?
使用多头注意力机制,多头注意允许模型在不同的位置上共同关注来自不同表征子空间的信息。在单头注意的情况下,平均化抑制了这一点。
LayerNorm与残差连接
transformer中的数字
编码器由N=6个相同的layer组成;每个Layer由2个sub-layer组成;每个sub-layer由多头自注意力和全连接层组成;每个sub-layer使用残差连接和normalisation;
解码器由N=6个相同的layer组成。每个layer由3个sub-layer组成;每个sub-layer由masked多头注意力、多头注意力和全连接层组成。每个sub-layer使用残差连接和normalisation;
输出由1个全连接层和1个softmax层组成。
Attention为何采用点积,而不是加法注意力,为什么乘以缩放系数1/√dk?
K和Q的点乘是为了得到一个attention score 矩阵,用来对V进行提纯。K和Q使用了不同的W_k, W_Q来计算,可以理解为是在不同空间上的投影。正因为 有了这种不同空间的投影,增加了表达能力,这样计算得到的attention score矩阵的泛化能力更高。
加法注意力使用单隐层的前馈网络来计算兼容性函数。虽然两者在理论上的复杂性相似,但点乘法注意力在实践中要快得多,而且空间效率更高,因为它可以用高度优化的矩阵乘法代码来实现。
虽然对于小的dk来说,这两种机制的表现相似,但对于较大的dk值来说,加法注意力优于点积注意力,且没有缩放[3]。对于大的dk值,点积的大小会越来越大,把softmax函数推到它的梯度极小的区域4。为了抵消这种影响,我们将点乘的比例定为1√dk。
解码器多头注意力如何使用编码器的Q、K?
Q是解码器的属性,而K, V是encoder端最后输出的K和V。attention的计算方式和之前的计算方式都是一样的。通过这个方法编码器可以捕捉编码器的输出信息。这一部分fairseq中使用了static k,q,v来表示(fairseq的这两块代码是分开的),因为编码器输出后,在解码过程中,这些k, v是不会变的。
transformer中的mask策略?解码器的自主力层如何确保对位置i预测只依赖于小于i的位置的已知输出?
mask 表示掩码,它对某些值进行掩盖,使其在参数更新时不产生效果。Transformer 模型里面涉及两种 mask,分别是 padding mask 和 sequence mask。其中,padding mask 在所有的 scaled dot-product attention 里面都需要用到,而 sequence mask 只有在 decoder 的 self-attention 里面用到。
- padding mask
什么是 padding mask 呢?因为每个批次输入序列长度是不一样的也就是说,我们要对输入序列进行对齐。具体来说,就是给在较短的序列后面填充 0。但是如果输入的序列太长,则是截取左边的内容,把多余的直接舍弃。因为这些填充的位置,其实是没什么意义的,所以我们的attention机制不应该把注意力放在这些位置上,所以我们需要进行一些处理。具体的做法是,把这些位置的值加上一个非常大的负数(-10000),这样的话,经过 softmax,这些位置的概率就会接近0。而我们的 padding mask 实际上是一个张量,每个值都是一个Boolean,值为 false 的地方就是我们要进行处理的地方。
- Sequence mask
sequence mask 是为了使得 decoder 不能看见未来的信息。也就是对于一个序列,在 time_step 为 t 的时刻,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。因此我们需要想一个办法,把 t 之后的信息给隐藏起来。那么具体怎么做呢?也很简单:产生一个上三角矩阵,上三角的值全为0。把这个矩阵作用在每一个序列上,就可以达到我们的目的。
def Mask(size):attention=(1,size,size)#产生上三角矩阵mask=np.triu(np.ones(attn_shape),k=1)#1-mask为对角线+下三角矩阵return torch.from_numpy(1-mask)
- 对于 decoder 的 self-attention,里面使用到的 scaled dot-product attention,同时需要padding mask 和 sequence mask 作为 attn_mask,具体实现就是两个mask相加作为attn_mask。
- 其他情况,attn_mask 一律等于 padding mask。
编码器和解码器的6个相同layer是循环六次吗?.
同一个结构循环创建六次,但是权重不同
最开始输入如何获取词embding?
torch.nn.Embding(vocabsize,hidden_size)
transformer权重共享
Transformer计算细节

第一个输入的query与所有输入的key做softmax得到注意力分数,每个分数与其对应输入的value相乘得到加权值表示(左侧黄色),所有加权值相加得到输入1对应的输出(左上侧深绿色或右下侧粉色z1,即自注意力机制会将所有相关单词的理解融入到我们正在处理的单词中)。重复此过程,得到所有输入对应的输出。
为什么 Encoder 给予 Decoders 的是 K、V 矩阵
我们在讲解 Attention 机制中曾提到,Query 的目的是借助它从一堆信息中找到重要的信息。
现在 Encoder 提供了 Ke、Ve 矩阵,Decoder 提供了 Qd矩阵,通过 “我爱中国” 翻译为 “I love China” 这句话详细解释下。当我们翻译 “I” 的时候,由于 Decoder 提供了 Qd 矩阵,通过与 Ke、Ve 矩阵的计算,它可以在 “我爱中国” 这四个字中找到对 “I” 翻译最有用的单词是哪几个,并以此为依据翻译出 “I” 这个单词,这就很好的体现了注意力机制想要达到的目的,把焦点放在对自己而言更为重要的信息上。
参考文献
21个Transformer面试题的简单回答_zandaoguang的博客-CSDN博客
DASOU:答案解析(1)—史上最全Transformer面试题:灵魂20问帮你彻底搞定Transformer
