大模型变量追踪太短?LoRA微调可解
sina qqZone renren ydCloud 0

拿这样一段代码给大语言模型看:
B = K
D = B
输出是print(D),它基本每次都能给出正确答案apple。这并不意外,变量追踪属于编程语言里最基础的能力。
可要是把代码拉得更长呢?八行、十六行、二十四行?
研究团队拿13个主流预训练模型做了测试,Qwen、Llama、OLMo、Gemma都在名单里,还包括一个292B参数的超大模型DeepSeek-V4-Flash。结果出乎意料:这些模型能稳定追踪的链条长度,中位数仅为2.2行。换句话说,变量传递一旦超过两三行,模型答错的概率就很大。
反直觉的地方在这儿:大家一直认为模型更大、层数更多,推理能力就更强。可实际测试中,层数从32层翻倍到64层,追踪能力只从2.6行变成2.6行,基本没动。292B的DeepSeek-V4-Flash在六行链条上准确率42%,八行38%,已经接近纯猜测的33%。
更让人费解的是,那些专为“循环思考”设计的模型也没躲过去。Ouro-1.4B宣称循环四次相当于加深四倍,实际链条追踪长度依次是0、1.6、2.3、2.2、2.2行,涨势几乎停住。这就像雇了个员工,让他把同一份报告反复检查四遍,结果第二遍之后就开始摸鱼,后两遍基本没干活。
这篇论文讲的故事,就是研究团队找到了“摸鱼”发生在哪个环节,再用一个极小的改动,让模型重新认真起来。
模型为什么会在中途停下来
要弄清问题出在哪,先得看模型处理变量链条时内部究竟发生了什么。
研究者用的手段叫因果追踪:替换模型某一层某个位置的内部状态,看这个替换会怎样影响最终答案,借此定位某段计算发生在网络的哪个部分。
他们发现,Qwen3-8B做这类任务时有一套清晰的三段流程。第一段,每个变量的真实值老老实实待在它被定义的位置,几乎不动,直到第32层(总共36层)附近才交给“查询”环节。第二段是指针解析,离查询最近的那个变量最先被读取,随后一步步往前倒推。第三段,最后几层把解析出的值复制到输出。
毛病就出在第二段。研究者用一个线性探针来测:模型内部的表示,到底能“记住”一条链上多少行的归属信息。
线性探针的做法是训练一个简单的线性分类器,从模型某一层的内部状态里预测某个变量属于哪条链,以此衡量这条信息有没有被显式编码出来。
结果无论换哪种模型,这个叫relay的信息传递过程最多只能稳定延续到第三到第五行,再往后就断了。
relay指的是论文里代码行与行之间传递“自己属于哪条链”这一身份信息的接力过程:每一行从前面的行收集信息,再往后传。
这就像一场接力赛,前三棒跑得挺好,交接也顺,可第四棒的人突然走神,接力棒掉在地上。后面的查询环节面对这个烂摊子,只能自己硬着头皮往前摸索一两步,凑合给个答案。链条短的时候,查询环节摸索这一两步刚好够用;链条一长,它也救不了场。
没有relay机制,模型根本不可能连续答对哪怕两三行,因为变量名之间不存在结构化的传递通道。可它只工作了两三轮就停摆,真正的瓶颈就在这里。
一个65537个参数的开关
研究团队的解决办法简单得有点不可思议:在模型的某一层插入一个rank-8的LoRA模块,其余参数全部原封不动地冻结。
LoRA全称Low-Rank Adaptation,是一种参数高效微调技术。它不动模型里动辄几十亿的原始权重,而是额外插入一个低秩小矩阵,用很少的参数去调整模型行为。rank-8指这个附加矩阵的秩为8,维度很低。
落到Qwen3-8B这个80亿参数的模型上,插入的LoRA只有65537个参数,占比不到0.01%。训练完成后,24行长链条的追踪准确率从15.5%直接跳到99%。
15.5%这个数挺耐人寻味。三选一的任务,瞎猜也有33%,模型却只拿到15.5%,说明它在长链条上几乎是乱答。99%则基本等于全对。一个不到总参数万分之一的补丁,把一项近乎失灵的能力拉到了接近完美。
打个比方,一台用了多年的老收音机,信号老是断断续续,你以为电路板彻底坏了得大修,老师傅却只换了一根小保险丝,机器立马清亮。要是没找准那根保险丝的位置,你可能把整块电路板拆了重装,费时费力还未必管用;位置选错,换了照样沙沙响。
这个类比里,“位置选错也没用”是最要紧的一句。论文后面大篇幅的内容,讲的正是位置。
训练再久一些,这个LoRA还能走更远。喂给它更长的训练链条后,Qwen3-8B在40行链条上能到98%准确率,48行做到88%,整体可靠追踪长度(reach)推到50行。
reach是论文定义的指标:模型能以80%以上准确率追踪的最长链条长度,由相邻测试长度之间线性插值得到。若测到的最长长度全部通过,就记为“下限”,意思是真实能力可能更强。
放到循环模型里,同样的小技巧效果更大。Ouro-1.4B会把同一组24层循环跑四次,加上这个LoRA后,循环四次能追踪60行,循环八次直接给出“至少160行”的下限,因为测到的最长长度它全答对了。
从频率上看幅度:原本循环八次几乎白转,如今循环八次能处理的链条长度约为原来的70倍。
放错位置,等于白做
有一处特别值得展开,因为它推翻了“微调放哪层都差不多”的直觉。
研究者把LoRA放到模型不同层,系统测了一遍,发现一条极其陡峭的分界线。
Qwen3-8B上,LoRA放在第20层,reach是20.5行;挪到第21层,reach直接掉到5.2行。只差一层,效果就断崖式下滑。OLMo-3-7B在12到15层之间、Llama-3.1-8B在13到15层之间,也都有类似的急转折。
原因何在?研究者的解释是,relay这个接力过程本身只在模型中间一小段层范围内推进,出了这个范围,后面的层不再执行“收集并传递链条身份”的操作。LoRA的作用是启动这场接力;如果它被放在relay已经结束的位置,再拼命干活,后面也没有合适的“接力队友”接着传。
好比你想在一条运转中的传送带上加一个分拣工位:装在还在送货物的那一段,工位就能正常分拣;装在传送带已停、货物已卸完的那一段,工位再卖力,面前也没货可分,全是空转。不认真测出传送带究竟哪一段还在动,随手找地方装,很可能白忙一场,还误以为“分拣工位这个思路不行”。
有意思的是,研究者还试着只用冻结模型本身的信息,去预测这条分界线大致在哪。他们定义了一个叫cutoff layer的指标。
cutoff layer:在冻结模型里找出这样一层——某个指针(变量右侧所引用的另一个变量)的信息从源头消失、由后续层接手,这一临界层就是判定的依据。
这像看“体检报告”做预判,不必真训练LoRA逐层试错,只分析模型自身行为模式就能给出大致坐标。研究者提前登记了预测规则,再在四个此前完全没见过的模型上盲测。三个模型的预测落在实际分界线附近,只有OLMo-3-32B偏了五层。
这方法不是万能钥匙,它更像“大概在这附近找”的提示,精确分界线还得靠局部扫描确认。但比瞎猜强多了,好比医生看片子能大致判断骨折在哪一节脊椎,具体到哪一毫米仍要手术中探查,至少不用把整条脊椎都切开看一遍。
拆开relay的内部结构:谁在给谁递话
知道relay存在还不够,团队进一步拆解这场接力赛的内部机制,想弄清到底是谁在传什么信息。
他们测了一种叫注意力距离的东西:每一行的指针,会往前看多少行去找同链的信息。
注意力:Transformer 架构中,每个位置借注意力机制判断该着重“看”输入序列里的哪些位置,由此取得相关信息;注意力距离说的是这种关注能延伸多远。
没有LoRA时,注意力基本只盯着紧邻的父行,也就是定义当前变量的那一行,再往前几乎看不到。加上LoRA后,Qwen3-8B的注意力距离在16到18层能看两行之前,19到22层能看到三行、四行、六行、七行之前,逐层扩大。
更关键的发现是,这些“看得更远”的注意力头并非LoRA新造,而是模型本来就有、平时只看父行的那些头,被重新激活后看得更远了。研究者专门做了消融实验:在Ouro模型里强行关掉这几个被重新激活的“长距离头”,reach从24行左右跌到12行;随机关掉同样数量的其他头,reach基本不受影响。
可见LoRA不是凭空造出新能力,它更像调度员,把模型里本来就有、却没被充分使用的资源重新调动起来。好比一家工厂有几台高性能机床,平时只排去干最简单的粗加工,精密加工的本事一直闲置。来了个新主管,把流程稍作调整,这几台机床立刻被安排做精密加工,产能一下翻了好几倍。要是这几台压根是淘汰设备、没有精密加工能力,再怎么调度也没用——问题不在硬件,而在调度。
研究者另外检验了父行这一环究竟有多要紧。他们硬生生切断了每行对自身父行的注意力,Ouro的relay随之直接停摆,长链条追踪能力归零。可要是切断的是对两行以上更早位置的注意力,冲击就缓和不少,reach由17.8滑到9.4,打了折扣却未彻底崩盘。
这组对照颇能说明问题。父行好比信息传递链条上绕不开的第一环,一断便全盘皆输;更远距离的注意力则更像加速器,缺了它relay照样往前挪,只是速度慢些。
除LoRA之外,还有别的办法能拨动同一个开关。
研究者还设计了一组有意思的对照实验:把LoRA这一具体修改手段换掉,改用其他轻量干预方式,看是不是只要位置放对,效果就大致相当。
他们试了投影LoRA,也就是直接调整注意力和前馈网络中的权重投影;还试了一种名为FLAS的流式激活引导方法。
FLAS是一种借助学习到的“流”来移动隐藏状态的并行干预手段,与LoRA的矩阵加法形式不同,它采用类似微分方程的积分步骤去调整表示。
结果显示,这几种方法只要落在同一个早期层,比如第14层,效果都差不多好,24行链条准确率均在90%以上;可一旦挪到第26层,也就是relay已经收尾的位置,准确率齐刷刷跌回50%多,跟瞎猜差不多。
这个结果挺有说服力。它说明关键不在你选哪种技术手段去改模型,而在你改的是不是那个“relay还能继续往下传”的位置。方法本身次要,位置才起决定作用。
这些发现在MuSiQue这个真实多跳问答数据集上也得到了印证。
MuSiQue是一个要求模型组合多个单跳问题才能作答的多跳问答基准数据集。
在Qwen3-8B上,LoRA放在早期层可带来11.4个百分点的精确匹配率提升,放在晚期层则不足2个百分点,有的模型晚期层干预甚至出现负收益。Llama-3.1-8B的早期层提升达到17.9个百分点,这个数字相当可观,意味着实际问答场景里,原本答对一半的问题,如今能多答对将近五分之一。
写在后面
读完这篇论文,我反复琢磨的一点是:模型“看起来不会”和模型“真的不会”之间,原来隔着这么大一道鸿沟。
一个模型在24行变量链条上只有15.5%的准确率,单看这个数字,很容易下结论说它缺乏长程推理能力,甚至怀疑架构本身有缺陷、需要重新设计。可事实是,这种能力一直都在,只是被埋在某个具体的层里没被激活。65537个参数,不到模型总参数的万分之一,就能把它完全释放出来。
这件事说明了一点:系统被判定“不行”,常常只是因为大家看到的是默认配置下的结果。默认配置为了照顾通用性,往往得做妥协,那未必代表它真正的上限。这个道理恐怕不限于大语言模型。
论文里还有一个细节值得单独拎出来说。研究者发现,如果只在循环模型的第一次循环里加LoRA,后面几次循环完全不改动,居然也能让模型的追踪能力延伸到25行左右。这说明被激活的relay能力一旦启动,后续的原始权重自己就能接着往下传。好比给一直没转起来的齿轮组只轻轻推了第一个齿轮,后面那些本就咬合良好的齿轮立刻自己转动起来。这个发现比“每层都要改”更有想象空间,因为改动的成本可以压得更低。
还有一个没完全解决的问题,论文自己也承认:这套机制目前验证的任务仍是相对人工构造的变量链条和虚构事实问答,真实世界里更复杂、更模糊的推理链条,这个小LoRA的开关是不是也能找到,还是未知数。若答案是肯定的,那这可能是一种成本极低却效果巨大的模型能力挖掘方式;若答案是否定的,则说明人工合成任务里发现的这种relay机制可能只是冰山一角,真实世界的语言理解需要更复杂的接力方式。
这篇论文留给我最大的疑问是:模型里还藏着多少这样的“保险丝”,我们因为从没对症下药,一直以为它们根本不存在?
Q&A
Q1:为什么大语言模型追踪变量链条的能力这么弱?
A:研究显示,模型内部有一种信息接力机制,叫 relay,专门逐行传递“这一行属于哪条链”的身份信息。可这套机制默认只稳定跑两三行就断,后面的查询环节只好自己摸索一两步,链一长就会答错。
Q2:论文里说的rank-8 LoRA具体是怎么起作用的?
A:它是一个插在模型某一层、只有几万个参数的低秩附加模块,其余权重全部冻结。它不创造新能力,而是重新激活模型本身就有、平时却很少用到的长距离注意力头,让relay接力机制能继续往下传,从而大幅提升长链条的追踪准确率。
Q3:这个LoRA放在模型的任何一层都有效吗?
A:不是的。研究发现存在一条非常陡峭的分界线,只差一层,效果就可能从20行的reach跌到5行左右。关键在于LoRA必须放在relay机制还在活跃推进的那段中间层里;一旦放到这个区间之后,后面已经没有合适的层继续传信息,效果会大幅下降。