小周带你读论文-2之“草履虫都能看懂的Transformer老活儿新整“Attention is all you need(3)

上节课我们讲到了编码-embedding,现在我们离Transformer的核心又近了一层,也就是attention层,这也是论文标题里最重要的内容,属于是扣题了

      这节应该是整个Transformer最有意思的地方了,也是大多数读者反映看着云里雾里的地方

      还是用这幅图,我直接去掉了左边的部分,画红框的地方依然是被排除了

      在经过了位置编码之后(三角编码或者RoPE),这块不理解的请看上一篇小周带你读论文-2之"草履虫都能看懂的Transformer老活儿新整"Attention is all you need(2) (qq.com)

      按照上图从下往上,我们现在要进入到所谓的“掩码多头自注意力”的模块(层)里了,为了把问题简单化,我们今天把问题拆成

  •      掩码

  •      多头

  •      自注意力

      这三部分开来讲,但是我们要先打乱一下顺序

第一个概念 自注意力:

图片

       什么是注意力?

      大家别把这东西想的如命名一般复杂,听我解释就可以了,简单理解就是一个对象和另外一个对象的相关性,这个对象可以是像素,可以是单词,可以是任何事物

       在Transformer里面,我们考虑注意力机制主要有3个元素,qkv

  • q:query

  • k:key

  • v:value

       

      比如有两个元素,一个A一个B

      假设A和B是两个字,如何判断A和B之间的关系(比如距离),可以简单的做一个点积

      假设A和B是两句话,我们依然可以用点积来判断。如下所示,我们将一句话编码,比如"我爱你", 为了简单我们把每个字(词)用3个编码的向量来表示,然后分别把这3个字对应的向量,旋转得到3个转置的向量

图片

       然后我们把这3个向量分别和转置的3个向量做点积

图片

       最后就能合成一个"我爱你"针对"我爱你"自己这句话点积后的一个矩阵,这就是自注意机制,自己和自己算,更好理解的意思是,一句话中,每个字分别和其他的字相关性矩阵,一眼就可以看到在这句话中每个字分别和另外哪些字的相关性更大

       下一步我们把它用softmax统计成一个[0,1]区间赋值的矩阵,来表示权重(相关性百分比)

     

图片

         这个看起来就简单多了,就是一个包含权重值的矩阵

         我们把原始的向量定义为q,把转置后的向量定义为k

图片

         这样就得到了,qkv自注意力公式的其中一部分(简写)

F(q,k)=SoftMax(qk)

      最后我们把F(q,k)这个权重矩阵和由原始句子生成的另外一个矩阵V矩阵相乘,就得到了加入权重计算后的qkv的值,最终算出来了自注意力的值

     为了强化记忆,我们再捋一遍流程详细版

1- 生成qkv向量(矩阵)

图片

      以上图为例,当一个句子包含4个token,进入到自注意力矩阵计算的时候,它首先要和一个生成的Wq,Wk,Wv相乘(你可以理解为,系统自动生成,实际上有3个线性层,qproj,kproj,vproj来做的),然后每个token的向量和Wq,k,v分别做点积,会算出来3个向量q,k,v(实际是生成3个矩阵,因为真实世界的输入包含batchsize等,我们先按向量来,好理解)

2- qk点乘

图片

      比如以句子的第一个token x1为例,它生成的q1向量要分别和每一个token(x2,x3,x4)的k向量做点积然后过softmax,进而会生成在这个句子中token x1和另外几个token的相关性权重百分比

3- qk和v相乘得到最终的值

图片

      当得到了qk以后,我们要和每个token对应的v向量相乘,得到最终的值,因为有权重的关系,所以放大的表示了我和哪个token之间的相关性更大,比如上图,x1就和x3的关系最大

       完整公式如下:

图片

      这里面为什么在qk的点积后要除以d^1/2(d是k矩阵的维度),是因为起到一个归一化和降低噪音的作用

      因为万一你QK点积出现了超级巨大的值,维度大,方差也就变大了,它本身就是一个噪音,而d^1/2当分母的话,就天然给他归一化了(要大一起大),这么做的好处是,你训练的时候梯度稳定

     了解个意思就完了,最重要的还是知道qkv是怎么来的,为什么能描述句子中不同token的相关性

第二个概念 掩码:

      我们正常做qk是这样的

图片

      但是前文我们讨论过我的主要目的是做NLG任务,即生成,那生成,我不可能让你知道我和后面的token有什么关系吧?因为一个句子的token,它毕竟是有时序的

      所以我乘了一个上矩阵(看你从哪个方向看和乘了,有人也说下矩阵)

图片

      上矩阵无限小,所以就代表我永远也不会选择它,通过这个方式,让自注意力计算只跟已经生成出来的token计算,没生成出来的token,它不会计算,这个就是掩码的意义所在

第三个概念 多头:

      为了防止单一一次的attention自注意机制算的值有过拟合的风险,所以我们多算几个attention,每个算一个头,这就是多头注意力机制的来源

图片

     最后多个Z的头的值,我们给他conduct一下就升维到Z*h,h是header的数量,然后再做一次加权平均,点乘上一个叫Wo的矩阵,就降维回单一的一个头,用于后面的计算

      Tips:这里我小声BB一下

图片

,多头注意力MHA,这玩意特别占显存,你说有多大用,也不知道,因为大多也都是实验数据得出的,没看到有什么数学理论来支撑,要不要做MHA,以至于后面出来MQA和GQA,那要好用出什么MQA和GQA呢?

图片

     最后上个图,结束今天的章节

图片

      那3个线性层就是 Wq,Wk,Wv 3个矩阵产生的地方,最上面的线性层就是Wo,降维用的,是不是史上最简单multi-head attetntion机制吧,如果你也看懂了,麻烦给一键三连,谢谢

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值