首先,感谢主办方举办这场引人入胜的研究竞赛!同时,也感谢大家在讨论中分享了许多重要的见解。
我们已发布我们的notebook,描述如下:
Notebook : https://www.kaggle.com/code/marvelworld/toshi-k-rotate-and-marvel-pseudo-blend48-52
(用于添加数据集和调试的代码不会影响提交结果)
1. 概述
我们的解决方案是两种方法的集成:(1)从转置权重重新训练和(2)使用伪标签进行微调。
- (1)涉及使用原始模型的修改版本重新训练模型。在此修改中,所有Conv2D层的权重都被转置。此过程有助于遗忘forget-set中的样本,从而能够重用原始模型中的有价值特征。
- (2)使用伪标签重现重新训练模型的行为。我们估计重新训练模型在forget数据上的错误,并将其用作微调预训练模型的伪标签。
每次对一个模型执行取消学习时,都会执行其中一种方法。
2. 从转置权重重新训练(作者:@toshik)
在取消学习过程开始时,所有Conv2D层的权重都会在垂直和水平方向上进行转置。此操作有助于遗忘forget-set。修改过程简单如下:
def rotate_weight(local_model):
print('rotate weight')
for module in local_model.modules():
if isinstance(module, torch.nn.modules.conv.Conv2d):
module.weight = torch.nn.Parameter(module.weight.swapaxes(2, 3))
然后,模型使用retain集进行3个epoch的训练。这被认为等价于将翻转的图像输入到原始模型并执行微调。与从头开始重新训练相比,转置后的权重仍然保留了原始模型中的有价值特征。这使得能够重用这些信息,从而在微调期间实现更快、更稳定的收敛。
3. 使用伪标签进行微调(作者:@marvelworld)
第一步是使用预训练模型对遗忘数据进行推断。接下来,再次对示例笔记本中所示的简单遗忘处理后的遗忘数据进行推断。比较两次推断的结果,并识别推断结果朝错误方向移动的数据。
我们还基于重新训练的数据开发了一个简单的原始模型,用于推断遗忘数据。这一结果同样能够识别出模型容易以一定置信度错误分类的数据。
最后,使用识别出的数据和错误推断作为伪标签,对预训练模型进行微调。
4. 集成
我们的解决方案混合了两种类型的模型。我们尝试了不同的组合方式,最终得分如下:
| 从转置权重重新训练 | 使用伪标签微调 | Private LB |
|---|---|---|
| 246 个模型 | 266 个模型 | 0.0785184178 |
| 266 个模型 | 246 个模型 | 0.0756313425 |
5. 我们尝试过但未成功的方法
- 类别权重
- 针对每一层的方法,如LLRD、初始化/冻结
- softmax标签 / KL损失
- Relax损失
- SCRUB
尽管Relax损失和SCRUB在该领域似乎是先进的方法,但它们意外地表现不佳。
遗忘指标非常严格,针对成员推理攻击(MIA)的防御措施不足以获得良好得分。
6. 最终说明
我们的解决方案基于两种不同的方法,有助于提高我们在私有排行榜中的稳定性。然而,在将其应用于实际问题时存在某些限制,特别是在手动调整某些参数方面。
我们希望我们的解决方案能成为未来研究的宝贵参考。
感谢您阅读到最后!