Appearance
Underfit CV:灾难性遗忘感知微调
- 来源:
noai-train/联合训练/Day1/T4 underfitCV 邓博文 - 类型:CV / Deep Learning
- 原始资料:
题目描述.md、REFS.md、ref1.py到ref4.py、eval_helper.py - 题面完整性:完整
- 解法资料完整性:完整,有多种参考解法
题面大意
给定一个 102 类图像分类器 tiny_vit_5m_224,它对 79 个 good classes 准确率约 90%,但对 23 个 bad classes 只有约 30%。训练数据只提供 bad classes,每类 10 张图。目标是在 bad-class 数据上微调,让 bad classes 变好,同时尽量不破坏 good classes。评分为 sqrt(acc_bad * acc_good),任何一边崩掉都会使分数接近 0。
数据特点
训练数据极少,且只覆盖坏类;测试集同时包含 good 与 bad。没有 good-class 训练图,朴素交叉熵微调会把分类头和特征空间拉向坏类,导致 good-class 精度下降。原模型权重本身是重要信息源:它代表了 good classes 的知识,不能简单覆盖。
考点
核心考点是灾难性遗忘、低样本微调和保留原模型知识。题目要求同一模型同时提升旧弱类和保持旧强类,考察的不是普通图像分类,而是受限数据下的参数更新策略、蒸馏、adapter/linear probe 和模型融合。
涉及知识点
- Catastrophic forgetting。
- Knowledge distillation:保留旧模型输出分布。
- Few-shot fine-tuning:冻结 backbone、只训练头或小 adapter。
- 验证集划分与小数据增强。
- logits/feature 校正、模型集成、温度缩放。
解法思路
基础解法是冻结大部分模型,只在分类头或最后若干层上做小学习率微调,并使用强数据增强。这样能减少对 good classes 的破坏,但 bad-class 提升有限。
参考解法一是蒸馏:保存原模型作为 teacher,新模型在 bad-class 交叉熵之外,还要拟合 teacher 对输入的 soft logits,或在推理时融合新旧模型概率。它利用“旧模型仍懂 good classes”的事实,降低遗忘。
参考解法二是特征校正:不动原模型主体,在分类前的 hidden/features 或 logits 上接一个小模型,专门修正 bad classes 输出。因为主体参数不变,good-class 精度保留更好;小模型只学习坏类校正,样本效率更高。
综合解法会同时使用蒸馏、小头校正、验证集选择和概率融合,效果上限最高,但实现细节多。
可选/多种解法
蒸馏微调:新模型学习 bad labels,同时约束输出接近旧模型。
线性/小 MLP probe:冻结 backbone,只训练 logits 校正层或 feature adapter。
原模型与微调模型融合:bad 类倾向采用微调模型,good 类保留原模型,或做全局概率平均。
特殊技巧
评分是几何均值,所以不能只看 bad accuracy。每次实验都要同时记录 acc_bad 与 acc_good。小数据下验证集划分很重要,可以从 bad-class 训练图中留出少量做模型选择。数据增强应保留类别语义,随机裁剪、颜色扰动、水平翻转通常有用,但过强增强可能让 10 张图的信息更噪。
调参优化
由于评分使用 good/bad 几何均值,调参必须同时监控 acc_good 和 acc_bad。关键可调项是微调层数、分类头学习率、backbone 学习率、蒸馏 loss 权重、bad-class 重采样比例、增强强度和概率融合权重。bad 类样本很少,验证集波动会很大,建议多 seed 重复并观察是否牺牲 good classes。若微调导致 good accuracy 快速下降,应减小学习率、冻结更多层或用原模型概率做校正融合。
注意事项
题面限制只能用 bad-class 数据微调,不能用 test images 训练。模型架构必须匹配 timm.create_model("tiny_vit_5m_224.dist_in22k_ft_in1k", num_classes=102)。如果只优化交叉熵,很容易 bad-class 上升但 good-class 崩溃,最终分数反而下降。
推广意义
这是真实模型维护中常见问题:线上模型对少数类表现差,但没有完整旧数据可重训。题目的技巧可推广到类别增量学习、模型补丁、小样本修复和生产模型热更新。