上个月帮朋友排查一个线上模型的异常表现,遇到了一个特别反直觉的案例:同一个 40 层的模型,处理同一个问题,把最后 10 层全部替换掉,生成结果几乎没有变化;可中间某一层稍加点扰动,整段回答直接跑题。这个现象不是个例。模型有多少层,和模型真正“用到了多少层”,根本是两码事——后者就是圈里常说的“有效深度”(Effective Depth)。最近在某场顶级会议 2025 年的 Workshop 上,一支由国内某高校和海外某知名高校联合组成的课题组发布了相关研究,系统地测量了模型规模、思维链(Chain of Thought,CoT)和任务难度对 LLM 有效深度的影响。看完之后,很多之前零散的经验一下子对上了号。这篇文章把研究里的核心结论,加上我在类似实验中的观察,整理成一份能直接参考的笔记。
1. 先想清楚:LLM 的“有效深度”到底在测什么
1.1 从“层数迷信”说起:深层模型不等于深层利用
有个老话题:一个 30 层模型和一个 60 层模型,是不是后者一定“思考得更深”?很多人第一反应是看层数。但现实是,模型前向传播做了多少层计算,并不代表最终结果依赖了这么多层。Transformer 的每一层本质上是在残差流上做增量更新,绝大多数层只改写了残差流中很小一部分信息。如果某一层改写的部分与信息流里已有的内容高度冗余,那么它对最终输出几乎不贡献独立信息——它在被计算,但没有被“使用”。
我在实际调试中见过更夸张的情况。同一个问题,某开源稠密模型在全量推理时表现稳健,可一旦把后半段层的输出全部替换成浅层缓存的残差,回答竟然依旧逻辑完整。反过来,把中间某两个相邻层的交互路径打断,输出立刻崩坏。这说明模型的功能并不是均匀分布在每一层上的,大部分关键决策集中在某一段区间里,这段区间就是“有效的深度区间”。
所以测量有效深度的核心问题变成:到底哪一层、哪一个区间,真正承担了从“输入特征”到“输出决策”的因果责任?这个问题不搞清楚,谈层数、谈参数量、谈推理省钱,都容易踩空。
1.2 三种主流测量思路:扰动、探针、因果追踪
学术圈目前测有效深度,大致有三大类思路,各有各的脾气。
第一类是中间层扰动法。做法很简单:让模型正常前向一次,拿到原始输出分布;然后逐层对隐藏状态加入噪声,或者直接把某一层的输出替换成随机向量,再看输出分布偏移了多少。偏移越大,说明这一层越“关键”。把所有层的偏移量画成一条曲线,就能看出模型真正依赖的深度区间。这个方法直观,但也容易误伤——残差流本身有很强的自纠错能力,单层扰动有时会被后续层“修复”掉,导致某些关键层被漏判。
第二类是探针法,也叫 logit lens 思路。它不扰动模型,而是从每一层的隐藏状态里直接解码出一个词汇分布,看看第 L 层“已经想好了什么”。如果第 5 层解码出来的分布和最终答案就很接近,说明这个任务在浅层就已经定型;如果直到第 30 层才出现正确答案的苗头,说明信息是慢慢在深处压出来的。这个方法适合观察趋势,但解码头本身是训练在最后一层上的,中间层解码出来的分布天然有偏差,只能做相对比较。
第三类是因果追踪法。它会刻意干预某一步的中间变量,比如把某层的激活值替换成另一个样本在相同位置的激活值,看输出是否跟着变化。这个方法更适合定位“某个具体事实或关系被存放在哪一层”,做细粒度归因很准,代价是计算量大,不适合大规模快速扫描。
研究里通常把这三种方法的结果交叉验证,最后定义一个相对稳定的指标。比如,把层贡献曲线的峰值位置、累积贡献达到 80% 的层号、以及最后一层之前“冗余区间”的长度,综合成一个有效深度分数。
1.3 有效深度不是固定值,而是条件分布
这里要特别强调一个容易犯的错:一个模型没有唯一的有效深度。它是跟着输入走的——同一个模型,做“1+1 等于几”这种题,可能第 8 层就把答案定死了;做一道需要三步代入的数学应用题,可能要算到第 30 层才够。有效深度本质上是“模型、任务、提示方式”三者共同作用的结果。
所以更准确的说法是:有效深度是一个条件分布。给定任务难度、给定模型规模、给定是否使用 CoT,你会发现这个分布的中心位置会明显移动。研究里做的工作,就是分别控制这三个变量,看有效深度如何响应。这也是我把这篇文章当成一张“地图”的原因——它告诉我该往哪个方向调参数,而不是给我一个固定的“第几层是关键层”的结论。
2. 模型规模:参数上去了,深层才真正开始干活
2.1 不同规模下的层贡献曲线:规模越大,曲线越右移
研究里最直观的一张图是“层贡献曲线随模型规模的变化”。他们用同一批任务、同一套评估流程,分别测了参数量差距很大的几组稠密模型。结果非常明确:小模型的有效深度集中在较浅区间,大模型的有效深度明显向右移动。
我举一个接近论文风格的例子,数据是示意性的,但趋势很稳定:
| 模型档位 | 总层数 | 有效深度中位数 | 峰值贡献层位置 | 有效深度占比 |
|---|---|---|---|---|
| 小档模型 | 12 | 4~5 | 第 3 层附近 | 约 40% |
| 中档模型 | 32 | 13~16 | 第 12 层附近 | 约 45% |
| 大档模型 | 64 | 35~42 | 第 30 层附近 | 约 60% |
小档模型总层数只有 12 层,第 4、5 层之后基本就是“惯性前向”,再加多少层也不会让推理能力变强,因为瓶颈不在深度,而在每层能存多少有效知识。大档模型则不同,前 20 层可能都在做特征抽取和事实检索,真正的组合推理发生在 30 层之后。如果你只数总层数,大模型比小模型深一倍;但看有效深度,差距可能接近三倍。
这个结论对评估模型性价比很有用。市面上有些模型总层数堆得很高,但有效深度占比很低,意味着大量参数在“重复表达”浅层已经完成的事情。反过来,有些模型层数不算夸张,但每一层的增量信息都很足,有效深度占比高,实际推理能力反而更强。
2.2 为什么小模型的深层大多是“装饰层”
小模型深层贡献低,不是因为它不想用深层的容量,而是它根本“装不下”让深层有意义的东西。深层网络要做的事情,是把浅层抽取出来的分散特征组合成高阶概念,这需要每一层都有足够宽的表示空间来承载中间结果。参数量有限时,每一层的宽度和注意力头数都被压缩,特征之间的组合很容易在浅层就饱和。
打个比方,浅层像是在做零件分类,把“轮子”“车身”“发动机”分门别类放好;深层要做的是把这些零件组装成一辆能跑的车。组装需要一张足够大的工作台,也就是层间的表示宽度。小模型的工作台太小,零件才摆了几个就没地方了,所以大部分组装动作在半路就停止,剩余深层只是把已经半成品的东西再擦亮一点,不产生新的结构。
这也解释了为什么小模型加层数往往收益甚微。你可以把 12 层加到 40 层,但如果每层的宽度和注意力容量不变,新增的层只是在重复已有的浅层表征,有效深度不会跟着总层数线性增长。我在实验里见过类似情况:一个 1B 左右的模型从 24 层加到 36 层,同任务上的层贡献曲线几乎没动,峰值位置只右移了一两层。
2.3 参数量分配的深宽比:不是越深越好
既然规模影响有效深度,那同样的参数量,到底该分给深度还是宽度?研究给了一个很有意思的角度:在同参数量下,适度加深但不要牺牲单层宽度,是提升有效深度性价比更高的做法;但一旦深到某个阈值,边际收益会快速下降。
原因是深层网络需要“足够宽的浅层”来提供多样化的特征输入。如果为了加层数把每层宽度砍半,浅层特征本身就不够丰富,深层即使有组合能力,也无米下锅。从层贡献曲线上看,宽而浅的模型,有效深度虽然浅,但每一层的贡献都很扎实;深而窄的模型,前面若干层贡献稀疏,有效深度被“空心化”拉高,实际能用的深度并没有增加多少。
所以选模型或设计模型时,我建议多看一个指标:有效深度占比,也就是有效深度除以总层数。这个比值越高,说明参数量用得越值。它比单纯看总层数或参数量更能反映一个模型是不是“深而不空”。
3. 思维链(CoT):把深度思考拆成多步浅思考
3.1 CoT 改变了深度利用的节奏
思维链是这几年推理能力提升绕不开的手段。很多人以为 CoT 只是让模型“多写几步字”,多消耗一点 token,本质上还是同一个前向过程。但层贡献曲线显示,CoT 对有效深度的影响是实打实的——它在改变模型对每一层的利用方式。
不使用 CoT 时,模型相当于被要求一步到位地从输入映射到输出。这个映射如果是简单任务,浅层就解决了;如果是复杂任务,模型会在某一层强行发生一次“跳跃式压缩”,把大量中间推理压缩在一次特征变换里完成。这种压缩很容易出错,而且由于跳跃集中,层贡献曲线会出现一个很尖锐的峰值,峰值前后的大量层都在陪跑。
使用 CoT 之后,模型把一个大跳跃拆成多个小跳跃。每一步只做一件相对简单的事,比如先提取题目里的关键数字,再算一次加法,再比较结果大小。每一步对应层贡献曲线上一个小而清晰的峰,整体来看,有效深度区间被拉长,多个层都承担了实质功能。
3.2 中间步骤是怎么让高层“有东西可算”的
这里有一个容易被忽略的机制。CoT 产生的中间文本不只是“给模型自己看”的装饰,它们会作为新的 token 重新进入每一层的注意力计算,改变后续所有层的输入分布。也就是说,模型每写下一个中间结论,整个残差流就会被注入一份新的、结构化的信息。
这相当于给深层网络提供了一份“半成品清单”。高层不需要再从原始输入里重新推导一切,它可以直接在中间结论之上做下一步运算。原本要在某几层内完成的高密度计算,现在被分散到了更多层里,每一层的负担变轻,但参与度变高。层贡献曲线因此从“少数层尖峰”变成“多个层平缓峰”,有效深度自然上升。
这也是为什么 CoT 对数学题、多跳推理格外有效——这些任务天然可以被拆成多个串行子步骤。相反,如果任务本身是单步的,比如直接抽取某个实体名,CoT 反而不会带来深度利用上的好处,中间步骤只会增加 token 开销。
3.3 一个容易被忽略的副作用:Token 开销与深度收益的曲线
CoT 不是越长越好。研究里有一条很有意思的曲线:随着 CoT 长度增加,有效深度先快速上升,然后进入平台期,再往后甚至会出现轻微下降。
我自己的解释是,过长的 CoT 会让模型在上下文中“迷失”。每一步生成的中间结果都会参与后续所有层的注意力计算,当中间步骤太多时,浅层需要处理的上下文变长,注意力会被分散到大量历史 token 上,反而削弱了对当前关键信息的聚焦。层贡献曲线会表现为前段稀疏、中段混乱、后段又重新集中,整体有效深度不增反降。
实操中我通常的做法是:先给模型一个简短的引导,让它“分两步思考”,观察输出质量;如果第一次结果不稳定,再逐步增加中间步骤的提示。不要一上来就写“请非常详细地逐步思考”,那样既费 token,又可能在有效深度已经饱和之后引入额外噪声。最合适的 CoT 长度,大概率落在有效深度平台期的左端,而不是右端。
4. 任务难度:真正决定“要不要用到深处”的是问题本身
4.1 怎么把任务难度量化
模型规模、CoT 都是我们可以控制的变量,但任务难度是输入侧的性质。要研究它对有效深度的影响,首先得把难度量化。论文里用了很务实的做法:不是靠人拍脑袋分简单困难,而是用模型在“无 CoT、标准提示”下的表现来定难度。
具体来说,他们把一批任务按正确率分成三档:正确率 80% 以上的算简单任务;50% 到 80% 的算中等;50% 以下的算困难。这个划分的好处是它天然反映了模型对任务的真实掌握程度,而不是任务在人类眼中的难度。同一个模型觉得简单的题,换一个模型可能就变成困难题,所以难度本质上是一个“相对量”。
如果不想做大规模评估,也可以更轻量地定义难度:用模型浅层输出的置信度,或者用多次采样输出的一致性来衡量。输出一致性越低,任务对当前模型越难。这个做法在线上系统里很好落地,因为不需要额外标注,只要跑几次采样就能算出来。
4.2 测试结果:简单题浅层就够,难题才逼出深层能力
用难度分档之后,有效深度随任务难度的变化非常规律。对简单任务,模型甚至不需要走完全部层;深层输出的贡献曲线几乎是一条水平线,说明答案在浅层已经定型,后面的层只是在重复确认。对中等任务,峰值贡献出现在模型中间偏后的层段,且曲线比较宽。对困难任务,有效深度明显加深,峰值位置也整体后移。
这背后其实是在说:任务难度决定了模型需要多少“组合步骤”。简单任务只需要查表或模式匹配,浅层特征足够;困难任务要求模型把多个事实、多个运算步骤组合在一起,这种组合发生在更高的抽象层级,自然需要动用到更深的层。
表格可以看得更清楚:
| 任务难度 | 典型例子 | 有效深度位置 | 深层是否参与 |
|---|---|---|---|
| 简单 | 常见事实问答、近义词判断 | 浅层为主 | 基本不参与 |
| 中等 | 单步推理、带限制的抽取 | 中后半段 | 部分参与 |
| 困难 | 多步数学、多跳推理、矛盾检测 | 接近全模型深度 | 深度参与 |
我印象最深的是“矛盾检测”这类任务。两句话表面都通顺,但内含逻辑冲突,模型需要把第一句里的条件记住,再在第二句里做比对。这种任务即使模型规模很大,有效深度也会接近模型总层数的上限。一旦你发现某个困难任务的有效深度已经逼近总层数,那就说明模型是真的在“用尽全力”,此时再堆 CoT 未必有用,考虑换更大规模模型更实际。
4.3 难度、规模、CoT 三者的交互效应
三个变量不是独立起作用的,交互效应甚至比主效应更有价值。
规模与难度的交互:大模型的有效深度优势,主要体现在困难任务上。简单任务上大模型和小模型的有效深度差距并不大,因为任务根本不需要那么多层。换句话说,大模型在简单题上的深层利用率很低,是一种“计算资源闲置”。这也是为什么很多线上系统做简单问题路由,把容易的请求交给小模型处理,效果损失很小。
CoT 与难度的交互:CoT 对简单任务几乎没有增强有效深度的作用,对中等任务提升明显,对困难任务提升最显著,但前提是模型本身规模够大。如果模型很小,CoT 写得再详细,有效深度也上不去,因为浅层根本没有足够的组合能力来利用那些中间步骤。CoT 就像给工人发了更详细的图纸,但工人本身技能不够,图纸再细也做不出活。
规模与 CoT 的交互:CoT 带来的深度增益,在大模型上更容易被放大。小模型用 CoT,有效深度可能只上升两三层;大模型用 CoT,有效深度可能增加十层以上。所以如果你手上是个小模型,与其在提示词上费劲,不如先考虑换一个更大规模的底座;如果你已经用上了大模型,那么 CoT 的收益会非常可观。
5. 这些结论落到工程上,能怎么用
5.1 推理侧:按难度动态提前退出,省钱省时
有效深度最大的工程价值,是给“动态推理”提供了理论依据。如果某个输入只用到前 15 层的计算,那后面的 25 层完全可以跳过。行业内已有不少提前退出方案,但难点一直在于:在进入模型之前,怎么知道这个任务需要多深?
结合这里的结论,你可以不依赖“任务类型”这种粗粒度预估,而是用模型自身的信号来判断。常见做法是每经过若干层,对当前隐藏状态解码出一个临时输出分布,如果这个分布在连续几层之间几乎不再变化,就可以判定有效深度已到边界,提前终止前向过程。
我建议的最小实现是三层检查:第 8 层、第 16 层、第 24 层各做一次置信度判断。如果第 8 层输出分布与最终结果的 KL 散度已经很小,直接短路;否则继续向下。实测下来,简单请求能省掉一半以上的层计算,而对困难请求几乎没有质量损失。
5.2 训练侧:用有效深度指导层数裁剪与蒸馏
有效深度可以作为层剪枝和蒸馏的指导信号。传统做法是把教师模型的全部层都作为蒸馏目标;但如果测量结果显示某一层之后基本在做冗余确认,那蒸馏时只需要保留到有效深度边界即可。
我实际试过一种策略:先对教师模型做层贡献分析,找到有效深度边界 K,然后把学生模型的总层数设置成接近 K 的值,只蒸馏前 K 层的输出。结果学生模型在保留大部分能力的同时,推理速度明显提升。这说明很多深层参数在蒸馏过程中本来就是“陪练”,砍掉它们对核心能力伤害不大。
当然,剪层之后要做一段短期的继续训练来修复残差流分布,不要直接部署。剪完层就上线,通常会在长尾输入上露出问题,因为有效深度本身是条件分布,某些困难样本还是会用到被剪掉的层。保险的做法是保留一个比有效深度中位数稍大的层数,把最深的几层作为冗余保险。
5.3 提示词与 CoT 长度:不是越深越好,而是要匹配
日常使用里最直接的收获,是让我重新审视了提示词里的“详细思考步数”。以前我倾向于把 CoT 写得很长,总觉得多写几步总比少写好。看了有效深度曲线以后,我开始按任务难度调节 CoT 长度。
简单任务不需要任何思维链,直接给答案,有效深度本来就很浅,加 CoT 只会徒增 token 和延迟。中等任务给一个“两步引导”就足够,比如先让模型列出已知条件,再给出结论。困难任务才需要较长的 CoT,但也要控制在有效深度平台期以内,当发现增加 CoT 长度不再改善输出质量时,立刻收手。
我个人的经验值是:中等任务两步到四步,困难任务五步到八步,超过八步的详细推理链,在大多数开源稠密模型上带来的收益都很微弱。如果你发现某个任务在八步以上还在稳定提升,那多半不是 CoT 的功劳,而是任务本身还需要更多外部工具或检索支持。
5.4 一个可复现的自测小实验
如果想亲自验证自己所用模型的有效深度,这里有一个不依赖复杂框架的伪代码思路。它不追求学术级精确,但能很快看出模型在某个任务上的深度利用情况。
# 伪代码:扰动法测量层贡献 def measure_layer_importance(model, tokenizer, text): # 1. 正常前向,拿到基准输出分布 inputs = tokenizer(text, return_tensors="pt") base_logits = model(**inputs).logits base_dist = softmax(base_logits) # 2. 拿到每一层的隐藏状态 hidden_states = model(**inputs, output_hidden_states=True).hidden_states contributions = [] for L in range(1, len(hidden_states) - 1): # 3. 对该层隐藏状态加入同尺度的随机噪声 hidden = hidden_states[L].clone() noise = random_normal_like(hidden, std=0.3) hidden = hidden + noise # 4. 用扰动后的隐藏状态替换第 L 层输出,继续前向 new_logits = model.forward_from_hidden(hidden, layer=L) new_dist = softmax(new_logits) # 5. 记录输出分布的偏移量 contributions.append(kl_divergence(base_dist, new_dist)) # 6. 有效深度边界:贡献值首次降到峰值一半以下的位置 peak = max(contributions) boundary = first_index(contributions < peak * 0.5) return boundary跑这个实验时有几个坑。第一,噪声标准差要按模型规模调整,大模型残差流方差大,0.3 可能不够,要加大到 1.0 左右;第二,扰动隐藏状态之后必须从那一层继续前向,而不是把整个模型重新跑一遍,否则扰动会被后续层自然修复;第三,最好多跑几条样本做平均,单条样本的层贡献曲线会很抖。
另外要提醒的是,中文任务和英文任务的有效深度分布可能有差异,因为分词和表征压缩程度不同。如果你主要做中文场景,建议用中文数据重新测一遍,不要直接套英文论文的结论。
在写这篇笔记的间隙,我又顺手跑了一次自己常用的那个 40 层模型。简单问答的有效深度大概在第 11 层就封顶了,而一个四步数学推理题,有效深度一路顶到了第 33 层。这个结果挺让人感慨的——原来模型不是每道题都在“全力思考”,它比我们想象中更会偷懒,也更容易被任务结构左右。以前调模型总习惯性盯着参数量和层数,现在我更愿意先问一句:这个任务,模型到底要用到多深?想清楚这个问题,后面的优化方向就清楚多了。