上个月帮朋友排查一个线上模型的异常表现遇到了一个特别反直觉的案例同一个 40 层的模型处理同一个问题把最后 10 层全部替换掉生成结果几乎没有变化可中间某一层稍加点扰动整段回答直接跑题。这个现象不是个例。模型有多少层和模型真正“用到了多少层”根本是两码事——后者就是圈里常说的“有效深度”Effective Depth。最近在某场顶级会议 2025 年的 Workshop 上一支由国内某高校和海外某知名高校联合组成的课题组发布了相关研究系统地测量了模型规模、思维链Chain of ThoughtCoT和任务难度对 LLM 有效深度的影响。看完之后很多之前零散的经验一下子对上了号。这篇文章把研究里的核心结论加上我在类似实验中的观察整理成一份能直接参考的笔记。1. 先想清楚LLM 的“有效深度”到底在测什么1.1 从“层数迷信”说起深层模型不等于深层利用有个老话题一个 30 层模型和一个 60 层模型是不是后者一定“思考得更深”很多人第一反应是看层数。但现实是模型前向传播做了多少层计算并不代表最终结果依赖了这么多层。Transformer 的每一层本质上是在残差流上做增量更新绝大多数层只改写了残差流中很小一部分信息。如果某一层改写的部分与信息流里已有的内容高度冗余那么它对最终输出几乎不贡献独立信息——它在被计算但没有被“使用”。我在实际调试中见过更夸张的情况。同一个问题某开源稠密模型在全量推理时表现稳健可一旦把后半段层的输出全部替换成浅层缓存的残差回答竟然依旧逻辑完整。反过来把中间某两个相邻层的交互路径打断输出立刻崩坏。这说明模型的功能并不是均匀分布在每一层上的大部分关键决策集中在某一段区间里这段区间就是“有效的深度区间”。所以测量有效深度的核心问题变成到底哪一层、哪一个区间真正承担了从“输入特征”到“输出决策”的因果责任这个问题不搞清楚谈层数、谈参数量、谈推理省钱都容易踩空。1.2 三种主流测量思路扰动、探针、因果追踪学术圈目前测有效深度大致有三大类思路各有各的脾气。第一类是中间层扰动法。做法很简单让模型正常前向一次拿到原始输出分布然后逐层对隐藏状态加入噪声或者直接把某一层的输出替换成随机向量再看输出分布偏移了多少。偏移越大说明这一层越“关键”。把所有层的偏移量画成一条曲线就能看出模型真正依赖的深度区间。这个方法直观但也容易误伤——残差流本身有很强的自纠错能力单层扰动有时会被后续层“修复”掉导致某些关键层被漏判。第二类是探针法也叫 logit lens 思路。它不扰动模型而是从每一层的隐藏状态里直接解码出一个词汇分布看看第 L 层“已经想好了什么”。如果第 5 层解码出来的分布和最终答案就很接近说明这个任务在浅层就已经定型如果直到第 30 层才出现正确答案的苗头说明信息是慢慢在深处压出来的。这个方法适合观察趋势但解码头本身是训练在最后一层上的中间层解码出来的分布天然有偏差只能做相对比较。第三类是因果追踪法。它会刻意干预某一步的中间变量比如把某层的激活值替换成另一个样本在相同位置的激活值看输出是否跟着变化。这个方法更适合定位“某个具体事实或关系被存放在哪一层”做细粒度归因很准代价是计算量大不适合大规模快速扫描。研究里通常把这三种方法的结果交叉验证最后定义一个相对稳定的指标。比如把层贡献曲线的峰值位置、累积贡献达到 80% 的层号、以及最后一层之前“冗余区间”的长度综合成一个有效深度分数。1.3 有效深度不是固定值而是条件分布这里要特别强调一个容易犯的错一个模型没有唯一的有效深度。它是跟着输入走的——同一个模型做“11 等于几”这种题可能第 8 层就把答案定死了做一道需要三步代入的数学应用题可能要算到第 30 层才够。有效深度本质上是“模型、任务、提示方式”三者共同作用的结果。所以更准确的说法是有效深度是一个条件分布。给定任务难度、给定模型规模、给定是否使用 CoT你会发现这个分布的中心位置会明显移动。研究里做的工作就是分别控制这三个变量看有效深度如何响应。这也是我把这篇文章当成一张“地图”的原因——它告诉我该往哪个方向调参数而不是给我一个固定的“第几层是关键层”的结论。2. 模型规模参数上去了深层才真正开始干活2.1 不同规模下的层贡献曲线规模越大曲线越右移研究里最直观的一张图是“层贡献曲线随模型规模的变化”。他们用同一批任务、同一套评估流程分别测了参数量差距很大的几组稠密模型。结果非常明确小模型的有效深度集中在较浅区间大模型的有效深度明显向右移动。我举一个接近论文风格的例子数据是示意性的但趋势很稳定模型档位总层数有效深度中位数峰值贡献层位置有效深度占比小档模型124~5第 3 层附近约 40%中档模型3213~16第 12 层附近约 45%大档模型6435~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_tensorspt) base_logits model(**inputs).logits base_dist softmax(base_logits) # 2. 拿到每一层的隐藏状态 hidden_states model(**inputs, output_hidden_statesTrue).hidden_states contributions [] for L in range(1, len(hidden_states) - 1): # 3. 对该层隐藏状态加入同尺度的随机噪声 hidden hidden_states[L].clone() noise random_normal_like(hidden, std0.3) hidden hidden noise # 4. 用扰动后的隐藏状态替换第 L 层输出继续前向 new_logits model.forward_from_hidden(hidden, layerL) 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 层。这个结果挺让人感慨的——原来模型不是每道题都在“全力思考”它比我们想象中更会偷懒也更容易被任务结构左右。以前调模型总习惯性盯着参数量和层数现在我更愿意先问一句这个任务模型到底要用到多深想清楚这个问题后面的优化方向就清楚多了。