Transformer

Attention

什么是注意力机制?

对于人类来说,注意力机制是在注意力有限的情况下,只关注接受信息的一部分,而忽略其他部分。
对于Transformer来说,以NLP为例,注意力机制就是对于当前token来说,为其所在序列中
对任务而言更重要的元素赋予更高权重(注意力)。

感知机可以认为是对不同选项赋予不同优先级(权重),以做出最终决策:

而注意力机制是对一个句子/一张图片内部元素赋予不同注意力(权重)的过程.

关于Q,K,V的Intuition

keyvalue可以理解给定一个键值对(map),对于一个询问query,我们需要计算query作为键,
在给定键值对keyvalue对中其值是多少。例如我们有乒乓球选手各项能力以及其胜率的键值对:

如果查询是一个新选手的各项能力,我们想知道其对应胜率。

为回答这个问题,我们大概率不能在keyvalue中找到与query等值的key,进而直接得到value.

一个解决方案是求解query与所有key的相似度,在用相似度与value相乘,用最终的和作为qeury对应的值。
例如:

假设这位选手和键值对表中选手的相似度为0.7,0.2,0.1, 那么我们可以预测这位选手的胜率为
0.7×0.7+0.2×0.5+0.1×0.8=0.67.

对于Transformer来说,相似度是使用向量点积量化的。

什么是self-attention

以NLP问题为例,当计算注意力数值时,Q,K,V均来自某个句子序列自身(self).

Transformer

self-attention

An attention function can be described as mapping a query and a set of key-value pairs to an output, where the query, keys, values, and outputs are all vectors. The output is computed as a weighted sum of values, where the weight assigned to each value is computed by a compatibility function of the query with the corresponding key.

输入: 向量序列; 输出: 相同个数的向量,每个向量均考虑了所有输入向量.

具体的计算过程如下,以b1为例:根据a1,考虑序列所有元素与a1的相关性(权重越大相关性越大,将注意力集中
在相关性大的元素)

接下来的问题是,两个向量之间的相关程度a如何量化呢?一个方法是用两个向量的点积:

注意Transformer中在计算点积之前,通过线性投影矩阵将输入向量投影至queryvalue空间.
通过计算投影至queryvalue空间的向量点积,我们得到输入序列各元素与a1的相关程度.
接着将相关程度通过Softmax,得到归一化后的注意力权重. (非必须,使用ReLU或其他激活函数也可以,
只是Transformer是这样设计的)

根据得到的attention scores,从序列中提取与a1有关的信息:

self-attention矩阵计算

Transformer中的self attention相比RNN的一个优势是计算可以并行化.

aiQ,K,V的计算过程: Q=WqI,K=WkI,V=WvI.

通过Q,K计算attention score: A=QKT,A=softmax(A).

通过注意力分数AV计算self attention的输出: O=VA:

综上,self attention的计算过程的矩阵乘法表示:

代码过程如下:

Self-attention



Multi-head self-attention

当我们获得Q,K,V时,我们可以用线性投影矩阵将其投影至多个空间,接着并行计算各个空间的
attention score, output. 最后将所有output链接作为最终输出.

这样做的目的是一方面模拟了卷积操作多个输出channel; 每个QKT可以认为是从一个视角的注意力
分布,计算不同形式的相关性可以获得不同维度的信息。

Q,K,V做进一步投影,计算各自子空间中的attention score, output:

最后将输出concatenate, 并用一个线性变换WO将信息投影至输出空间.

代码如下:

Multi-head Self-attention



Positional Encoding

上述计算过程均可以用矩阵乘积实现,其中并不设计每个输入元素的位置信息(交换两个元素的位置对输出没有影响).

而语句或图片等信息是具有位置的结构信息,Positional Encoding通过对每个输入向量加入一个
唯一的等长向量,嵌入作为其位置特征。

Encoder

输入一串向量,输出相等数目向量。

代码实现:

EncoderLayer & Encoder




Decoder

Transformer中的Decoder是自回归的(Autoregressive), 接受来自Encoder的输入的同时,输出预测句子的单词token, 并且token作为
下一个单词预测的输入. 也就是说AT Decoder的输出逐个生成,且本次输出作为下一次预测的输入.

代码实现:

Masked Self-attention

对于输出bi来说, 计算时只考虑a1i.

why? :

masked代码实现: 在i之后的位置用一个很小的数覆盖,之后的Softmax处理会近似忽略这些位置.

Cross-attention

Decoder中的Self-attention的K,V来自Encoder输出,Q来自自身.

具体计算过程:

Decoder代码:

DecoderLayer & Decoder




Transformer完整架构

代码实现: https://github.com/CodesChangeHair/LearningDL/tree/main/Transformer


参考资料

posted @   代码改变头发  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示