【深入理解Attention】Transformer的理解和代码实现

1 Self-attention 自注意力机制

【深入理解Attention】Transformer的理解和代码实现_第1张图片


在这里插入图片描述

【深入理解Attention】Transformer的理解和代码实现_第2张图片
【深入理解Attention】Transformer的理解和代码实现_第3张图片

【深入理解Attention】Transformer的理解和代码实现_第4张图片

1.1 Q K V的理解

【深入理解Attention】Transformer的理解和代码实现_第5张图片
attention和推荐算法有类似之处

我们在电商购物平台上输入查询query,然后平台返回商品列表

系统会根据query去查找所有相似度高的商品,商品自带的标签就是key,query与key相乘就得到相似度

然后根据客户的评价给所有商品打分,得到value,评价高的value就高。用户喜不喜欢、评价高不高、销量高不高就是value

最后,把相似度和value相乘就得到总分
【深入理解Attention】Transformer的理解和代码实现_第6张图片
【深入理解Attention】Transformer的理解和代码实现_第7张图片

在真实的CV或者NLP项目中,a1,a2等就是token,在NLP中我们通常处理的是给定的句子,不存在外界给定的query去查询,因此让句子中的每个词都产生query,让这个词的query分别与其他词的key做计算,得出它们之间的相似程度。

【深入理解Attention】Transformer的理解和代码实现_第8张图片

1.2 计算过程

举个例子,四个词通过embedding产生四个向量,得到4个token,v=value表示词的价值,比如按照直觉,dog的价值就高一些,如果要获得a1这个词与其他词的相似度的时候,就需要用q1与其他的k2,k3,k4相乘,就得到了a1这个词与其他词的相似度,以此类推。

【深入理解Attention】Transformer的理解和代码实现_第9张图片
在这里插入图片描述

d k d_k dk表示k的长度,除以 d k \sqrt{d_k} dk 的原因是当 d k d_k dk的值比较大的时候,也就是说query和key的维度比较长的时候, Q K T QK^T QKT的点积就会很大,就会让softmax后的梯度非常小,softmax处理让所有的权重等于1

从token中提取Q K V的实用的方式是分别乘以w1,w2,w3 ,所有的token是共用一套w1,w2,w3

【深入理解Attention】Transformer的理解和代码实现_第10张图片
这一步计算是并行的,我们可以把所有的token给concat起来,

举例,得到了QKV之后,用q1分别点乘k1,k2,k3,k4的转置,再分别除以 d k \sqrt{d_k} dk

【深入理解Attention】Transformer的理解和代码实现_第11张图片

再将这四个相似度数值分别与v1,v2,v3,v4进行相乘再相加

【深入理解Attention】Transformer的理解和代码实现_第12张图片

以此类推,计算其他的b,用a2的query分别与其他的key点乘计算相似度

在这里插入图片描述

最后得到b1,b2,b3,b4,可以看作提出的features,每个features都包含了全局信息,因为它们在计算过程中,都是自己的query和其他的key进行点乘以计算相似度分数。

1.3 代码实现

【深入理解Attention】Transformer的理解和代码实现_第13张图片
【深入理解Attention】Transformer的理解和代码实现_第14张图片

代码中首先创建了一个self-attention的类,然后在随机出输入x,(1,4,2) 1是batch_size 4是4个token,2是每个token的长度

然后把x传入对象,在self-attention的初始化函数中定义了 1 d k \frac{1}{\sqrt{d_k}} dk 1,并且从输入中提出q,k,v,其中q,k的维度是一定要保持一致的,

1.4 位置编码

【深入理解Attention】Transformer的理解和代码实现_第15张图片
位置编码是源于self-attention没有位置信息这一弊端。如左图,我们在输入过程中是按照a1,a2,a3,a4这一顺序输入的,这样我们拿到的输出就是b1,b2,b3,b4。按右图,如果我们调换输入顺序,输出的顺序也进行了变化,但是b内部的数值是没有变化的,也就是说b4在a4作为第四个输入(左图)得到的输出和作为第一个输入(右图)得到的输出在数值上的完全一样的,这就不太合理。

为了解决这个问题,就提出了位置编码

【深入理解Attention】Transformer的理解和代码实现_第16张图片
是加在输入a上面的,维度与a完全一致,不是在self-attention中的,而是直接加在a上面的

原论文中,作者提出了位置编码的两个方案:

【深入理解Attention】Transformer的理解和代码实现_第17张图片
方案一中的pos指的是第几个token,同时维度区分偶数位置和奇数位置,在偶数位置用的是sin,在奇数位置用的是cos

【深入理解Attention】Transformer的理解和代码实现_第18张图片
【深入理解Attention】Transformer的理解和代码实现_第19张图片

【深入理解Attention】Transformer的理解和代码实现_第20张图片

2 Multi-head attention 多头注意力机制

2.1 原理讲解

【深入理解Attention】Transformer的理解和代码实现_第21张图片
上面的self-attention可以看作single-head attention 在single-head attention中,我们从每个token中提取q k v
在Multi-head attention中,提取的q k v的维度=dmodel/h ,
【深入理解Attention】Transformer的理解和代码实现_第22张图片
举例,把w1分成h份,对于每个head ,w1的维度都是2x2

【深入理解Attention】Transformer的理解和代码实现_第23张图片
比如对于head 1的a11,w1和q11就是上图中的红框部分

另外还有更加简便的方法,
【深入理解Attention】Transformer的理解和代码实现_第24张图片
上图中w1的维度就是dmodel,即全维度,在得到q1,k1,v1后再分成h份,分别给到head 1—head h

然后对于每个head中的q k v进行计算

【深入理解Attention】Transformer的理解和代码实现_第25张图片
对于head 1 可以提取出b11—bm1 直到 head h提取出 b1h----bmh

然后将h个head的对应位置的b进行concat,

【深入理解Attention】Transformer的理解和代码实现_第26张图片
【深入理解Attention】Transformer的理解和代码实现_第27张图片
然后再将b1…bm乘以 W 0 W^0 W0,得到新的b1…bm,

先按列concat,再按行concat

【深入理解Attention】Transformer的理解和代码实现_第28张图片
【深入理解Attention】Transformer的理解和代码实现_第29张图片

2.2 代码实现

【深入理解Attention】Transformer的理解和代码实现_第30张图片
输入的第一个参数dim_in是输入中每个token的维度,也就是x的最后一个参数,第二个参数d_model是指采用self-attention时,QKV的总的向量长度 第三个参数num_heads是head的个数

接下来定义三个连接层求q k v

最后定义一个全连接层,求最终的结果

【深入理解Attention】Transformer的理解和代码实现_第31张图片
记录x的维度
检测x的最后一个维度和我们指定的全连接层的维度是不是一样的
再通过三个全连接层从x中提取QKV
并且通过reshape 将最后一个维度6拆分为3 2 3就是3个head 2就是q k的向量长度,再通过transpose交换把3提到前面的维度,即把(1,4,3,2)变成(1,3,4,2),(4,2)就是每个head的token的维度,因此就可以对每个head进行并行处理
然后用公式计算相似度分数
再进行softmax
再乘以v
再调整维度为(1,4,3,2)在reshape成(1,4,6)
把上面得到的b1…bm通过全连接层乘以 W 0 W^0 W0

在这里插入图片描述

定义输入x (1,4,2)1是batch_size 4是4个token,2是每个token的维度

实例化一个Multi-head self-attention的类

你可能感兴趣的:(CV知识学习和论文阅读,transformer,深度学习,人工智能)