self-Attention

用Q来找相关的K

计算新的具有注意力信息词汇的过程

self att的 两种不同的架构

这是计算两个word的注意力分数,WW矩阵为一个transformer

image-20221121095355913

第一个词分别和其它所有词做注意力分数计算(包括自己),最后把分数进行softmax得到最终分数

image-20221121100736608

WqW_q相当于查询矩阵, WkW_k 相当与键值矩阵,WvW_v 相当于获取原始值矩阵。这三个矩阵都是共用的,这三个矩阵来控制这几个词的互相的注意力大小

​ 每个词用WqW_q获取自己的向量,WkW_k获取被查询词的向量,两向量进行点乘–> softmax后得到相似度(注意力)分数。最后这个查询的词利用获取到的所有与其他词的注意力分数和WvW_v获取的原始值分别相乘后相加得到一个新的向量。

​ 这个词的新向量就包含了其它所有词的联系信息,并且联系强弱不同,即所谓的自注意力。

计算b1b_1过程

image-20221121100926430

计算b2b_2过程

image-20221121102115542

矩阵乘法角度

既然WqW_q WkW_k WvW_v 都是共享的,那么计算qiq^i kik^i viv^i 就可以用矩阵乘法来一次性并行计算出来

1. 计算qkvqkv

image-20221121102725800

2. 计算注意力分数

每个词汇的q,分别乘其他矩阵的k,来得到与其他词的注意力分数

image-20221121103259054

3. 计算新的包含注意力信息的词汇

注意力分数和原始词汇通过WvW_v transformer后相乘得到最终的新词汇

image-20221121103549513

4. 总过程

只有WqW_q WkW_k WvW_v是需要学习的,这三个控制所有的相互之间的注意力大小

image-20221121103802259

Multi-head Self-attention

自注意力就是用Q来找相关的K,但是“相关”会有很多种不同的种类不同的形式,所以需要多个Q来找不同形式的相关。

计算b1的不同形式的注意力结果

qi,1q^{i,1}vi,1v^{i,1}一起算,qi,2q^{i,2}vi,2v^{i,2}一起算

image-20221121104818402

image-20221121105345315

最后把这个词的不同形式注意力结果拼接起来乘上最终的一个transformer WoW_o 得到这个词汇的最终注意力结果

image-20221121105459645

Positional Encoding

以上说的self attention虽然包含了其他词汇的注意力信息,但是少了个非常重要的信息–位置信息。 比如“saw a saw”这个句子中两个“saw”谁前谁后 前面提到的self attention并不知道。

不同的位置都有一个位置vector eie^i

image-20221121110536613

self-Attention 在图像领域应用

image-20221121111656334

f(x),g(x),h(x)就是 QKV

1. image-20221121132625053Self-Attention VS CNN

如果把图片做inner poduct的时候,如下图 A处的像素做Query,B处的像素做Key,每个像素考虑的就不是和CNN一样在卷积核的小范围内了,而是考虑的全局信息,所以CNN可以说是一个self-ATT的简化版本。

image-20221121112242770

CNN的receptive field是认为划定的,而self-ATT的receptive field是自动学习出来的。

下面的论文用数学的方式证明CNN就是self-attention的子集。

image-20221121112428813

CNN适用于数据集少的情况,不容易过拟合

2. Self-Attention VS RNN

关键的区别就是RNN的词汇要和离着非常远的词汇建立联系的话,会存在梯度消失的现象,难以训练,而Self-Attention不存在这样的问题

image-20221121133041510

而且RNN无法并行处理所有数据

image-20221121133121726

3. Self-Attention for graph

在之前的网络中,每个词汇之间有没有关联是自己学习出来的,但是在图里面,点之间的关联信息已经给出了,只需要计算有关联的点之间的注意力分数就够了。

image-20221121133806177

Transformer

https://www.bilibili.com/video/BV1Xp4y1b7ih?p=3&vd_source=a61337b33cfc68a14ecb4713a0602ea5

transformer 是个seq2seq的model

seq2seq有几种情况,一对一、多对一、多对多、输出长度不固定 需要网络自己学习,例如语音识别和翻译

image-20221121134635033

输入长度和输出长度之间的关系不是固定的

1. transformer架构

有一个编码架构,有个解码架构

image-20221121142508466

2. Encoer部分

作用就是给一排向量 ,输出另一排向量(包含注意力信息)。可以用CNN、RNN、Self-Attention做,Transformer里面用的是Self-Attention

