参数克隆

在这篇文章中,我们讲解模型优化过程中的参数克隆(Clone)环节。当我们在空间中发现某个区域需要更多的高斯点来表达细节时,我们会对其进行克隆。

代码实现的核心逻辑就是,将旧参数保留,并拼接上新复制的参数。

  1. def clone_gaussians(mask_clone, parameters, optimizer):
  2.     """
  3.     Clone selected Gaussians.
  4.     """
  5.     if not mask_clone.any():
  6.         return parameters, optimizer
  7.  
  8.     for name, param in parameters.items():
  9.         old_val = param.detach()
  10.         cloned_val = old_val[mask_clone]
  11.         new_val = torch.cat([old_val, cloned_val], dim=0)
  12.         parameters[name] = torch.nn.Parameter(new_val, requires_grad=True)
  13.  
  14.     # Naive optimizer rebuild
  15.     new_optimizer = makeOptimizer(parameters)
  16.     return parameters, new_optimizer

理论上,我们可以将新克隆出的点沿着位置梯度的方向移动一点点,以免它们和原高斯点完全重合。但在此处,新克隆的高斯点被初始化在与原点完全相同的位置。

为什么可以放在同一位置?因为在接下来的 SGD(随机梯度下降)或 Adam 优化过程中,梯度会自动将这些重合的参数推向正确的发展方向。两种方法最终的效果是殊途同归的。

此处我们简单粗暴地重新创建了一个优化器,这将失去所有的历史记录和积累的所有动量(Momentum)。这会导致训练瞬间变得极其不稳定,我们会在后续进行完善。