定义:
长度外推,即免训练长度外推,就是不需要用长序列数据进行额外的训练,只用短序列语料对模型进行训练,就可以得到一个能够处理和预测长序列的模型,即“Train Short, Test Long”。
判断方法:
1.模型在处理长序列时,其损失和困惑度(PPL)是否保持在一个合理的范围。如果这些指标在处理长文本时显著增加或“爆炸”,则表明模型可能在处理长序列时遇到困难,这在实际应用中可能导致性能下降或结果不稳定。相反,如果这些指标平稳,甚至优化,那么模型就表现出了良好的长序列处理能力。
2.通过实际的性能测试。即输入足够长的上下文(Context),让模型生成或预测接下来的文本,然后将模型的输出与真实的答案进行比较。这种评测方式通常涉及使用一些标准化的指标,如BLEU、ROUGE等,来定量衡量模型输出的质量。
在长度外推的同时有没有损失远程依赖的判断方法:
测试不同长度的输入,但专注于相同长度输出部分的性能(如最后一段)。这种方法可以帮助我们理解模型在处理更长的上下文时,是否仍能保持对早期输入部分的语义捕捉,从而不失去对全文意义的控制。
长度外推方法
1.RoPE旋转位置编码
paper
RoPE 是一种在自注意力机制中引入位置信息的方法。它的核心思想是通过旋转变换保留了相对位置信息,同时使用绝对位置编码。
RoPE 具体工作流程:
1 对于输入的词嵌入序列,计算其对应的查询(Query, Q)和键(Key, K)向量。
2 对每个词的位置计算一个旋转矩阵,这个旋转矩阵是基于词的绝对位置编码和一个常数旋转角度生成的。
3 使用这个旋转矩阵对Q和K向量进行变换,这个变换是元素级的,每两个元素(作为一个二维向量)进行一次旋转。
4 然后进行常规的自注意力内积操作,计算Q和K之间的点积,这个过程自然地考虑了词之间的相对位置。
优势:
1、RoPE不带有显式的远程衰减,这对于旨在Long Context的模型至关重要;
2、RoPE是一种真正的位置编码,通过不同频率的三角函数有效区分了长程和短程,达到了类似层次位置编码的效果,这也是Long
Context中比较关键的一环;
3、RoPE直接作用于Q、K,不改变Attention的形式,与Flash
Attention更契合,更容易Scale Up。
代码实现:
1.https://blog.csdn.net/BIT_666/article/details/133696553
2.https://github.com/JunnYu/RoFormer_pytorch
2.窗口截断
窗口截断是一种常用于处理长序列数据的技术,特别是在训练和推理大型语言模型时。其基本思想是通过限制模型在每个时间步只关注输入序列的一个子集,从而降低计算复杂度和内存需求。这种方法可以在一定程度上帮助模型处理比训练时使用的序列更长的文本。
引入Sliding Window的Attention Mask
但是强行截断窗口外的注意力,并不满足“不牺牲远程依赖的能力”的原则。因此必须要加上开头的几个token。Λ -Mask。
原因:
1.开头的几个Token是绝对位置的“锚点”
2.开头的几个Token是注意力的“回收站”
3.位置内插PI
paper
这种方法基于一个假设:模型对于位置信息的学习可以通过线性变换平滑地从训练区间外推到更长的序列。
对于模型仅在较短序列上进行训练的情况,线性插值通过将超出训练长度的位置索引等比例缩小,映射到模型已经学习的位置范围内。例如,如果模型在长度为2048的序列上进行过训练,当需要处理长度为4096的序列时,位置索引将被缩放,使得原先位置0至4096的区间映射到0至2048内。
4.保近压远 Leaky ReRoPE
文章
paper
实现免训练长度外推的要领是“保近压远”,即“保证局部不失真”和“压缩远处不越界”。
实现思路:先设定一个窗口大小w,将相对位置分为两部分,在窗口不改变相对位置实现“局部不失真”,在窗口外使用位置内插实现“远处不越界”。
优势:Leaky ReRoPE和ReRoPE的表现确实都非常好,从Loss来看,它们能做到几乎不损失训练长度内的效果,并且实现了长度外推,且Context越长,Loss越低,说明它们在外推的同时还确实保证了远程依赖。
代码实现:
1.https://github.com/bojone/rerope
2.Self-Extend,增加四舍五入。https://github.com/datamllab/LongLM
5.YaRN
paper
介绍文章
YaRN = NTK-aware + NTK-by-parts + Dynamic NTK
1.“NTK-aware”插值是YaRN方法发展过程中的一个步骤,它解决了RoPE插值过程中可能丢失的高频信息问题,通过不同程度地缩放RoPE的不同频率维度。
2.“NTK-by-parts”插值是YaRN方法中的核心组成部分,它进一步细化了插值策略,特别是在处理不同频率(或波长)的RoPE维度时,以避免丢失相对局部距离信息。
3.“Dynamic NTK”插值是一个与YaRN相关的概念,它通过在模型的不同推理步骤中动态调整插值策略,提供了一种在处理不同长度序列时动态适应的方法。
代码实现:
1.https://github.com/jquesnelle/yarn
长度外推主要面向的需求场景:
-
资源限制型需求:
- 场景:这类需求的用户通常没有足够的资源进行长文本的微调训练。他们需要的是从短文本训练的模型直接得到一个可以有效处理长文本的模型。
- 特点:这种情况下的长度外推效果要求较高,因为用户希望模型能够在没有额外训练数据或计算资源的情况下,直接处理更长的文本序列。
- 方法:适合于此类需求的技术可能需要采用更高级的模型架构或策略,例如使用没有显式远程依赖损失的长度外推方法(如RoPE),以保证在不进行额外训练的情况下,模型仍能维持对长距离内容的理解和处理能力。
-
效率优化型需求:
- 场景:这类需求的用户拥有足够的资源进行长文本的微调,但他们的目标是获得一个更好的初始模型,以此为基础进行进一步的优化和训练,从而快速达到理想的性能水平。
- 特点:这种情况对模型修改带来的初始性能损失具有较高的容忍度,关键在于能否通过后续的微调迅速恢复并超越原始性能。
- 方法:位置内插(Position Interpolation, PI)等技术在这里非常适用,因为它们可以提供一个较好的起点,通过相对较短的训练周期即可调整和优化模型以处理长文本。
参考文献:
1.https://kexue.fm/archives/9948
2.https://blog.csdn.net/v_JULY_v/article/details/135072211
3.https://blog.csdn.net/qq_43814415/article/details/136976843