参数克隆
在这篇文章中,我们讲解模型优化过程中的参数克隆(Clone)环节。当我们在空间中发现某个区域需要更多的高斯点来表达细节时,我们会对其进行克隆。
代码实现的核心逻辑就是,将旧参数保留,并拼接上新复制的参数。
- def clone_gaussians(mask_clone, parameters, optimizer):
- """
- Clone selected Gaussians.
- """
- if not mask_clone.any():
- return parameters, optimizer
- for name, param in parameters.items():
- old_val = param.detach()
- cloned_val = old_val[mask_clone]
- new_val = torch.cat([old_val, cloned_val], dim=0)
- parameters[name] = torch.nn.Parameter(new_val, requires_grad=True)
- # Naive optimizer rebuild
- new_optimizer = makeOptimizer(parameters)
- return parameters, new_optimizer
理论上,我们可以将新克隆出的点沿着位置梯度的方向移动一点点,以免它们和原高斯点完全重合。但在此处,新克隆的高斯点被初始化在与原点完全相同的位置。
为什么可以放在同一位置?因为在接下来的 SGD(随机梯度下降)或 Adam 优化过程中,梯度会自动将这些重合的参数推向正确的发展方向。两种方法最终的效果是殊途同归的。
此处我们简单粗暴地重新创建了一个优化器,这将失去所有的历史记录和积累的所有动量(Momentum)。这会导致训练瞬间变得极其不稳定,我们会在后续进行完善。