![]()
你有没有想过,一个模型在读一份超长文档的时候,到底在"看"什么?
不是所有的字都被平等对待。研究者发现,当大语言模型处理长文本时,注意力这个机制会把大部分"关注度"砸在一些固定位置上,比如文档开头的几个词,有时候能吃掉超过90%的注意力,而真正和你问题相关的内容,可能只分到了不到1%的关注度。这听起来有点荒谬,就像一个人读书的时候,眼睛死死盯着封面,而正文内容只是余光扫过。
这篇论文要解决的,就是如何让模型在处理超长文本时,既快又准地找到真正重要的信息,而不是在无关的噪音里打转。
**长文本处理为什么这么难**
先说清楚问题出在哪。
大语言模型处理文本靠的是**自注意力机制**
自注意力机制:模型让每个词都去"看"其他所有词,计算彼此的相关程度,从而决定该重点关注哪些信息。
这个机制有个致命的数学特性:文本长度翻倍,计算量要翻四倍。如果你输入的文档是512K个token(大概相当于几十万字),模型光是计算注意力这一步,就要做天文数字级别的运算。这就是所谓的"预填充阶段"的瓶颈,说白了就是模型在正式回答问题之前,光是消化你扔给它的长文档,就要耗费巨大的时间和算力。
早期的解决办法很粗暴:要么用固定的稀疏模式,规定好只看某些位置,比如Sparse Transformer和BigBird这类方法;要么提前离线分析一遍,给每个注意力头贴上标签,比如MInference。但这些方法有个共同毛病,它们不管你具体输入的是什么内容,套路都是死的。可现实是,同一篇小说和同一份法律合同,注意力该往哪儿放,完全是两码事。
于是出现了"动态路由"这个思路的代表作,FlexPrefill。它的做法是给每个注意力头实时做判断:这个头的注意力是集中的还是分散的?集中的走精细路线(叫Vertical-Slash,也就是垂直加斜线模式),分散的走粗放路线(叫Pooled-Estimation,池化估计)。听起来挺聪明,但研究者深挖之后发现,这套系统的两个核心零件都存在设计缺陷。
第一个缺陷藏在它怎么判断"集中还是分散"这件事上。FlexPrefill用的是**JSD**
JSD(Jensen-Shannon Divergence,詹森-香农散度):一种衡量两个概率分布之间差异程度的数学指标,数值越大说明两个分布越不像。
FlexPrefill会构造两种对同一个注意力头的估计,一种是先把数据池化再算softmax,一种是先算softmax再池化平均,然后比较这两种估计差多少。差得多,就判定这个头注意力集中,走精细路线。这个判断方法本身没错,问题是它为了做这个判断,得额外算一次矩阵乘法,再算一次softmax,再算两次散度,每个注意力头都要走一遍这套流程。这就好比你想知道今天该不该带伞,非要先造一个小型气象站来测量湿度,而不是直接抬头看看天上有没有乌云。
第二个缺陷更根本,藏在"选多少个词来算注意力"这个环节上。FlexPrefill用的是**累积覆盖阈值**
累积覆盖阈值(cumulative coverage threshold γ):把注意力分数从大到小排序,一直累加,直到总和达到某个比例(比如95%)就停止选择。
这个策略听起来很合理,凑够95%的"信号总量"不就够了吗?但论文用实打实的实验数据揭穿了这个假设的问题所在。
**注意力的"悬崖":为什么凑数不管用**
论文里有一张图特别扎眼,横轴是按注意力分数从高到低排的位置,纵轴是对数坐标下的注意力大小。你会看到一个陡峭的悬崖:前面几个位置的分数高得吓人,后面立刻跌到几乎为零,中间几乎没有过渡地带。研究者把这个现象叫做**掩码质量悬崖**
掩码质量悬崖(mass cliff):注意力分数在极少数位置急剧集中,其余绝大多数位置的分数几乎为零,两者之间存在一个陡峭的分界线,而不是平缓过渡。
这个悬崖导致了两种截然相反的翻车场景。
第一种,如果开头的"锚点"位置(论文里叫架构性汇聚点)吃掉了93%的注意力,那么用累积阈值95%去选,选完锚点还差2%没凑够,模型就会继续往后翻,好不容易翻到了真正重要的信号块,结果阈值已经在锚点内部就满足了,后面8个真正重要的信息块根本没机会被选中。这叫"锚点独占式塌陷"。
第二种,如果锚点只占了61%,阈值95%还差34%没凑够,模型会一路往后扫,扫过了所有真正有用的信息块之后,还得继续扫,硬是把14个几乎没有任何信息量的噪音块也拉进来凑数,才能达到95%这个数字。这叫"残余噪音累积"。
这就好比你去自助餐厅打包晚餐,规定必须打包够95%的"份量目标"。如果第一道菜(比如沙拉)份量特别大,占了93%的重量,你打包完沙拉后还差一点点,于是你不得不再随便抓一把配菜凑数,压根碰不到你真正想吃的红烧肉。反过来,如果沙拉只占了一小部分,你就得一路把面包屑、装饰的欧芹叶都塞进打包盒,才能凑够重量指标。份量这个指标,从头到尾都没有真正衡量"这顿饭吃得值不值"。
论文还从数学上证明了这个问题会随着文本变长而恶化。因为softmax这个函数天然的特性是,如果总的噪音位置有n个,每个噪音位置分到的注意力大概是1/n这个量级。文本越长,n越大,为了凑够阈值差额,需要拉进来的噪音块数量就跟着线性增长,也就是**O(n)复杂度的噪音积累**
O(n):一种描述计算量随输入规模增长速度的表示法,这里指噪音积累的数量和文本长度成正比,文本翻倍,噪音也大致翻倍。
这意味着,你想通过调高阈值(比如从95%调到97%)来解决问题,根本是南辕北辙,因为不管阈值定多高,只要还是"累积凑数"这个逻辑,早晚会一头扎进噪音堆里。论文的实验证实了这一点:把阈值从0.95提到0.97,某些任务的准确率反而下降了,而且延迟还变高了,等于花了更多时间做了更差的事。
**CRISP的第一招:用结构代替计算,省掉多余的判断步骤**
针对第一个问题,也就是JSD判断成本太高的问题,研究者提出了一个替代方案,叫**Cstruct**
Cstruct(结构性质量代理指标):直接测量注意力分数中,落在"结构上大概率重要"位置(比如文档开头的锚点区域和最近的局部窗口)的比例,用这个比例来判断该走哪条路线,不需要额外的矩阵运算。
这个思路的洞察在于,一个注意力集中的头,它的高分位置往往就落在几个可预测的地方,比如文档最开头的128个词(锚点),或者当前位置附近的128个词(局部窗口)。既然这些位置本来就要在后续的索引选择步骤里被读取,那何不直接看这些位置上已经积累了多少注意力,用这个现成的数字来做路由判断,而不是另起炉灶去构造两个分布再算散度?
研究者做了实测验证:这套Cstruct的判断结果,和原来JSD的判断结果,在Llama模型上有94.0%是一致的,在Qwen模型上是88.1%一致。更关键的是,在91.3%(Llama)和98.3%(Qwen)的注意力头里,排名第一的高分位置确实就落在锚点或局部窗口内,这说明"结构位置的质量高低"和"注意力是否集中"这两件事,在这类模型里几乎是同一件事的两种说法。
这就好比你想判断一个仓库今天是不是特别忙,不需要专门派人去数每个货架前的人流,只需要看仓库门口和收银台这两个固定的高频区域挤不挤,因为如果这两个地方不挤,别的地方大概率也不会突然爆满。你省掉了"专门统计一遍全场"这个额外动作,用一个已经在做的常规巡查,顺手把判断结果拿到了。
Cstruct的计算复杂度只和锚点窗口大小有关,跟文本总长度n完全无关,这意味着不管你输入的文档是1万字还是50万字,这一步判断花的时间几乎不变,彻底甩掉了JSD那套额外矩阵乘法和散度计算的开销。
**CRISP的第二招:用噪音基线代替凑数指标,绕开悬崖**
针对第二个更根本的问题,研究者设计了**基于汇聚点感知的阈值**
基于汇聚点感知的阈值(sink-aware thresholding):不再用"凑够多少比例的总量"作为选择标准,而是先算出如果注意力均匀分布在噪音区域,每个位置大概会分到多少注意力(这就是噪音基线),然后只保留分数明显超过这个基线的位置。
具体做法是,先把锚点(第一块)和局部窗口(最后一块)排除在外,剩下的位置按理说应该是"信号"和"噪音"的混合。研究者计算出这些剩余位置如果均匀分布,平均每个位置能拿到多少注意力,这个平均值就是噪音基线μ。然后设定一个位置能不能算作"重要",标准很简单,它的分数要不要超过μ乘以一个系数α,超过就留下,不超过就是噪音,直接扔掉。
论文推荐α取1.0作为默认值,也就是只要超过"平均水平"就算重要,这是一个不需要针对每个任务调参的、有明确物理意义的默认选择。
这个思路好在哪?它不再关心"总共选了多少比例的信号",只关心"这个位置本身值不值得留"。这就像你去挑选一批水果,原来的做法是不管三七二十一,按重量从大到小往筐里装,装够总重量目标就收手,哪怕装进去的最后几个是烂果子。新的做法是先算出这批水果平均一个能有多重,然后只挑那些明显比平均值重的,个头小的、有毛病的果子,压根不进筐。这样不管你是想装一小筐还是一大筐,挑出来的永远是真正饱满的果子,不会因为筐要装满而被迫塞进烂货。
值得一提的是,这套噪音基线的方法只用在"注意力集中"的那类头上,因为只有这类头才有明显的"悬崖"。对于那些注意力本身就比较分散的头,论文通过实测发现它们的分数分布是平缓下降的,没有陡峭的分界线,这种情况下原来的累积阈值方法反而是合适的,所以CRISP在这条路线上保留了原有做法,没有画蛇添足。
**实验结果:不只是更快,还更准**
研究者在两个模型家族(Llama-3.1-8B和Qwen2.5-7B)、三个长文本基准测试集(InfiniteBench、RULER、LongBench)上做了系统对比。
最亮眼的数据出现在检索类任务上。什么叫检索类任务?就是那种"在一堆文字里找一根针"的任务,比如从10万字的文档里精确找出某个密码或者某条特定信息。CRISP在这类任务上的提升非常夸张:
在InfiniteBench的关键词检索任务上,Llama模型的准确率相比FlexPrefill基线提升了17.8个百分点。
在Qwen模型的密码检索任务上,提升幅度高达28.0个百分点。
在LongBench的英文段落检索任务上,两个模型分别提升了12.5和13.5个百分点。
这些提升数字背后,正是"锚点独占式塌陷"问题被解决的直接证据。原来因为注意力大部分堆积在锚点位置,累积阈值方法根本没机会看到后面真正藏着答案的段落,CRISP用噪音基线绕开了这个陷阱,把真正的信号挖了出来。
更让人意外的是,在InfiniteBench整体测试上,CRISP不仅超过了FlexPrefill,甚至超过了**完全不做任何裁剪的稠密注意力**
稠密注意力(dense attention):不做任何稀疏化处理,让模型对文档里的每一个词都完整计算注意力,理论上信息保留最完整,但计算量最大。
CRISP在Llama上是48.7分,稠密注意力是48.6分;Qwen上CRISP是28.7分,稠密注意力只有24.0分。这个结果乍一看反直觉,稀疏化处理怎么能比不做任何裁剪还准?但研究者给出了一个合理的解释:稠密注意力虽然信息完整,但它同样要把那些架构性锚点的噪音囫囵吞下去,混在最终的输出信号里;而CRISP因为主动过滤掉了这些噪音,反而给出了更干净的信号表达。这就像一个人如果同时听十个人说话,哪怕每个人说的话都听全了,注意力也会被无关的杂音稀释,反倒不如提前有人帮你把无关的声音过滤掉,只留下真正重要的发言。
延迟方面,CRISP在512K token这样的超长文本场景下,相比标准的FlashAttention实现了最高5.30倍的速度提升,而且这个加速优势会随着文本变长而持续拉大。论文对比了64K到512K四个长度档位的耗时数据,FlexPrefill的延迟在长文本下会因为噪音积累问题而出现明显的方差爆炸(不同输入延迟差异很大),而CRISP的延迟曲线始终紧凑稳定。这一点也直接印证了论文最核心的理论主张:噪音积累是O(n)量级的问题,CRISP消除了这部分开销,效率优势自然会随着文本长度的增加而越来越明显。
不过论文也很坦诚地指出了CRISP不是万能药。在RULER这个基准测试里,Llama模型上CRISP的表现比FlexPrefill略低了0.4个百分点。研究者分析这是因为RULER里有些聚合类任务需要广泛地覆盖中间地带的信息块,而CRISP的噪音基线在α=1.0的设定下,有时会把这些处于边界地带的信息块误判为噪音而过滤掉。这是一种精度和覆盖度之间真实存在的权衡,论文没有回避这个短板,反而把它写进了正文,这种诚实的态度本身也值得肯定。
**这套方法有边界吗**
论文的"局限性"部分讲得也很坦率。
CRISP的整个逻辑建立在一个前提上:模型确实会把大量注意力堆积在固定的锚点位置。这是当前主流大模型架构的一个经验性特征,不是数学上必然成立的规律。如果未来出现了不产生这种"注意力汇聚"现象的新架构(比如某些采用门控注意力机制的设计),CRISP的这套判断逻辑可能就失效了。研究者也诚实地说,目前学界对"无汇聚点"场景下怎么做稀疏注意力,几乎还没有人研究过。
另外,CRISP延续了FlexPrefill那种非此即彼的路由方式,一个注意力头要么走精细路线,要么走粗放路线,中间没有灰色地带。但现实中肯定存在一些"半集中半分散"的头,被强行归到某一类之后,可能会有一部分该保留的信息被错误丢弃。论文把这个方向也列为未来可以改进的地方。
写在后面
读完这篇论文,最触动我的其实不是那5.3倍的加速比,也不是28个百分点的准确率提升,而是那张展示"悬崖"的图。
研究者没有满足于"我们的方法比别人快"这种粗线条的叙事,而是花了大量篇幅去证明"为什么原来的方法在数学上注定会失败"。这种从现象反推机制,再从机制推导出必然的失效模式的做法,比单纯堆砌实验数字要难得多,也扎实得多。很多论文的套路是先做出效果,再回头找理由,而这篇论文更像是先想清楚了病灶在哪,再对症下药。
还有一个细节值得单独说一说:Cstruct和JSD的判断一致率是94%和88.1%,不是100%。这意味着还有大约一成的注意力头,两种判断方法给出了不同的结论。论文没有回避这个不完美,反而老老实实把这个数字摆出来。一个方法能替代另一个方法,靠的不是完美复刻,而是在几乎不损失效果的前提下,把成本降到几乎为零,这本身就是工程决策里一种很朴素的智慧:不追求绝对正确,追求性价比最优。
这篇论文还留了一个没解决的问题让我一直在想:如果未来的大模型架构真的不再依赖"注意力汇聚点"这种特性了,那所有建立在这个假设上的稀疏化技巧,是不是都要推倒重来?技术的进步有时候不是线性积累,而是某个底层假设突然失效之后,整片建立在它之上的方法论一起崩塌。这大概也是做研究最让人又爱又怕的地方。
Q&A
Q1:CRISP是什么?
A:CRISP是一种让大语言模型在处理超长文本时更快更准的稀疏注意力方法,核心是用结构化的质量指标Cstruct替代原来的JSD路由判断,再用噪音基线阈值替代原来的累积覆盖率阈值,从而避免注意力计算陷入"锚点独占"或"噪音累积"两种失效模式。
Q2:CRISP相比之前的FlexPrefill方法有什么优势?
A:CRISP在检索类任务上准确率最高提升28个百分点,在512K超长文本上速度最高提升5.30倍,而且在InfiniteBench测试上甚至超过了不做任何裁剪的完整注意力计算,同时它的判断步骤更简单,省掉了额外的矩阵运算和散度计算开销。
Q3:什么是注意力的掩码质量悬崖?
A:掩码质量悬崖指的是模型的注意力分数在极少数位置急剧集中(比如开头锚点位置能吃掉90%以上关注度),其余大量位置的分数几乎为零,两者之间几乎没有平缓过渡,导致简单的"累积凑数"选择策略要么漏掉真正重要的信息,要么被迫拉进大量无意义的噪音位置。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.