Attention 机制
可见早期文章:Transformer
标准 Attention
Attention 概念
- Input:一般是一个句子,乘以矩阵,得到Q、K、V 3个向量。
- Query:表示当前查询query
- Key、Value:Key是各个位置的键,Value各个位置的信息
: 计算注意力权重,即当前query对各个位置的注意力 。 - 早期QK有 dot/concat/w 这3种score计算的3种方式
- 加权求和:利用注意力权重对各位置Value加权求和,就得到输出
- 除以
进行缩放,防止梯度爆炸,

Self-Attention
- Self-attention:self顾名思义,计算自身序列中各位置与其他各位置的注意力,V来自自身。
- Target-Attention:计算自己和其他内容的注意力,V来自其他内容。
- Self-Attention 可以通过两个位置一步attention计算,远距离学习知识依赖和语序结构。
- RNN/LSTM:距离越远,信息损耗越大,有效提取捕获远可能性越小。

- 👁️Attention:有锚点👍
- 有Query和Key,有Value。Query作为一个锚点计算attention score后做加权。
- 比喻:左手拿白色小球,右手从袋子抓球,抓出来和左手做对比
- 全连接层:🈚️锚点
- 无Query和Key,只有一个Value。最后给每个v一个权重做加权。
- 比喻:在袋子里凭记忆和感觉随便抓一个球出来。
Attention 变体
- 最早期的Attention、Hard Attention等。
- Muliti-Head Attention:使用多组QKV生成多个Z,拼接乘大矩阵,得融合Z,再给FFN。
- 学习不同表征,识别不一样的模式,增强模型表达能力
- Relative Position Encoding:使用相对位置编码引入位置信息
几个重点思考(降维/dk等)
1、Self-Attention Padding 做 Mask
,需要对padding部分置为 负无穷,再过Softmax才会为0。
2、Transformer Multi-Head Attention 要对head 进行降维
- 输入向量维度为
,需要降维到 (远小于d),主要是为了降低计算复杂度 - 时间复杂度:
3、维度和点击的关系
向量 维度d越大,点积值 越大,点积属于均值0、方差 的正态分布。 方差的性质
3、深入理解
Attention计算过程:内积
后 -> softmax。softmax主要入参是 。 如果不进行缩放,softmax参数在
之间, 参数会很大或很小,导致attention接近one-hot分布。 - 饱和区梯度消失:x值继续变大,y几乎不变
因此,QK后才除以
,使得softmax入参在 之间,不大也不小。 数学思路
除以 ,抵消掉,由0-d正态分布,又回到0-1正态分布。
- 方差为1,有效控制点积结果发散,应对了梯度消失问题。
MHA & MQA & GQA
MHA (Multi-Head Attention, 2017年, 谷歌) 多头注意力
- 多组QKV,学习不同表征模式,增强模型能力。
- 类似于CNN,多个卷积核**(多头)关注不同部分**,最终再融合起来得到更好效果。
- 实际计算:对词向量维度512进行8头切割,每头输入维度为64,最后采用concat进行融合。
MQA (Mulit-Query Attention, 2019年, 谷歌)
- 所有head共享同一个Key和Value 矩阵,每个头仅保留Query参数,大大减少KeyValue参数量。
- 提升推理速度,但带来精度损失。
GQA (Grouped Query Attention, 2023年,谷歌)
- query分为n组,每组共享Key和Value矩阵。其实就是在MQA基础上做了折中。
- 精度比MQA好,速度比MHA快。

Flash Attention
1、GPU 限制
GPU - SRAM
:很小很快,20MB、19TB/s (吞吐量)GPU - HBM
:GPU显存大小,大但慢,80GB、1.5TB/s- CPU - DRAM:CPU内存,很大但很慢, 1TB、12GB/s

2、Softmax Tiling
参考文章:FlashAttention中的softmax快分块计算详解
- 数值稳定:避免数值
过大溢出,每个元素都减去最大值得 - 改进后
落在[0,1]区间。softmax结果和原softmax一致
- 改进后
- 分块计算softmax:
- 把X分为多个块,各块单独计算最大值、softmax分子、softmax分母
- 根据各块信息,计算全局分母;再更新各自分子,得全局分子。
3、Flash Attention 算法
- 主要目标:避免从GPU-HBM中读取和写入注意力矩阵。
- 计算softmax不需要全局信息
- 把输入分块,以分块增量方式计算softmax,即
softmax tiling
算法。
- 把输入分块,以分块增量方式计算softmax,即
- 反向传播不存储中间attention矩阵(
),只存储softmax归一化系数。 - 标准Attention:需要把过程中的S、P写入HBM中,矩阵大小和输入序列长度有关,非常大
- FlashAttention:不使用中间注意力矩阵,通过存储归一化因子来减少HBM内存的消耗。
- 算法流程,具体见论文。
- 简单讲:每次只计算一个block的只,通过多轮双for循环完成注意力计算。

