很多人把 baseline 跑通之后,第一反应是给模型加一个注意力模块,换一个更复杂的损失函数,或者把网络层数再堆深一点。结果往往是代码改了不少,指标却没有明显变化,训练还变得更不稳定。
更稳妥的做法是:先弄清楚 baseline 的问题,再从训练和数据入手,接着根据任务特点做针对性调整,最后才考虑模型结构。每一次改动都要能回答三个问题:改了什么,为什么改,提升到底来自哪里。
一、先把 baseline 跑明白,别只盯着最终指标
baseline 跑通,只能说明代码链路基本可用,还不能说明你已经理解了这个模型。
在开始改之前,至少要把训练日志、验证结果和错误样本放在一起看。比如,训练集准确率很高,验证集却迟迟上不去,通常要优先怀疑过拟合、数据分布差异或标签质量;如果训练集和验证集都不高,问题可能在特征提取能力、学习率、输入预处理,甚至数据本身。
还要观察 loss 和评价指标的变化过程。loss 一直震荡,可能是学习率过大、batch 太小,或者梯度不稳定;训练前几轮提升很快,后面几乎不动,可能是学习率衰减太早,也可能是模型已经受限于数据和标签。
错误样本同样重要。不要只记录"准确率是多少",最好进一步看哪些类别容易混淆、哪些尺寸的目标容易漏检、模型在什么场景下表现明显变差。这个过程会产生一份问题清单,它比"我想加一个模块"更适合作为后续实验的起点。
如果连 baseline 的瓶颈在哪里都没有判断清楚,后面大多数改动都只是碰运气。
二、第一轮先改训练和数据,通常最划算
模型结构是最显眼的改进方向,但不一定是最优先的方向。很多实验没有提升,原因并不在网络太简单,而在训练过程没有调到合理状态。
可以先从学习率策略开始检查。固定学习率未必适合整个训练过程,warmup、cosine decay 或分阶段衰减,都可能让优化过程更平稳。batch size、梯度累计、优化器和 weight decay 也要一起考虑,不能只改其中一个参数,然后把结果差异全部归因于模型结构。
数据处理往往更容易被忽略。检查重复样本、错误标签、异常图片和训练集与验证集之间的分布差异,有时比增加几层网络更有效。对于图像任务,数据增强也不能照搬别人的配置。随机裁剪、颜色扰动、翻转是否合理,要看任务是否依赖目标方向、颜色或局部纹理。
正则化也要适量。dropout、label smoothing 和权重衰减可以缓解过拟合,但强度过高同样会限制模型学习。如果模型本来就没有学到足够的信息,再加一层正则化,结果只会更差。
这一轮改动的优点是成本低、解释相对清楚,也方便后续复现。建议一次只改一组相关因素,例如先固定模型,只比较两种学习率策略;确认有效后,再进入下一轮实验。
三、改动要对着任务问题,别追着热门模块走
当训练和数据层面的基础问题处理完之后,再看任务本身有什么特殊性。
如果类别分布严重不平衡,单看 accuracy 可能会得到一个比较好看的结果,但少数类的召回率很低。这时可以考虑重采样、类别权重、focal loss,或者换一个更符合任务目标的评价指标。
如果标签存在噪声,继续增加模型容量未必能解决问题,反而可能让模型把错误标签也记住。可以抽样复核标注、分析高损失样本,或者尝试更稳健的损失函数。
如果任务更依赖局部细节,就应该思考输入尺寸、裁剪方式和特征分辨率;如果全局上下文更重要,就要关注感受野和多尺度特征。目标检测中的小目标漏检、医学图像中的边界模糊、细粒度分类中的类别相似,背后的原因各不相同,一个模块很难解决所有问题。
这里有一个很实用的判断方法:先写出"模型为什么会失败"的假设,再选择能验证这个假设的改动。比如,你认为小目标信息在下采样过程中丢失,可以优先检查高分辨率特征、输入尺寸和特征融合,先把问题定位清楚,再决定是否需要加入注意力模块。
改进方向和任务问题之间有清楚的因果关系,实验才更接近真正的研究,也能减少盲目试参数的次数。
四、最后再动模型结构,并把消融实验做完整
如果前面的训练、数据和任务分析都做过了,模型结构仍然存在明显短板,这时再考虑加模块、换 backbone 或调整特征融合方式。
结构改动最好遵守两个原则。第一,一次只改一个主要变量。不要同时换 backbone、损失函数、数据增强和学习率,否则最终指标变好了,也无法判断到底是谁带来的提升。第二,改动必须有理由。与其写"引入注意力机制以提升特征提取能力",不如具体说明它针对的是哪类信息缺失、为什么原模型处理得不够好,以及你希望它改善哪个指标。
消融实验不能只比较 baseline 和最终模型。更完整的做法是逐步加入组件,例如 baseline、baseline 加模块 A、baseline 加模块 B、baseline 加 A 和 B。这样才能看出每个组件单独是否有效,组件之间是否存在互相促进,或者某个组件其实没有贡献。
实验记录也要注意公平性。数据划分、训练轮数、预处理、随机种子和评价指标尽量保持一致。最好重复多次训练,报告平均值和波动范围。一次偶然的高分不应该直接被当成稳定提升。
有些改动最终没有提升,甚至让结果变差,这类实验依然有价值。只要你能说明它在什么设置下无效、可能受什么因素影响,它就能帮助你缩小问题范围。
结语
确定 baseline 之后,先要找出当前结果卡在哪里,再判断哪些改动可能带来帮助。比较稳妥的顺序是:先看清 baseline 的瓶颈,再优化训练和数据,然后围绕任务特点提出假设,最后才调整模型结构,并用消融实验验证。
对于刚入门深度学习的同学,这套流程可能比直接套用复杂网络慢一些,但更容易看懂结果,也更容易在论文、课程设计或项目答辩中讲清楚自己的工作。
真正有价值的改进,未必会让指标一次提高很多。更重要的是,每做完一个实验,你都能比上一次更确定下一步该往哪里走。