image-20221121144708169

每个Encoder里面都有很多 block(对应上图中的Nx块)

每个block都是先经过Self-Attention(对应Multi-Head Attention)然后再FC(对应 Feed Forward

image-20221121142212012

在block里面还加入了残差的思想:经过self-AttFC 后先和原输入残差连接(对应Add),然后在进行Layer Normal(对应Norm)

注意这里的normal是layer normal 不是 batch nomral

image-20221121142316246

To learn more

以上是原论文中用到的结构,也有很多改进版本:

image-20221121144843731

第一篇文章讨论了layer Norm的位置在哪更合适

第二篇文章讨论了什么Normalization更好

3. Decoder

image-20221121152638056

Autoregressive

依次产生每个词

整体过程

在Decoder中,首先把Encoder的输出先读入(具体怎么读入的先不展开)

image-20221121152847134

首先定义两个特殊的符号BOS(Begin of Sentence)EOS(End of Sentence)

Decoder类似于RNN,先根据输入生成第一个词汇

image-20221121153204040

然后将这个词汇作为下一步的输入 … …

image-20221121153221093

这里存在一个问题就是会存在错误传播的问题,即一步错,步步错

详细结构

如果把Decoder中间这部分遮住,则Encoder、Decoder两个差不多

image-20221121153734898

Masked Self-Attention

区别在Decoder中有个Masked,那这个Masked是什么意思呢:

在原始的Self-Att中,每一步的输入都会考虑到后面所有步的输入

image-20221121153859890

Masked Self-attention中,当前词汇的产生不能考虑后面的部分

image-20221121154915460

因为Decoder中是一个一个输出的,当前时刻并不会获得之后时刻的信息

ps:Encoder是根据全部信息训练出来的,那么Decoder这样做会不会“不对称” ?如果实时性要求不是特别高的话,那是不是可以设置一个窗口来让当前时刻学习一下窗口长度的之后时刻的信息?

为了让Decoder可以停下,还需要设置一个特殊符号EOS

Non-Autoregressive (NAT)

一次产生所有词

image-20221121160622669

4. Encoder-Decoder之间的传递

image-20221121160814523

Decoder将输入进行Att后得到的结果当作Query,Encoder中的输出作为KeyValue进行计算

image-20221121161030680

image-20221121161255011

下面是使用seq2seq做语音识别的文章,使用到了Cross Att思想

image-20221121161805694

首先上面的声音列向量输入到Encoder中,然后decoder输出与Encoder输出做cross Att

5. Learn To more

image-20221121164644164

6. Training

在训练的时候会给Decoder看正确答案,也就是告诉Decoder 输入BEGIN时候要输出,输入的时候要输出 … …。 这种技术为Teacher Forcing

image-20221121165303236

但是现在有个问题就是Decoder在训练过程中看到的是正确答案。真正在使用的过程中没有正确答案可以看,这其中存在一个Mismatch

image-20221121171919670

这就可能导致一步错 步步错的问题

解决方法之一就是在训练过程中给Decoder加一些错误的标签,类似于加噪声,正则化

image-20221121172059757

这种技术叫做 Scheduled Sampling

image-20221121172126260

评估

在训练时后的损失是单个词汇的,而评估的时候是评估整个句子

image-20221121171019857

那能不能training的时候就考虑整个句子呢,即training的时候使用的就是BLEU loss呢? 可以,但是BLEU本身是很复杂,是不能微分的。

Trick

遇到无法 optimization的LOSS,用RL硬Train一发就对了,把它当作是RL的

image-20221121171755530

Guided Attention

强迫机器把输入的每个东西都“看到”

image-20221121170621544

To Learn more

image-20221121134304407

自注意力与交叉注意力

交叉注意力

在交叉注意力中,每个输入序列都有自己的查询向量,而输出序列的每个位置都有一个键向量。当进行交叉注意力计算时,模型会根据查询向量和键向量之间的相似度来分配权重,从而决定要将哪些信息纳入到当前位置的计算中。

这种权重的分配过程可以被看做是对每个输入序列中的每个位置进行的关注度量,因此我们可以通过观察这些关注度量来理解模型在进行推断时关注了哪些输入位置,并进一步解释模型的决策原因。

此外,在交叉注意力中,我们还可以通过可视化注意力权重矩阵来进一步解释模型的决策原因,并理解哪些输入特征对于推断结果的产生起到了决定性的作用。

因此,交叉注意力在深度学习模型中具有较好的可解释性,可以帮助我们更好地理解模型的决策过程和推断结果。

交叉注意力为什么可以同时关注多个输入序列之间的依赖关系

交叉注意力可以同时关注多个输入序列之间的依赖关系的原因在于:

  1. 分别计算多个输入序列的查询向量,以及一个输出序列(假定要根据这些输入序列得到该输出序列),然后将多个查询向量联系在一起,以便同时考虑到所有输入序列与输出序列之间的关系。
  2. 在计算注意力权重时,会同时计算多个输入序列和输出序列之间的相似度,以便于获取每个输入序列的特征,然后将它们组合起来。
  3. 在每个时刻,交叉注意力都可以计算多个输入序列当前位置的特征向量,然后加权求和得到一个位置无关的向量表示。这个向量用于计算输出序列的下一个位置。

因此,交叉注意力通过对多个输入序列的特征进行编码以及计算它们与输出序列之间的相似度,可以同时关注多个输入序列之间的依赖关系,并且根据它们进行更好的推理和预测。它可以应用于一些需要对多个输入序列进行建模的任务,如机器翻译、图像描述等。

区别

https://datascience.stackexchange.com/questions/49468/whats-the-difference-between-attention-vs-self-attention-what-problems-does-ea

https://machinelearningmastery.com/the-transformer-attention-mechanism/

自注意力机制和交叉注意力机制都是注意力机制,在深度学习中都被广泛应用于序列建模任务中,但它们之间也存在一些明显的区别。

  1. 输入的不同:自注意力机制仅关注单个输入序列的不同位置之间的依赖关系,而交叉注意力机制可以同时关注多个输入序列之间的依赖关系。
  2. 查询、键和值的不同:在自注意力机制中,查询、键和值都是从同一个输入序列中提取得到的,而在交叉注意力机制中,查询和值是从输出序列中提取得到的,键则是从另一个输入序列中提取得到的。
  3. 实现的不同:自注意力机制和交叉注意力机制在实现上也略有不同。在自注意力机制中,我们可以通过一个线性变换对输入序列进行映射,然后基于映射后得到的特征向量进行查询、键和值的计算。而在交叉注意力机制中,我们需要将不同的输入序列映射到同一维度上,然后进行类似的计算。
  4. 应用的不同:自注意力机制主要应用于单个输入序列的处理,可以用于语言建模、情感分析等任务。而交叉注意力机制则主要应用于关联不同的输入序列,可以用于机器翻译、图像描述等任务。

综上所述,自注意力和交叉注意力在输入、查询、键和值的不同、实现方式和应用场景的不同,因此在具体应用时需要酌情选择。

例子

1. 自注意力和交叉注意力 例子

下面是一个自注意力机制和交叉注意力机制的图示:

1
2
3
4
5
6
7
8
9
10
11
12
Self-attention:

Q = K = V = [x1, x2, ..., xn] (a single sequence)

Attention(Q, K, V) = softmax(QK^T / sqrt(d))V

Cross-attention:

Q = [y1, y2, ..., ym] (target sequence)
K = V = [x1, x2, ..., xn] (source sequence)

Attention(Q, K, V) = softmax(QK^T / sqrt(d))V

2. 交叉注意力多模态翻译

下面是一个多模态机器翻译的图示:

1
2
3
4
5
6
7
8
9
10
11
Image: [x1, x2, ..., xn] (image features)
Text: [y1, y2, ..., ym] (source text tokens)

Encoder: Image + Text -> [z1, z2, ..., zn+m] (concatenated features)

Decoder: [z1, z2, ..., zn+m] -> [w1, w2, ..., wk] (target text tokens)

Cross-attention: Attention([w1], [z1,...zn+m]) -> a11
Attention([w2], [z1,...zn+m]) -> a21
...
Attention([wk], [z1,...zn+m]) -> ak(n+m)

其中,Image和Text是两个不同类型的输入序列,Encoder是一个编码器网络,Decoder是一个解码器网络,Cross-attention是一个交叉注意力机制,Attention是一个注意力函数,a11,a21,…ak(n+m)是注意力权重。3


注意力机制作用被高估了?苹果等机构新研究:把注意力矩阵替换成常数矩阵后,性能差异不大

【经典精读】Transformer模型和Attention机制

Pytorch中 nn.Transformer的使用详解与Transformer的黑盒讲解

Refer


self attention PPT

台大李宏毅21年机器学习课程 self-attention和transformer