Normalization
为什么需要归一化:参见之前的笔记网络优化-数据预处理
- 未归一化:各样本欧式距离度量不准,梯度下降法搜索效率低,模型训练困难
- 归一化:各维度特征归一化到同一个区间;消除不同特征的相关性
Batch Norm(2015)
BN定义
- 范围:对一个Batch的样本,为每个通道数据做归一化
- 求均值、方差,让数据标准化到(0, 1)正态分布,避免发生梯度消失
- 加入缩放
和平移变量 :使数据在归一化后保留原有学习来的特征
BN优点
- 允许大学习率,降低对初始化的依赖
- 让中间层数值更稳定,为后面的网络提供坚实基础
- 轻微正则作用 (隐藏层+噪声,类似dropout)
存在的问题
- bs太小:效果不好,均值方差不足以代表整个数据
- bs太大:超过内存;会固定梯度下降方向导致难以更新;需跑更多epoch导致训练时间变长
Layer Norm(2016)
定义
- 范围对同一层所有神经元的输入 / 某条数据(tensor)的多个维度 做归一化
- 算法:同BN,归一化+缩放平移参数
优点
- 不需要Batch训练,在单条数据内部就能归一化
- LN可以有效缓解RNN的梯度消失和爆炸问题,但在CNN上效果不如BN

Post & Pre Layer Norm(2020)
- Post-LN:
- 定义:LN在残差之后做归一化,最初Bert的LN。
- 优点:对参数正则化更强、模型收敛性更好
- Pre-LN:
- LN在MHA之前做归一化。
- 优点:一部分参数直接加在后面,没有正则化,可在反向时防止梯度消失或爆炸。
- 大模型训练难度大,使用Pre-LN居多。

Deep Norm(2022)
定义
- 范围:对Post-Layer Norm的改进。
- Post-LN问题:不稳定性来自梯度消失以及太大模型更新。
- 算法:
- 在LN之前,乘以
扩大残差连接。 LayerNorm(x * alpha + f(x))
- 以β减小部分参数的初始化范围,Xavier均匀分布初始化
- 在LN之前,乘以
优点
- 具备Post-LN的好性能,且具有Pre-LN 的稳定训练
RMS Norm(2019) & pRMS Norm
RMS Norm
针对LayerNorm改进,主要区别在于去掉了减去均值的部分,采用根均方。
RMS 操作 (Root Mean Squre):
pRMS Norm
- 核心思想:用部分数据,代替全部的计算,p为前p%的数据
Instance Norm(图像, 2017)& Group Norm (2018)
Instance Norm
- 范围:针对图像做Norm,对每个样本的H、W维度做,保留N、C维度。
- 算法:只在Channel内部求均值做标准差
Group Norm
- 范围:对每个Chanel,再继续划分g个组,每组去做归一化。
各种Norm对比

位置编码
不同于RNN/CNN模型,Transformer模型必须加入位置编码,纯粹靠attention是无法捕捉顺序信息的,即无法区分不同位置的token。
- 绝对位置编码
- 优点:实现简单,不用训练,高效计算。
- 缺点:没有外推性。
- 相对位置编码
- 优点:直接体现相对位置,效果更好。具有一定外推性。
- 缺点:模型计算复杂,长序列仍然有外推性问题。
- RoPE(旋转位置编码)
- 优点:结合了绝对和相对位置的优点。
- 缺点:实现复杂,理论上外推性更好,但可能仍然存在外推问题。没训练过,效果不好。
绝对位置编码
早期笔记:Transformer-位置编码
核心思想:直接为输入
1. 可训练式
- 定义:把位置向量作为可训练的参数,如
维度。 - 缺点:没有外推性,难处理超过最大长度n的位置
2. 三角式
定义:
中第 和 各位置的值,分别由sin和cos函数来定义。 优点:三角函数有一定外推性,不用训练。
缺点:但现在很少看到这种绝对位置编码的工作。
3. 递归式
- 定义:通过递归计算位置编码,
,示例论文。 - 优点:具有较好外推性
- 缺点:牺牲并行性,计算不足
相对位置编码
核心思想
- 不建模输入位置的全局信息,在计算attention时,考虑当前位置和目标位置的相对距离
- NLP任务更适合相对位置编码👍。
💥计算
⭐
🧠 1、经典相对位置编码核心思想
核心
- 从绝对位置attention公式出发
- 去掉
及复杂内容, 由二元位置向量 来代替,主要在softmax和v加权里变换。
💥相对位置
:只依赖相对距离 ,再进行截断,缩小至有限范围 ❤️。 - Clip裁切:把相对距离缩短至有限范围。
:位置向量
- 优点
- 只需要有有限个位置向量,即可表示任意相对位置(因为进行了截断) 👍
2、XLNet式相对位置编码
- 核心
- 从公式
展开,把 改成相对位置向量 , 把2个 替换为可训练向量 和 不做截断,用了Sinusoidal式的生成方案。 加权时不再需要位置偏置,直接是 - 后期工作相对位置只在attention权重上计算,不在v上了。
- 从公式
3、T5
核心:从
展开出发做简化。认为输入和位置当解耦不做交互,直接删掉很多项,增加相对位置编码可训练参数 不做 截断,做分桶处理,相对位置 对应 。近的位置使用独立精细编码,越远越共用一个位置编码。
4、Deberta式
- 核心:从
出发,扔掉第4项,保留2、3项并改为相对位置编码。
旋转位置编码
参考文章
- RoPE 无显式的远程衰减,这在Long Context至关重要。
- RoPE 通过不同频率的三角函数有效区分了长程和短程,达到了类似层次位置编码的效果。
- 是一种真正的位置编码,这也是Long Context中比较关键的一环。
- RoPE直接作用于Q、K,不改变Attention的形式,与Flash Attention更契合,更容易Scale Up。
🌟核心思想
- RoPE位置编码通过将一个向量旋转某个角度,为其赋予位置信息。
- RoPE通过绝对位置方式实现相对位置编码😍, 综合了绝对和相对的优点。
- 为
、 向量注入绝对位置信息 , (注:很多文章使用的是m和n,这里为了保持和上文一致所以使用 )
和 向量内积时,带上相对位置信息
推导过程
通过复数方程找到使等式成立的g函数,最终求解得到
- 💥
公式,绝对位置编码 (假设是q是二维向量, 是常数)
- 💥
公式,相对位置融入
- 多维向量旋转:多维向量,两两一组,分别旋转,得到旋转公式。
- 远程衰减:
。 - 相反,如果
是1,随着 距离增加, 内积会震荡不会远程衰减,这就是问题。
- 相反,如果
- 💥
旋转矩阵
- 二维空间存在旋转矩阵
,二维向量左乘 ,相当于逆时针旋转 弧度。 RoPE
旋转编码名称的来源。
- 只要对向量进行旋转,就能添加对应的位置信息,且具有周期性。

