TensoRF将三维辐射场表示为张量分解的形式,通过向量和矩阵因子来近似场景的密度与外观。这种方法大幅降低了内存占用和训练时间,但实际使用时重建质量经常不稳定。核心原因在于分解秩的选择直接影响模型容量,而训练过程中缺乏合适的正则化又会让模型走向过拟合或欠拟合两个极端。

为什么秩选择对TensoRF质量影响如此之大?
TensoRF的核心是将一个稠密的三维张量分解为多个低秩因子的组合。以向量-矩阵(VM)分解为例,它把每个空间维度上的特征表示为向量与矩阵的外积之和,秩R控制着这些外积分量的数量。秩R取1时,模型只能表示非常平滑的低频变化,场景中的边缘、纹理等高频信息几乎全部丢失;而当R设得过大时,模型参数量迅速膨胀,优化空间中出现大量局部极小值,训练容易陷入噪声拟合,产生浮点伪影或空洞。
从信息论角度看,秩本质上决定了模型能够编码的自由度。真实场景的辐射场并非满秩,但其有效秩往往需要通过数据自适应地确定。固定一个全局秩对于复杂场景可能不够,对于简单场景又过于冗余。因此,合理的秩选择需要在欠拟合和过拟合之间找到平衡点。常见的做法是先进行小规模搜索,例如在8到64的范围内以指数步长测试,观察验证集上的PSNR曲线拐点。
下面是一段展示如何在TensoRF配置中调整秩参数的Python代码:
# TensoRF 配置示例,VM分解的秩设定
config = {
"resolution": [300, 300, 300],
"rank_density": 16, # 密度场的秩
"rank_appearance": 48, # 外观场的秩
"decomposition": "vector_matrix",
"feature_dim": 27,
}
# 如果重建结果模糊,可以适当增加rank_density
# 如果出现颗粒噪声,应当降低rank_appearance并加强正则化
实验数据表明,对于常规室内场景,将密度秩从8提升到16时,PSNR通常能提高1.5到2.5dB;但从32提升到64,收益往往不足0.5dB,同时训练时间增加了将近一倍。这说明秩并非越大越好,过高的秩还会让正则化项的作用被稀释。
常用的正则化策略有哪些?如何防止过拟合?
TensoRF过拟合的典型表现是:训练视角下的渲染误差很低,但新视角合成时出现大量高频伪影、颜色溢出或几何不连续。单纯降低学习率或提前停止只能缓解,治标不治本。更有效的方法是在损失函数中加入针对性的正则化项。
第一种是L1正则化,也称Lasso回归。它对分解因子的绝对值求和,鼓励因子稀疏化。在TensoRF中,对密度场的向量和矩阵因子施加L1惩罚,可以抑制不必要的张量分量,相当于自动进行秩剪枝。实践中常将L1权重设为1e-4到1e-3之间,过大会导致密度场过度稀疏,出现镂空。
第二种是全变分(TV)正则化。TV项惩罚相邻体素之间的梯度变化,能够平滑密度场并抑制孤立噪声点。对于外观场,TV正则化可以让颜色变化更加自然,减少色斑。TensoRF官方实现中通常对密度特征施加TV损失,权重约1e-2到1e-1。需要注意的是,TV正则化在边界处会造成轻微模糊,因此需要配合边缘感知的权重或仅在低频训练阶段使用。
以下是在训练循环中加入正则化项的示意代码:
def total_variation_loss(tensor):
# 计算三维张量的全变分损失
diff_x = tensor[1:, :, :] - tensor[:-1, :, :]
diff_y = tensor[:, 1:, :] - tensor[:, :-1, :]
diff_z = tensor[:, :, 1:] - tensor[:, :, :-1]
return diff_x.abs().mean() + diff_y.abs().mean() + diff_z.abs().mean()
# 主训练循环中
loss = mse_loss(rendered, target)
loss += 0.05 * total_variation_loss(density_feature)
loss += 0.0005 * sum(p.abs().sum() for p in density_factor_list)
optimizer.zero_grad()
loss.backward()
optimizer.step()
此外,对于外观场还可以使用平滑正则化,例如对视角方向相关的系数矩阵施加低秩约束,或者使用深度平滑项联合优化。实际调参时建议先固定秩,单独调整正则化权重,通过验证集上的SSIM变化确定最佳组合,再回头微调秩。
实战:结合秩选择与正则化优化TensoRF重建
一个有效的调参流程可以概括为三步:粗搜索秩范围、加入正则化、联合微调。首先在正则化关闭或极小的情况下,训练少量步数(例如总步数的四分之一),快速评估不同秩配置下的渲染质量。选取验证集PSNR最高的两个候选秩,例如16和24。
接着对每个候选秩分别尝试不同的正则化组合。比如密度场使用TV正则化权重0.05,外观场使用L1正则化权重0.0005;或者反过来,密度场使用L1,外观场使用TV。观察新视角合成结果中的伪影是否减少、细节是否保留。这一步可以并行运行,成本可控。
最后进行联合微调。将选定的秩和正则化参数固定,将学习率降低到初始值的十分之一,训练额外的步数让模型收敛到更优解。此时可以在验证集上看到PSNR和SSIM同时提升,且训练损失与验证损失的差距缩小,说明过拟合得到有效控制。
常见的误区是:发现重建质量低就盲目加大秩,而没有同步增加正则化强度。结果模型容量增加后,过拟合反而更严重,训练不稳定甚至出现NaN。正确的做法是:如果低秩时模型欠拟合(表现为模糊、缺细节),先提升秩;如果提升后出现噪声或伪影,再加大正则化。两者是相互配合的关系,不能孤立调整。
另一个细节是,对于动态场景或具有大量半透明物体的场景,密度场的秩需求通常高于静态不透明场景,而外观场的秩需求则相反。因此,在通用配置下最好为密度和外观分别设置不同的秩,而不是使用同一个全局值。