Transformer
Attention
什么是注意力机制?
对于人类来说,注意力机制是在注意力有限的情况下,只关注接受信息的一部分,而忽略其他部分。
对于Transformer来说,以NLP为例,注意力机制就是对于当前token来说,为其所在序列中
对任务而言更重要的元素赋予更高权重(注意力)。
感知机可以认为是对不同选项赋予不同优先级(权重),以做出最终决策:
而注意力机制是对一个句子/一张图片内部元素赋予不同注意力(权重)的过程.
关于的Intuition
可以理解给定一个键值对(map),对于一个询问,我们需要计算作为键,
在给定键值对对中其值是多少。例如我们有乒乓球选手各项能力以及其胜率的键值对:
如果查询是一个新选手的各项能力,我们想知道其对应胜率。
为回答这个问题,我们大概率不能在中找到与等值的,进而直接得到.
一个解决方案是求解与所有的相似度,在用相似度与相乘,用最终的和作为对应的值。
例如:
假设这位选手和键值对表中选手的相似度为, 那么我们可以预测这位选手的胜率为
.
对于Transformer来说,相似度是使用向量点积量化的。
什么是self-attention
以NLP问题为例,当计算注意力数值时,均来自某个句子序列自身(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.
输入: 向量序列; 输出: 相同个数的向量,每个向量均考虑了所有输入向量.
具体的计算过程如下,以为例:根据,考虑序列所有元素与的相关性(权重越大相关性越大,将注意力集中
在相关性大的元素)
接下来的问题是,两个向量之间的相关程度如何量化呢?一个方法是用两个向量的点积:
注意Transformer中在计算点积之前,通过线性投影矩阵将输入向量投影至和空间.
通过计算投影至和空间的向量点积,我们得到输入序列各元素与的相关程度.
接着将相关程度通过,得到归一化后的注意力权重. (非必须,使用或其他激活函数也可以,
只是Transformer是这样设计的)
根据得到的attention scores,从序列中提取与有关的信息:
self-attention矩阵计算
Transformer中的self attention相比RNN的一个优势是计算可以并行化.
从到的计算过程: .
通过计算attention score: .
通过注意力分数和计算self attention的输出: :
综上,self attention的计算过程的矩阵乘法表示:
代码过程如下:
Self-attention
Multi-head self-attention
当我们获得时,我们可以用线性投影矩阵将其投影至多个空间,接着并行计算各个空间的
attention score, output. 最后将所有output链接作为最终输出.
这样做的目的是一方面模拟了卷积操作多个输出channel; 每个可以认为是从一个视角的注意力
分布,计算不同形式的相关性可以获得不同维度的信息。
对做进一步投影,计算各自子空间中的attention score, output:
最后将输出concatenate, 并用一个线性变换将信息投影至输出空间.
代码如下:
Multi-head Self-attention
Positional Encoding
上述计算过程均可以用矩阵乘积实现,其中并不设计每个输入元素的位置信息(交换两个元素的位置对输出没有影响).
而语句或图片等信息是具有位置的结构信息,Positional Encoding通过对每个输入向量加入一个
唯一的等长向量,嵌入作为其位置特征。
Encoder
输入一串向量,输出相等数目向量。
代码实现:
EncoderLayer & Encoder
Decoder
Transformer中的Decoder是自回归的(Autoregressive), 接受来自Encoder的输入的同时,输出预测句子的单词token, 并且token作为
下一个单词预测的输入. 也就是说AT Decoder的输出逐个生成,且本次输出作为下一次预测的输入.
代码实现:
Masked Self-attention
对于输出来说, 计算时只考虑.
why? :
masked代码实现: 在之后的位置用一个很小的数覆盖,之后的Softmax处理会近似忽略这些位置.
Cross-attention
Decoder中的Self-attention的来自Encoder输出,来自自身.
具体计算过程:
Decoder代码:
DecoderLayer & Decoder
Transformer完整架构
代码实现: https://github.com/CodesChangeHair/LearningDL/tree/main/Transformer
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!