ALiBi (Attention with Linear Bias)
核心
- 目的:解决训练推理长度不一致的问题,如 训练 1024,推理 2048
- 思想:在
计算时加一个阈值好的偏置,偏置包括了Q和K的相对位置,相距越远贡献越低。不直接输入位置编码。 - 外推性会更好点。

长度外推篇
问题:模型输入长度,训练短,预测长,导致泛化性效果不好。
FFN 层
两个全连接层+激活函数:
接在attention输出后面,带有激活函数,做复杂非线性变换,对最终性能非常重要。
增加FFN的维度有利于提升效果,一般比attention层维度大。
- 如Transformer里 attention输出是512,FFN是2048。
注:后期多用GeLU。ReLU 更适用于CNN,而 GeLU FFN。
激活函数
- 早期激活函数笔记:
Sigmoid
、Tanh
、ReLU
、Maxout
。
GeLU
- ReLU缺点:当输入为负数值为0,可能导致神经元死亡,降低模型表达能力。
- GeLU:很像ReLU,是一个连续的S曲线更平滑。
- 优点:一定程度上缓解死亡问题。
- 缺点:计算比ReLU慢。

Swish
- 特点:接近0时,像线性函数;远离0时,具有非线性特性。
- 优点:相比ReLU/Tanh等具有更好性能和收敛速度。
- 缺点:计算使用sigmoid,开销大。
- 公式如下,
是可调节参数。
解码策略
采样方法
- 贪心解码:每次选择概率最高的单词。会导致文本单调和重复。
- 随机采样:多样性好,但质量差。
- Beam Search:
- 维护k个大小的序列,每一步选择概率最高的k个单词;从所有选择中,保留概率最高的k个序列。
- 平衡了质量和多样性。贪心解码是k=1的BeamSearch。
大模型常用的top-k和top-p介于贪心解码和随机采样之间。
Top-k
- 策略:每一步从概率最高的k个候选词中随机选一个。
- 优点:k越大多样性越好,但质量越低。
- 缺点:
- top-k只考虑了单词概率,没有考虑语义和语法关系。
- 可能导致生成文本不符合常识和逻辑,比如
我喜欢吃
,解码为苹果
。但可能我并不喜欢吃,而且上下文提到了。 - k难以确定。
- 通常和top-p一起使用。
Top-p(核采样/Nucleus采样)
- 策略:每一步从累计求和概率高于p的单词中进行随机采样,即只关心核心部分,忽略尾部部分。
- 如设置p=0.9,只考虑前90%的词
Temperature
- 策略:和语言模型温度参数T类似,是一个概率缩放参数。温度越高,越趋近于均匀采样,温度越低,越倾向于概率越高的。
- 计算:使用logits来通过温度进行缩放,然后计算softmax概率。
联合采样
优先级:top-k -> top-p -> Temperature
Transformer 模型
一些经验
Encoder和Decoder 可做权重共享
- 每一层由Self-Attention和FFN组成,在Encoder或Decoder内部,做层共享。
- 但是现在大模型时代,每一层都有独立的参数,增强表达能力
Masked Self-Attention
:Decoder解码过程,当前位置不能看到未来的内容。
一些Bert时代的经验
- Bert的非线性来源:来自于self-attention和FFN中的gelu函数。
- WarmUp策略:在训练初期,把学习率小初始值逐步增加到预设最大值,提高稳定性和加快收敛。
- 初期使用较小学习率,避免早期训练不稳定和过拟合。