3D高斯泼溅将场景表示为大量具有独立位置、旋转、缩放和不透明度的高斯基元,其中每一项的协方差矩阵直接决定了高斯在空间中的延展形状。一个各向异性的高斯可以沿着平坦表面拉伸成椭圆盘,也可以在边缘处收缩成细长结构,这种灵活性让它在三维重建中比各向同性高斯表达效率更高。但协方差矩阵的优化并非简单的参数更新:矩阵必须始终保持半正定,同时还要能通过可微渲染稳定地传递梯度。如果处理不当,训练过程中会出现针状高斯、数值溢出或重建细节丢失。本文从参数化、投影变换、数值稳定性三个角度解析各向异性协方差的优化方法,并给出可落地的实现代码。

在实际训练中,每个三维高斯的协方差通常不会直接用一个3乘3矩阵表示,而是通过缩放向量和旋转四元数间接构造。这样做既保证了半正定约束,又减少了需要维护的自由度。缩放向量控制高斯在三个正交方向上的长度,旋转四元数则决定这三个方向在世界坐标系中的朝向。优化器更新这两个参数后,再实时构建协方差矩阵用于渲染。接下来我们深入这一过程。
一、协方差矩阵的几何意义与参数化
三维高斯分布的概率密度函数由均值向量和协方差矩阵唯一确定。在3D高斯泼溅中,每个高斯基元的位置相当于均值,协方差矩阵则描述该基元在空间中的扩散形状。对于一个对称半正定的3乘3协方差矩阵,它可以分解为旋转矩阵和缩放矩阵的乘积,即 Sigma = R S S^T R^T。这里的S是对角矩阵,对角元素为三个轴上的标准差;R是正交旋转矩阵,决定局部坐标轴的方向。
如果直接使用9个元素表示协方差矩阵,优化器很容易更新出非半正定的矩阵,导致渲染阶段出现无效高斯。为了解决这一问题,3D高斯泼溅采用缩放向量与四元数的间接表示。缩放向量经过指数激活保证为正,四元数经过归一化保证是单位四元数。通过四元数构造旋转矩阵R,再与对角缩放矩阵相乘,就能得到一个合法的协方差矩阵。这种参数化的另一个好处是参数数量从9个减少到7个,并且几何意义更加直观。
各向异性协方差带来的收益主要体现在表面拟合上。一个理想的平面区域可以用一个在法线方向很薄、在切平面方向很宽的椭圆盘形高斯来表达。相比之下,各向同性高斯只能是球形,如果要覆盖同样面积的平面,就需要在深度方向堆叠大量球体,显存和计算量都会上升。因此,各向异性协方差的优化质量直接决定了场景中平坦区域和边缘细节的还原程度。
二、各向异性协方差的投影与梯度优化
渲染时,三维高斯需要投影到屏幕空间。投影后的二维高斯协方差可以通过局部仿射近似计算。具体来说,先将世界空间协方差变换到相机空间,公式为 Sigma_cam = R_cam Sigma_world R_cam^T,其中 R_cam 是世界到相机旋转矩阵。然后利用透视投影的雅可比矩阵 J,得到屏幕空间协方差 Sigma_2D = (J Sigma_cam J^T) 的左上2乘2子块。这个二维协方差用于光栅化时的高斯权重计算,通常会加上一个像素低通项来避免走样。
各向异性协方差的梯度反向传播链路是:渲染损失对屏幕空间协方差求导,再通过雅可比矩阵传播到相机空间协方差,最后传播到旋转四元数和缩放向量。旋转四元数的梯度计算需要额外注意,因为四元数必须保持在单位球面上。常见的做法是在前向传播中对四元数进行归一化,反向传播时通过归一化后的四元数计算旋转矩阵的梯度,再将梯度投影回切线空间,避免引入沿径向的分量。这种处理可以防止四元数因更新而失效。
从优化行为看,各向异性协方差比各向同性更容易出现梯度分布不均的问题。例如,一个在屏幕空间拉伸很长的椭圆,其长轴方向的梯度可能远大于短轴方向,导致缩放向量的某个分量更新过快。如果不对学习率进行约束,高斯会迅速变成极端的针状或片状,破坏后续渲染。因此,对缩放和旋转分别设置合适的学习率,并在更新后进行范围裁剪,是实际训练中的常见手段。
三、数值稳定性与正则化策略
各向异性协方差优化中最常见的问题是数值不稳定。缩放向量过小时,协方差矩阵接近奇异,投影后的二维协方差行列式趋近于零,导致渲染权重计算出现除零错误;缩放向量过大时,高斯覆盖整个屏幕,梯度爆炸。为了避免这些情况,通常会对缩放向量施加一个合理的上下界,例如将缩放值限制在0.01到100之间,或者使用sigmoid函数将缩放映射到固定区间。这样既能保持不同尺度的高斯表达,又能防止极端值。
除了硬性裁剪,还可以引入正则项来抑制过度的各向异性。一个简单有效的正则化方案是惩罚缩放向量对数值的方差:计算 log(scale) 在三个维度上的方差,并将其乘以一个小系数加入总损失。该正则项鼓励高斯在三个轴上保持相似的缩放程度,避免出现极端细长或扁平的形状。实验表明,轻微的此类正则化可以明显提高训练的稳定性和最终渲染质量,尤其在纹理稀疏的区域。
旋转四元数的更新同样需要稳定性措施。由于四元数存在符号冗余,即 q 和 -q 表示同一个旋转,反向传播时如果直接比较梯度方向可能产生符号跳变。实践中一般不会对四元数自身做强约束,而是依靠Adam优化器的自适应学习率和梯度裁剪来控制更新幅度。另外,在稠密化过程中,分裂或克隆高斯时需要正确继承父高斯的协方差形状,否则新生成的高斯会以不合理的各向异性分布出现,导致局部区域过拟合。
四、实践:在PyTorch中实现各向异性协方差优化
下面给出一个简化版的PyTorch实现,展示如何从缩放和旋转参数构建协方差矩阵,并将其投影到屏幕空间。这里的旋转四元数采用 wxyz 顺序。
import torch
import torch.nn.functional as F
def quaternion_to_rotation_matrix(q):
# q: (N, 4) wxyz
q = F.normalize(q, dim=-1)
w, x, y, z = q.unbind(-1)
R = torch.stack([
torch.stack([1 - 2*(y*y + z*z), 2*(x*y - w*z), 2*(x*z + w*y)], dim=-1),
torch.stack([2*(x*y + w*z), 1 - 2*(x*x + z*z), 2*(y*z - w*x)], dim=-1),
torch.stack([2*(x*z - w*y), 2*(y*z + w*x), 1 - 2*(x*x + y*y)], dim=-1),
], dim=-2)
return R
def build_covariance(scales, rotations):
# scales: (N, 3) 经过指数或软激活保证为正
# rotations: (N, 4) 四元数
R = quaternion_to_rotation_matrix(rotations) # (N,3,3)
S = torch.diag_embed(scales) # (N,3,3)
Sigma = R @ S @ S.transpose(-1, -2) @ R.transpose(-1, -2)
return Sigma
def project_covariance(Sigma_world, R_cam, fx, fy, z):
# Sigma_world: (N,3,3)
# R_cam: (3,3) 相机旋转矩阵
# z: (N,) 每个高斯在相机空间的深度
Sigma_cam = R_cam @ Sigma_world @ R_cam.transpose(-1, -2)
# 构建透视投影雅可比矩阵
J = torch.zeros((Sigma_cam.shape[0], 2, 3), device=Sigma_cam.device)
J[:, 0, 0] = fx / z
J[:, 1, 1] = fy / z
J[:, 0, 2] = -fx * camera_x / (z * z) # camera_x需根据位置计算
J[:, 1, 2] = -fy * camera_y / (z * z)
Sigma_2D = J @ Sigma_cam @ J.transpose(-1, -2)
# 加上像素低通项
Sigma_2D = Sigma_2D + torch.eye(2, device=Sigma_cam.device) * 0.3
return Sigma_2D
这段代码展示了协方差构建的核心逻辑。在实际训练中,相机坐标下的 x 和 y 需要根据每个高斯的位置动态计算,同时还要处理相机内参的归一化。值得注意的是,quaternion_to_rotation_matrix 中的归一化保证了四元数始终位于单位球面,而 build_covariance 通过矩阵乘法自动保证了协方差的对称性与半正定性。
在训练循环里,优化器会同时更新位置、缩放、旋转和不透明度等参数。通常为缩放和旋转设置不同的学习率,例如缩放的学习率设为0.005,旋转的学习率设为0.001,位置的学习率设为0.00016。每次更新后,需要对缩放向量进行裁剪,并将旋转四元数重新归一化。这些细节看似简单,却能显著减少训练后期的崩溃风险,让各向异性高斯保持在合理的形状范围内。
五、常见问题与调试建议
如果渲染结果出现大量细长条纹或亮点,往往意味着某些高斯的缩放向量过大或过小。可以先检查缩放向量的统计分布,观察是否存在远离中位数的极端值。对于这些异常高斯,可以直接将其缩放裁剪到合理区间,或者在损失中加入针对缩放方差的惩罚项。另一个常见问题是旋转四元数在长时间训练后失去归一化,导致协方差矩阵出现轻微的缩放漂移,这种情况下在每次前向传播前强制归一化即可。
当使用自定义渲染器时,要特别注意投影雅可比矩阵的计算精度。透视投影的雅可比依赖于深度 z 的平方,如果 z 接近零或者深度为负,梯度会急剧放大。实践中通常会对深度做一个下限保护,例如将 z 裁剪到大于1e-4。此外,屏幕空间协方差矩阵的行列式如果小于一个阈值,可以在光栅化时跳过该高斯,避免数值溢出。
各向异性协方差优化并不是孤立的模块,它与高斯稠密化策略紧密相关。如果高斯的各向异性程度被过度限制,场景中的薄结构可能需要更多高斯才能表达;如果完全不加限制,又容易出现局部过拟合。一个稳健的流程是:在训练初期允许较强的各向异性以快速捕捉结构,训练中后期逐步增强正则化,让高斯形状趋于稳定。通过调节正则化系数和裁剪范围,可以在重建质量与训练稳定性之间取得良好平衡。