【如果笔记对你有帮助,欢迎关注&点赞&收藏,收到正反馈会加快更新!谢谢支持!】
上期笔记:
多模态大模型位置编码梳理笔记(一):绝对位置编码(正弦,可学习),相对位置编码(XL, T5, RoPE, ALiBi)-CSDN博客
一、DeepSeek 位置编码
- 前情提要:
- 绝对位置编码:将位置编码加到输入上(在Attention前添加)
- 相对位置编码:在Attention的计算过程中添加query,key上
- 动机:因为DeepSeek对query和key做了压缩,直接在压缩后的qk上添加RoPE相对位置编码不能反应原始相对位置关系 → 解耦RoPE策略
- 具体方法:将query和key(每个头)拆分成两部分:
,
储存大部分的业务信息,会被压缩
,
储存位置信息,不经过压缩,直接加入RoPE:其中
所有头共享的同一个,
每个头单独生成
- 在推理时不需要对Key进行位置编码的计算,只需要缓存
KV Cache =(语义内容) +
(共享位置)
- Attention计算流程:
通过投影矩阵还原key和value,key拼接
;
通过投影矩阵还原
和 经过RoPE处理的
拼接 → MHA计算
(图来源:2万字长文!从Transformer到DeepSeek位置编码,全面了解「大模型位置编码」!)
二、位置编码长度外推
2.0 Intro
- 为什么需要位置编码长度外推?训练模型时,通常使用固定长度的序列;推理的时候可能会遇到更长的序列,原来位置编码的长度不够用
- 直接外推:如果是十进制表示,7 6 5 (训练1-999长度) → 1 7 6 5 (1-1999长度),增加一维
- 方法:提前预留多位 0(训练阶段,如变成 0 7 6 5),推理的时候 0 改成其他数字
- 问题:模型训练的时候没见过,直接外推会导致模型的性能严重下降
- 线性内插:
- 方法:1 7 6 5 → 8 8 2.5 (依然保持三维),需要重新微调训练,来适应新的映射关系
- 问题:小时通常出现在个位,分布密集;十位百位等依然是间距为1的分布,模型难学习
- 进制转换:
- 方法:将十进制转化成十六进制(比较规则和十进制一样,模型可以看懂大小关系)
2.1 RoPE的位置编码外推
- RoPE的特点:低维度具有更快的旋转(高频,可以捕捉局部细节),高维度具有更慢的旋转(低频,对应长距离依赖)
- RoPE直接外推的问题:
- 训练长度的RoPE位置编码是在一个正余弦函数周期内的,直接外推会让额外的长度进入另一个周期 → 长距离的位置编码和训练数据的位置编码非常不同【出现较大的Attention分数】
- RoPE位置内插(PI):
- PI之后需要微调 → 改善困惑度(能够更准确地预测下一个token)
- 问题:
- 局部失真:对整个序列的位置进行线性缩放,绝对差值从
1
缩小到了1/k,
旋转的角度 也按比例缩小了k
倍,相对位置关系被“挤压”得太小、太模糊 - 高频信息的损失:削弱了模型对细微位置变化(即近距离 tokens)的感知和区分能力
- 动态缩放的缺乏:缩放因子
k 是固定死的,无法
适应不同长度的序列需求
- 局部失真:对整个序列的位置进行线性缩放,绝对差值从
- NTK-Aware 插值:
- 非线性插值方法,对 RoPE 进行高频外推和低频内插
- 即不同维度频率进行不同程度的缩放(减少高频和增加低频)来将插值密度分散到多个维度
- NTK-by-parts 插值:
- 不改变高频部分,仅缩小低频部分的旋转弧度。而且强加两个阈值来限制缩放比例高于和低于某些维度
- Dynamic NTK 插值:
- 对不同的推理长度进行插值的动态调整
- 推理长度小于等于训练长度时,不进行插值;推理长度大于训练长度时,进行NTK-Aware 插值 → 在推理过程中动态调整缩放因子 s
- YaRN (Yet another RoPE entensioN method)
- 温度系数修正注意力分布
+ NTK-by-parts 插值
- 温度系数修正注意力分布