https://arxiv.org/pdf/2402.10685.pdf
LONGHEADS的核心思想是充分利用多头注意力机制(multi-head attention)的潜力,通过一种无需额外训练 的方法来增强LLMs处理长文本的能力。
- 多头注意力机制的潜力挖掘 :在传统的多头注意力机制中,每个注意力头(head)都会关注整个句子。LONGHEADS允许每个头只关注句子中的重要部分,即所谓的“重要上下文块”(context chunks),而不是整个句子。这样做可以避免由于超出预训练长度(out-of-pretrained length)导致的分布外(OOD)问题。具体的流程为,对输入进行分块,块大小为l,输入X = (x1,...,xn),可以表示为X=(C1,...,Cm), m=[n/l],推理的时候每个头,会根据策略选取k个块,拼接成一个不超出预训练长度的输入。
- 上下文块选择策略 :通过计算query向量和块向量的点积来确定每个头应该关注哪些块。每个头会根据其偏好选择不同的文本块,从而在预训练长度内有效地处理所关注的tokens。首尾2个块必选,其他的通过相似度选取。
- 上下文块向量表示 :例如c1块内,qi,ki,vi的维度均为l * d,块内做self-attention(qi,ki,vi),可以得到一个新的oi = mean(oi) 维度也为l * d, oi平均池化作为c1块的query,维度为1 * d, 继续做一个self—attention(query,ki,ki),得到块ci的表示,ci的维度为 1 * d,有2次self attention解释如下:
- 想获取到chunk的表征ci,可以简单的池化每个ki得到,但是实际上不同的ki很显然可能有不同的权重,所以很自然的可以用attention的方式加权得到表征,所以问题就是如何得到chunk的query向量,用来计算权重
- 计算query向量,就是通过self-attention(qi,ki,vi)得到oi,池化oi得到
- 位置重映射 :因为选了k个chunk,把位置映射成连续的,如下图:
大海捞针的测试: