在三维视觉任务中,无论是基于点云的PointNet++、体素化的VoxNet,还是面向新视角合成的NeRF,微调预训练模型已经是一种常见做法。但一个普遍的问题是:训练集上的损失可以降到很低,验证集甚至测试集上的指标却明显下降。模型似乎记住了训练样本的特定几何形态,而不是学到可迁移的三维表示。要理解这一现象,需要从微调过程中的参数偏移和正则化失效说起。

一、微调3D模型为什么会快速过拟合
预训练权重中编码了大量通用几何先验,例如点云局部邻域结构、体素空间中的尺度不变性以及隐式场的密度分布。微调时,新任务的数据量通常只有几百到几千个样本,而模型参数可能达到百万甚至千万级。全参数更新会让模型容量远超样本信息量,训练过程很容易拟合到标签噪声或个别物体的形状细节。
从权重范数角度看,微调后各层权重范数通常会显著变大,尤其是靠近输出端的新增任务头。权重范数增大意味着决策边界更加复杂,对训练样本的空间结构产生记忆性编码。打印微调前后的各层L2范数可以发现,骨干网络层的变化相对较小,而分类头或回归头的范数可能增长数倍。这就是为什么需要对不同层设置不同正则化强度,而不是全局一刀切。
Dropout在3D模型中也面临特殊挑战。标准Dropout在二维图像中随机丢弃神经元,但在点云模型中,如果对每个点的特征独立丢弃,会破坏局部邻域的几何连续性。体素特征图具有空间相关性,直接套用二维Dropout相当于随机擦除局部空间块,可能导致三维结构信息断裂。因此,需要选择适合三维数据结构的Dropout变体,并合理设置丢弃率。
二、正则化强度的分层调优
权重衰减是微调中最常用的正则化手段。在AdamW或SGD优化器中,权重衰减等价于每一步将权重按固定比例收缩,能够抑制权值无限增长。但微调时不宜对全部参数使用同一个系数。骨干网络部分应该使用较小的权重衰减,例如1e-5到1e-4,目的是保留预训练得到的几何特征;新增任务头部分应该使用较大的权重衰减,例如1e-3到1e-2,因为这部分结构没有预训练先验,最容易过拟合。
在PyTorch中可以通过参数分组实现分层权重衰减,代码如下:
optimizer = torch.optim.AdamW([
{'params': backbone.parameters(), 'weight_decay': 1e-5},
{'params': head.parameters(), 'weight_decay': 1e-3},
], lr=1e-4)
for epoch in range(epochs):
model.train()
for batch in train_loader:
points, labels = batch
pred = model(points)
loss = criterion(pred, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
val_loss = evaluate(model, val_loader)
if val_loss < best_loss:
best_loss = val_loss
torch.save(model.state_dict(), 'best_3d_model.pth')
除了权重衰减,早停也是一种隐式正则化。监控验证损失时,如果连续多轮没有下降,就恢复最优权重并停止训练。对于3D模型还可以加入谱范数正则,限制卷积核的最大奇异值,让特征映射更加平滑。不过谱范数每个训练步都需要幂迭代,计算开销较大,适合参数规模较小的微调场景。
需要注意的是,正则化强度并不是越大越好。过强的权重衰减会让骨干网络丧失预训练先验,表现为训练损失和验证损失同时偏高。判断方法是观察验证曲线:如果训练损失低、验证损失高,说明过拟合,可以适当增大正则化;如果两者都高,则说明正则过强或学习率太小,需要降低权重衰减或提高学习率。
三、Dropout在3D分支中的实用策略
点云模型通常对每个点做共享MLP,输入形状为(B, N, C),其中N是点数,C是特征通道。如果在所有元素上随机丢弃,相当于对部分点的部分通道同时置零,容易造成局部邻域信息不完整。更合适的做法是在通道维度上做Dropout,让整个通道对全部点同时失效,保持每个点的邻域聚合仍然有足够的特征来源。
自定义通道级Dropout的代码示例如下:
class ChannelDropout(nn.Module):
def __init__(self, p=0.1):
super().__init__()
self.p = p
def forward(self, x):
# x 的形状为 (B, C, N)
if not self.training or self.p == 0:
return x
mask = torch.empty(x.size(0), x.size(1), 1, device=x.device).bernoulli_(1 - self.p)
return x * mask
对于体素或投影类3D CNN,特征图为(B, C, D, H, W)五维结构。此时适合使用Dropout3d,它在通道维度整体丢弃,保留局部空间块内部的连续性。丢弃率通常设置在0.1到0.25之间,不建议超过0.3,否则训练损失波动过大。Dropout层的位置也很关键,一般加在全局池化之前的最后一层或中间高维特征层,不要加在输入体素层,以免破坏原始几何信息。
在NeRF等隐式神经场微调中,Dropout可以加在颜色和密度MLP的隐藏层,配合权重衰减抑制高频噪声。但要注意丢弃率不宜过高,否则会削弱视角相关的细节建模能力。可以在粗网络和细网络之间加入较浅的Dropout,让两个阶段相互补充。
四、组合策略与实验判断
实际微调3D模型时,推荐将AdamW优化器、分层权重衰减、通道级Dropout以及轻量数据增强组合使用。数据增强可以包括随机旋转、点云随机下采样、体素随机平移等,这些操作能进一步扩大有效样本量。一个简化配置如下:
config = {
"backbone_weight_decay": 1e-5,
"head_weight_decay": 1e-3,
"dropout_rate": 0.15,
"use_channel_dropout": True,
"optimizer": "AdamW",
"lr": 1e-4,
"early_stop_patience": 10,
}
在训练过程中要同时记录训练损失、验证损失、验证精度以及各层权重范数。合理的Dropout设置会使训练损失略高于验证损失或两者接近;如果训练损失远低于验证损失,说明Dropout不足或权重衰减不够。如果训练损失和验证损失都很高,可能是学习率偏低或数据预处理有问题。还要观察特征通道的激活方差,如果某些通道激活值接近零,说明Dropout丢弃率过高,需要下调。
最终要回归到一个核心原则:微调3D模型的目的是保留预训练几何先验,而不是强行拟合小样本训练集。正则化强度和Dropout的调优应该围绕这个目标进行,从低权重衰减和小丢弃率开始,根据验证曲线逐步增加约束。没有哪一组参数适合所有3D任务,但分层权重衰减与通道级Dropout的组合通常能显著缩小泛化差距。