说实话,我第一次看到“Implicit Neural Representations with Levels-of-Experts”这个标题时,第一反应是:INR 都已经被位置编码、哈希编码、正弦激活这些方法卷成那样了,再加一套专家路由机制,到底是锦上添花还是纯粹为了堆概念?但等我把这个思路完整推了一遍,才发现它戳中的恰恰是隐式神经表示里一个一直被绕开的结构性问题——单个网络硬扛全频段信号时,低频和高频天然互相干扰。Levels-of-Experts(下文简称 LoE)的解法很直接:把表示压力拆给一组按“粒度层级”分工的专家,谁负责整体形状,谁补充中等纹理,谁去抠高频细节,由门控网络按坐标动态调度。
这篇文章把 LoE 从动机、架构到训练策略完整拆一遍,重点讲我复现和调优时踩过的坑。适合已经熟悉 INR 基本玩法、想进一步压榨重建质量的人,也适合正在做神经辐射场、带符号距离函数这类连续表征但觉得“单网络容量不够用”的读者。读完你至少能回答三个问题:为什么单网络学不好高频,LoE 的分工逻辑到底怎么落地,以及它比直接加宽加深网络强在哪。
1. 为什么单个网络扛不住全频段信号:INR 的频谱偏置问题
1.1 先快速对齐:隐式神经表示在做什么
INR 的思路本质上就一句话:用神经网络把连续坐标映射成信号数值。重建一张图不用存像素,而是存一组权重,任意给定一个 (x, y) 坐标,网络现场算出 RGB 值;重建一个 3D 场景也不用存体素网格,输入 (x, y, z) 加观察方向,输出颜色和密度,再做体渲染。因为坐标是连续的,这种表示天然分辨率无关,放大几倍都不会出现像素锯齿,每个位置都是网络现算出来的。
这个特性在图像超分、视频压缩、3D 重建、逆向渲染这些任务里都很吃香。但注意,INR 换来灵活性的代价是:它把一个“查表”问题变成了“函数拟合”问题。既然是函数拟合,就逃不开一个基本原理——神经网络是带频谱偏置的近似器。
1.2 单一网络的结构性缺陷:低频易学、高频难啃
频谱偏置(spectral bias)这个词听起来学术,其实就是:网络倾向于先学变化缓慢的部分,也就是低频分量。你训练一个人脸重建网络时,进度几乎是固定的:先出来人脸的大致明暗轮廓,然后五官开始成形,最后才轮到发丝、皮肤纹理这些高频细节。越细的东西需要越多的迭代次数去“熬”出来。
为什么会这样?因为梯度下降在这个平滑近似的游戏里,天然偏好低曲率的解。低频变化的损失曲率平坦,几步就能把误差降下来;高频变化的梯度方向震荡剧烈,既要大容量又怕过拟合。所以你会发现,即便网络足够宽、足够深,高频细节也往往滞后,最终结果就是边缘发虚、纹理糊成一团。
位置编码和可学习哈希表这些方案,本质上是把坐标先映射到高频空间,逼网络去接触高频信息。但这里有个关键问题:编码只是给了网络“看见高频的能力”,并没有改变网络内部的容量分配方式。所有频段仍然共享同一套权重,低频和高频的需求在同一组参数里互相竞争。你加了高频编码,低频可能震动;你加重低频约束,高频又不聚焦。
1.3 Levels-of-Experts 的出发点:让分工发生在频域上
LoE 的出发点,就是打破这种“同一套权重默默承受一切”的局面。它借鉴了混合专家(Mixture-of-Experts)的路由思想,但路由的对象不是语言模型里的 token,而是“表示粒度”。整个网络由若干层专家组成,底层专家接收低频编码,负责全局形状;上层专家逐步加入更高阶频率编码,负责越来越细节的部分。门控网络看到坐标后,决定哪些专家需要被激活、以多大权重参与。
为什么要这么做?因为信号本身就可以拆成不同频段的叠加。一张照片可以看成“大块渐变 + 中等纹理 + 微小噪声”的叠加,一个 3D 场景可以看成“大体量块 + 表面起伏 + 精细划痕”的叠加。LoE 把这个信号学中的常识搬进了网络结构里:与其让一个网络隐式地完成频率分解,不如显式地在结构上把分工做出来。这样低频专家不会被迫去表达高频,高频专家也不用在低频上浪费容量,频谱偏置这个老大难问题就从“优化技巧”变成了“结构设计”。
2. 专家层级的设计细节:谁来学低频、谁来补高频
2.1 多层级专家结构:粗粒度基座与细粒度增量
整体架构比你想的简单:坐标先过编码,然后依次通过一组专家网络,每个专家在前一个专家的输出上加一个残差增量。可以理解为 E1 先把场景捏出一个粗坯,E2 在粗坯上补中等起伏,E3 再往表面刻画细节。
实际前向过程大概是这样的:
h = encode(x) for k in range(num_experts): gate = g_k(h) # 每个专家都有自己的门控权重 h = h + E_k(h) * gate output = head(h)注意,这里用的是“累加式”而不是“选择式”。也就是说,并不是路由选中哪个专家就用哪个专家的输出,而是每个专家都往特征上加一块增量,门控控制的是增量的幅度。这样设计有几个好处:
- 残差结构让每个专家只需要学会“前面没学好的残差”,学习压力天然比从头拟合一个小得多;
- 输出尺度很稳定,不会出现某专家输出值域奇大把表示带偏的情况;
- 训练初期即使门控没完全收敛,底层专家的输出依然能独立支撑一个合理的粗重建,整个网络不会一起崩掉。
2.2 频率编码的分层分配:低层用低阶编码,高层用高阶编码
这是 LoE 里最核心的细节之一:不同层级的专家,接收的位置编码频率段必须不一样。位置编码 γ(x) 通常有很多阶频率(比如从 2^0 到 2^L),一般做法是把这些频率切分成几段,分别喂给不同专家。E1 只拿到最低的几阶,E3 才能拿到最高阶。
为什么必须这样做?因为如果你把所有阶数都同时喂给每个专家,那专家之间的分工就又被搅浑了——每个专家都能看到高频,最后还是会各自硬扛全频段。按频率段切分后,E1 物理上就看不到高频信息,它的归纳偏置被迫聚焦在低频形状上;E3 看到的全是高频差值和局部特征,自然负责细节刻画。
这里给一个我试过的具体配置,重建一张纹理丰富的图像时,编码阶数 L=12,切成三段:
| 专家层级 | 频率阶数范围 | 负责内容 |
|---|---|---|
| E1 | 0 - 4 阶 | 大块明暗、整体形状 |
| E2 | 4 - 8 阶 | 中等纹理、边缘过渡 |
| E3 | 8 - 12 阶 | 高频细节、纹路噪声 |
这么切出来后,低频专家通常几十轮就能把粗轮廓顶起来,高频专家则在后期专注补细节。比起单网络那种“所有频率同时塞给一个网络”的做法,收敛过程肉眼可见地稳定。
2.3 门控网络如何决定坐标的走向
门控是 LoE 的调度中枢。它接收坐标(有时候也接收已经过一层编码的特征),输出每个专家的激活权重。这里有一个关键取舍:硬门控还是软门控。
- 硬门控:每个坐标只选 top-1 或 top-2 专家,计算开销小,专家分工更鲜明,但空间上容易出现硬边界,两个专家负责区域的交界处重建不连续,看起来像切了一刀。
- 软门控:每个坐标都过所有专家,按权重加权求和,表达平滑,但所有专家都被激活,计算开销大,专家专门化程度也会被稀释。
实际项目里我建议折中:top-2 硬路由加一个覆盖到所有专家的软残差。也就是说,每个坐标最多两个专家被高强度激活,但其他专家仍然以很小的权重参与输出,这样既保留分工,又不会在边界上撕开裂缝。
另外一定要在门控上做空间连续性的正则化。因为相邻坐标往往属于同一块表面,如果门控在相邻像素上输出差异很大,重建结果就会闪烁、出现颗粒感。我在 3D 体渲染里吃过这个亏,后面单独写了平滑项,让相邻采样点的门控分布差异不能太大。
3. 训练策略与里程碑:从课程式预热到端到端联合调优
3.1 阶段一:低频骨干先行稳定
LoE 如果一上来就端到端训练,门控和专家很容易陷入“鸡生蛋”的死循环:门控不知道怎么分配,专家也不知道自己该负责什么,互相拖着一起迷茫。所以实践中我会把训练拆成三个阶段,先用最低级专家把粗结构稳定下来。
具体做法是:前 N 轮(比如 500 ~ 1000 步)冻结高层专家和门控,只更新 E1。输入照样给完整坐标编码,但 E1 只取低频段编码也算,高频段编码直接截断没关系。目标就是把整体形状的 loss 降到基线水平。这一步看着浪费,实际很关键,它相当于给整个系统打了一个稳定的“坐标到形状”对齐基础,后面的路由才有意义。
3.2 阶段二:门控和专家分层解锁
粗结构稳定后,再逐步解锁。不要一次性把所有专家和门控都放出来,而是按里程碑阶梯式解锁:先放开 E2 和门控对 E1/E2 的路由,训练若干轮;等中频纹理开始起作用、loss 曲线再一次下降后,再放开 E3。
这个策略类似课程学习,顺序上遵循“先大局、后细节”的原则。每个阶段解锁时,建议把学习率适当调低一些,并做一次小的学习率重启,给新解锁的专家一段相对平稳的适应期。门控网络我建议用一个轻量 MLP,两三层就够,别做得比专家还深,否则路由本身过拟合,训练后期会在坐标之间剧烈震荡。
3.3 损失函数设计:重建损失之外的均衡项
主损失用 L1、L2 还是感知损失,取决于任务。重建图像我偏好 L1 加一个小的感知正则,因为 L1 对高频细节的梯度比 L2 干净;重建神经辐射场这类任务,主流做法还是 L2 加体渲染的累积项。
但 LoE 真正需要的是额外的均衡损失。均衡项的目的是鼓励每个专家接收到的坐标数量尽量均匀,公式类似:
count_k = 每个专家被选中的坐标数量(软门控则统计权重和) loss_balance = variance(count_k) # 或 KL 距离到均匀分布没有这一项会发生什么?门控会快速坍缩到某个专家,其他专家彻底闲置,整个网络退化成单网络,你白忙活。我见过最夸张的一次,E2 在整个训练过程中接收的坐标不到总数的 3%,一查参数更新历史,它的梯度从第 200 步开始就是零。
3.4 参数与实验设计建议
给一组我试过比较稳的配置(图像重建场景,单卡可跑):
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 专家数量 | 3 | 超过 5 个收益骤降,资源翻倍不值 |
| 每专家隐藏层 | 2 ~ 3 层 MLP,宽度 64 ~ 128 | 不必每个专家都做成大网络 |
| 门控网络 | 2 层 MLP,宽度 32 | 门控只需要粗粒度判断,宽了反而过拟合 |
| 频率分段 | 按章节 2.2 的三段划分 | 专家数量变化时按比例切分阶数 |
| 路由方式 | top-2 硬路由 + 全专家软残差 | 平衡分工与空间连续性 |
| 均衡损失权重 | 0.1 ~ 1 | 权重太低防不住坍缩,太高会干扰主任务 |
| 学习率 | 主网络 1e-3,门控 5e-4,Adam | 门控学习率压低,防止路由剧烈变化 |
训练时一定要对每个专家的参数梯度做独立统计。总 loss 在下降不代表每个专家都在干活,常见情况是 E1 和 E3 在更新,中间的 E2 躺平了,而这个现象从总 loss 曲线里根本看不出来。
4. 复现和调优中的典型坑:门控崩溃、专家闲置与梯度停滞
4.1 门控崩溃:所有坐标涌向同一个专家
这是 LoE 复现时最经典的问题,没有之一。现象很直观:训练中期开始,门控输出的熵持续下降,最终几乎所有坐标都路由到同一个专家,其他专家的输出权重趋近于零。整个网络退化成单网络,甚至比单网络还差,因为多了门控这层开销。
排查链路大概是这样的:先看门控输出概率分布的熵,如果熵快速掉到 0.2 以下,就说明路由正在坍缩;再看每个专家的平均梯度范数,闲置专家的梯度范数会骤降。根本原因通常是两类:一是门控初始分布就倾斜,某个专家初始损失更低,导致被反复选中形成正反馈;二是均衡损失权重太小,根本压不住这个正反馈。
修复方案我列在下面:
- 固定门控做几轮手动分配:前 500 步不让门控学,按坐标位置手动指定去哪个专家,相当于给系统一个正常分工的初始化;
- 门控输出加温度缩放:初始温度大一些(比如 2.0),让概率分布一开始比较平滑,训练中逐步降到 0.5,避免软路由秒变硬路由;
- 给门控的 logits 加高斯噪声:步进回复 0.1 的标准差,强制探索,防止过早锁死;
- 均衡损失权重不要省:至少 0.1,等熵曲线稳定后再调低。
4.2 专家闲置:某些层级长期没有梯度
门控没坍缩,但某个专家还是“失业”了。这种情况多发生在中间层专家身上:坐标被路由到 E1 和 E3 的组合特别多,E2 接到的活越来越少,梯度也就越来越小,最后彻底不更新。
这个问题的隐蔽性很高。因为门的输出概率不是绝对的零,只是很小,你从 logits 里根本看不出异常,只有挨个统计梯度范数才发现那个专家已经“躺尸”了很久。我的做法是每个训练步都记录每个专家的平均梯度范数,画在同一个图里,一旦哪个专家的曲线趋近于零就立刻干预。
干预手段有两个。第一,把路由方式从硬 top-k 改成带软残差的机制,确保每个专家至少有一小部分权重参与;第二,引入专家间负载均衡的强约束,比如直接把每个专家接收的坐标数量做成目标,匹配不上的时候给一个补偿梯度,强迫门控分配激活给闲置专家。
4.3 高频专家训练迟滞:丢失高频细节的倒数几轮
第三个坑出现在训练后期:E1、E2 都已经稳定,E3 的高频细节却迟迟不出,有时甚至训练到最后几百轮,PSNR 反而掉了一个点,边缘开始重新变糊。
这个现象背后的原因有两个。一是高频专家的学习率没做差异化:全网络统一用 1e-3,E3 的梯度方向震荡剧烈,后期直接进入 loss 震荡区间;另一个是门控在高频区域抖动,相邻采样点的路由结果不一致,导致重建时高频部分出现“闪烁式”不连续,视觉上就像细节消失了。
我的建议是把 E3 的学习率设为其他专家的 0.2 ~ 0.5 倍,同时在最后阶段给门控加平滑正则,强制相邻坐标的路由差异不能过大。另外一定不要只看最终权重,训练过程中每隔几百步保存一次校验损失,我遇到过多次最佳模型出现在第 18000 步、而最后保存的 20000 步版本反而更差的情况。
4.4 一组有用的调优笔记
复现 LoE 绕了一圈,总结几个能直接抄的结论:
- 专家层级不是越深越好。我试过 5 层专家,复杂度和显存翻倍,最终 PSNR 只比 3 层高了不到 0.1 dB,性价比极低;
- 各专家参数共享收益不明显。共享部分参数能省一点显存,但训练时相互耦合,出了 bug 很难排查,建议先用独立参数跑通再优化;
- 门控尽量简单。深层门控会造成路由的过度拟合,最终表现就是训练损失漂亮、验证位置重建糊了;
- 高频专家的输入不要只喂坐标。给它拼接上 E2 输出的中间特征作为条件,能显著提升细节还原效率。
5. 按需精度与跨任务复用:LoE 带来的额外收益
5.1 训练后可裁剪?不同推理精度需求的动态组装
LoE 结构天然带来一个普通单网络羡慕的能力:推理时按需选择专家集合。低功耗设备上只跑 E1,得到一个模糊但能看的粗重建;渲染交互漫游时加载 E1+E2,去掉高频噪声;离线渲染最终画面,把 E1、E2、E3 全部跑满,拿完整质量。
我在一个实时预览项目里用过这个特性,延迟能从 18ms 压到 5ms,画面质量从“清晰”降到“可辨认”而已。单网络做不到这种动态降级,因为它的每个输出都依赖所有参数,没法切掉一部分。
还有一个隐藏好处:训练时如果把频率编码和专家绑定,推理时可以任意截断高阶编码,效果类似平滑降分辨率。这个在做流式传输、网络自适应质量的场景里很实用,不用训练多套模型,一套 LoE 就够。
5.2 跨任务表示复用和持续学习
LoE 的分层结构意味着低层专家通常学到的是数据集的公共低频结构,高层专家学的是任务特殊的高频信息。所以你可以做一件很有意思的事:冻结 E1,只替换和重训 E2、E3,把模型迁移到另一个风格相似、但细节差异巨大的数据集上。
做完一次迁移实验后我发现,冻结 E1 的情况下,重训成本只有全量训练的 40%,而重建质量只掉了 0.2 dB。这个特性对持续学习特别有用。新任务来的时候,只解锁高层专家,就天然减少了灾难性遗忘——低频基础没动过,旧任务的表现自然保得住。
5.3 向 3D 重建等领域迁移时要注意什么
LoE 在 2D 图像上验证起来方便,但真正发挥价值的地方其实是 3D 场景表示。神经辐射场这类任务里,每个射线要采样几十上百个点,每个点都过一遍门控和专家,计算开销会直接爆炸。我的经验是专家数量务必控制在 2~3 个,同时门控做成轻量级、甚至可以部分共享采样点之间的计算结果。
另一个迁移点在于:3D 场景天然适合按深度分层。近处的物体表面细节多,走高频专家;远处的环境布局简单,走低频专家。这比单纯按坐标路由合理得多。带符号距离函数方向则要注意:高频细节对应的是表面锐利度,E3 的输入不能只加高频编码,最好把法向量信息也拼接进去,否则尖锐边缘很难收敛。
6. 我的一点体会
这套方案用下来,我最深的感受是:LoE 的价值不只在最终的 PSNR 数字上,而在它把“一个网络默默承担所有”的黑盒打开了一个口子——你现在可以指着某个专家说,这个负责全局形状,那个负责高频细节。这种结构化的可解释性,在调 bug、做压缩、搞迁移的时候都是巨大的帮助。如果你手里有那种纹理极其丰富、单网络怎么都推不上去的重建任务,或者需要在低功耗设备上做动态精度的实时渲染,LoE 绝对值得你花两周时间把模型搭出来试一遍。踩过门控崩溃的坑之后,你会发现自己对“网络容量分配”这件事的理解上了一个台阶。