ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

再盲目魔改模型了:深度学习涨点的系统方法与实验技巧

再盲目魔改模型了:深度学习涨点的系统方法与实验技巧 在深度学习项目中经常会遇到这样一种情况模型已经能够正常训练Loss 也在下降但是验证集指标始终卡在某个位置继续增加训练轮数也没有明显提升。这时候很多人的第一反应往往是加 Attention ↓ 换 Loss ↓ 调学习率 ↓ 换 Backbone ↓ 再堆几个模块最后指标可能真的提升了但是却出现了另一个问题到底是哪一项改动带来了提升实际上深度学习中的“涨点”并不是不断往网络中增加模块。一个更加合理的优化顺序通常应该是数据与标签 ↓ 数据增强与预处理 ↓ 损失函数 ↓ 学习率与训练策略 ↓ 超参数搜索 ↓ Bad Case 分析 ↓ 预训练模型与 Backbone ↓ 网络结构微调 ↓ 后处理 ↓ 多随机种子与消融实验核心思想只有一句话先尝试低成本、低风险、容易解释的优化再进行高成本的网络结构修改。现在有了 Codex这一过程会方便很多。Codex 很适合帮助我们完成重复性的工程工作例如修改训练代码添加新的数据增强替换 Loss增加 EMA编写超参数搜索脚本自动整理实验结果筛选 Bad Case检查两个实验是否真正做到了控制变量。但是需要注意Codex 可以帮助我们写代码和自动化实验但不能替代实验设计本身。下面从一个完整深度学习项目的角度系统整理常见的模型指标提升方法。一、先建立一个可靠的 Baseline1.1 什么是 BaselineBaseline 可以理解为后续所有实验进行比较的基础版本。例如实验名称E0_Baseline BackboneResNet50 LossCross Entropy OptimizerAdamW Learning Rate1e-4 Batch Size16 Epoch100 Random Seed42后面的每一项实验都尽量从 Baseline 出发。例如E0Baseline E1Baseline RandAugment E2Baseline Focal Loss E3Baseline EMA E4Baseline Cosine Learning Rate E5Baseline Attention Module这样才能知道究竟是哪一项修改带来了性能变化。1.2 一个可靠的 Baseline 应该满足什么条件至少应该满足模型可以正常训练Loss 能够正常下降验证集指标能够正常计算checkpoint 能够正常保存checkpoint 能够正常加载数据划分已经固定随机种子已经记录实验日志完整没有明显的数据泄漏测试代码与训练代码能够对应。如果 Baseline 本身都不稳定后面所有涨点实验都会变得很难解释。1.3 可以让 Codex 帮你检查 Baseline拿到一个开源项目以后可以先把训练入口、配置文件和数据加载代码交给 Codex。例如可以这样告诉 Codex请检查当前深度学习项目的 Baseline 训练流程。 重点检查 1. 训练集、验证集和测试集是否存在数据泄漏 2. Random Seed 是否正确固定 3. checkpoint 是否能够完整保存和恢复 4. Optimizer 和 Scheduler 是否可以正常恢复 5. 验证阶段是否误用了训练数据增强 6. 测试阶段是否正确加载指定 checkpoint 7. 是否存在明显影响实验公平性的配置问题。 当前阶段不要修改模型结构只输出检查报告。这种方式非常适合在正式“涨点”之前做一次代码体检。二、优先从数据入手数据增强与预处理数据往往是最值得优先检查的部分。模型最终能够学习到什么本质上取决于你给它看到了什么数据。很多时候指标上不去并不是模型不够复杂而是数据处理本身存在问题。2.1 基础数据增强2.1.1 常见的数据增强方式图像任务中常见的数据增强包括RandomResizedCrop RandomHorizontalFlip RandomRotation ColorJitter RandomErasing它们分别可以模拟不同目标尺度左右翻转小幅旋转光照和颜色变化局部遮挡。这些增强的主要目的不是简单增加图片数量而是让模型不要过度依赖训练集中的固定位置、颜色和纹理。2.1.2 数据增强并不是越多越好这是非常重要的一点。增强必须符合真实任务。例如如果图像的左右方向具有明确语义那么RandomHorizontalFlip可能反而会制造错误样本。对于医学图像遥感图像文字识别壁画结构提取精细分割都应该先思考这个增强之后的图像在真实世界中是否合理而不是看到别人用了就直接复制。2.1.3 如何利用 Codex 添加基础增强可以直接让 Codex 修改数据加载代码但要强调控制变量。例如请基于当前 PyTorch DataLoader 增加基础数据增强。 要求 1. 只修改训练集 2. 验证集和测试集保持原处理方式不变 3. 增加 RandomResizedCrop、RandomHorizontalFlip 和轻度 ColorJitter 4. 不修改模型结构 5. 不修改 Loss 6. 不修改 Optimizer 和 Learning Rate 7. 保留原始数据增强配置可以通过参数开关切换 8. 输出修改位置和前后差异。这样生成出来的代码更加适合作为单独的消融实验。2.2 RandAugment、AutoAugment 等自动增强2.2.1 为什么要使用自动增强如果手工设计增强组合比较麻烦可以尝试RandAugmentAutoAugmentTrivialAugment。这些方法会自动从多种增强操作中选择组合例如旋转 亮度 对比度 颜色 平移 剪切其中 RandAugment 的使用成本相对较低非常适合做快速实验。2.2.2 推荐的实验方式不要直接把所有增强全部堆在一起。建议E0Baseline E1Baseline RandAugment E2Baseline AutoAugment先判断单独是否有效。如果 RandAugment 明显优于 Baseline再考虑继续调节增强强度。2.2.3 Codex 可以帮你自动做什么除了添加增强还可以让 Codex 自动生成对比实验。例如请基于当前 Baseline 创建两个独立实验 E1_RandAugment E2_AutoAugment 要求 除数据增强策略以外 所有训练配置必须与 Baseline 完全一致。 分别保存 - config - train log - checkpoint - validation metrics 最后自动生成一个 CSV对比三个实验的指标。这比手工改三次配置文件更加稳定。2.3 Mixup 与 CutMix2.3.1 Mixup 是什么Mixup 可以简单理解成把两张图片按照一定比例混合。例如70% 猫图片 30% 狗图片对应的标签也变成70% 猫 30% 狗它的作用是让模型不要把类别边界学得过于僵硬。2.3.2 CutMix 是什么CutMix 并不是把两张图透明叠加而是从图片 B 中裁剪一块区域 ↓ 粘贴到图片 A然后根据区域面积调整标签。相较于 Mixup它保留了更加真实的局部图像区域。2.3.3 应该怎样实验建议分别做E0Baseline E1Baseline Mixup E2Baseline CutMix E3Baseline Mixup CutMix因为单独有效并不意味着组合起来一定更好。2.4 检查 Normalization2.4.1 为什么归一化很重要很多 ImageNet 预训练模型默认使用Mean 0.485 0.456 0.406 Std 0.229 0.224 0.225如果当前数据和 ImageNet 差别非常大例如医学图像壁画图像工业图像灰度图像红外图像那么就值得检查自己的数据统计分布。2.4.2 不要默认认为重新计算一定更好如果 Backbone 使用的是 ImageNet 预训练权重那么它原本就是在 ImageNet Normalization 下训练出来的。所以可以做E0 ImageNet Mean / Std E1 Dataset Mean / Std最终看验证集结果。2.4.3 让 Codex 自动统计数据集 Mean 和 Std可以直接要求请编写一个独立脚本 统计当前训练集 RGB 三个通道的 Mean 和 Std。 要求 1. 不使用数据增强 2. 只统计训练集 3. 支持批量读取 4. 输出最终 Mean 和 Std 5. 不修改原始数据 6. 同时输出与 ImageNet Mean/Std 的差异。这个脚本通常几分钟就能生成。三、选择更加适合任务的损失函数Loss 决定了模型训练过程中什么错误最重要。因此在网络结构不变的情况下选择更加适合任务特点的 Loss往往是一个低成本但很值得尝试的优化方向。3.1 类别不平衡尝试 Focal Loss3.1.1 什么情况下适合例如正常样本9000 缺陷样本1000这种情况下模型可能很容易倾向多数类。Focal Loss 的核心思想可以理解成已经很容易的样本 ↓ 降低它的重要性 模型仍然分不清的困难样本 ↓ 重点学习因此比较适合类别不平衡正负样本数量差异大少数类别容易被忽略大量简单负样本。3.1.2 如何让 Codex 替换 Loss建议不要直接删除原始 Loss。可以这样要求请在当前分类项目中加入 Focal Loss。 要求 1. 保留原始 CrossEntropyLoss 2. 增加 --loss_type 参数 3. 支持 ce 和 focal 两种模式 4. 默认仍然使用原始 CE 5. 除 Loss 外不修改其他任何训练设置 6. 日志中记录 focal gamma、alpha 参数 7. 确保 resume training 不受影响。这样既安全也方便做消融。3.2 回归任务Smooth L1 与 Huber Loss如果使用 MSE 时经常出现Loss 曲线突然出现很高的尖峰可以检查是否存在异常样本同时尝试Smooth L1 Huber Loss它们通常比 MSE 对异常值更加稳健。建议实验E0MSE E1Smooth L1 E2Huber3.3 Label Smoothing3.3.1 它解决什么问题传统分类标签非常绝对正确类别1 其他类别0Label Smoothing 会稍微软化标签。例如原始 [1.0, 0.0, 0.0] 平滑后 [0.9, 0.05, 0.05]可以简单理解成不要让模型对自己的判断过度自信。3.3.2 参数怎么设置可以先尝试0 0.05 0.1 0.2不要默认0.1 一定最好最终还是以验证集为准。四、优化学习率与训练策略学习率是深度学习中最重要的超参数之一。很多模型并不是结构不好而是根本没有被训练到一个好的状态。4.1 Warmup4.1.1 Warmup 是什么可以理解成模型刚开始训练的时候先慢一点。例如正常学习率0.001训练初期逐渐增加0.0001 ↓ 0.0002 ↓ 0.0005 ↓ 0.001这样能够减少训练初期的剧烈波动。4.1.2 哪些情况值得尝试尤其适用于Transformer大模型微调大 Batch Size预训练模型训练前期容易震荡的模型。Warmup 比例可以先从总 Step 的5%10%附近尝试。4.2 Cosine AnnealingCosine Annealing 可以简单理解成训练前期 较大学习率 ↓ 快速学习 训练中期 逐渐降低 ↓ 继续优化 训练后期 很小的学习率 ↓ 精细调整一个非常常见的组合是Warmup Cosine Annealing也就是前期慢慢升后期慢慢降。4.3 Cosine Warm Restart如果训练周期比较长还可以尝试CosineAnnealingWarmRestarts它会让学习率降低 ↓ 重新升高 ↓ 再次降低目的是让模型有机会跳出当前优化区域。不过这个方法并不是所有任务都适用所以应该作为单独实验验证。4.4 分层学习率4.4.1 为什么 Backbone 和 Head 不一定使用相同学习率例如预训练 Backbone 新加入 HeadBackbone 已经学到了很多通用特征所以可以慢慢调整Backbone 1e-5新 Head 是随机初始化的可以学习得快一些Head 1e-4这样可以避免预训练 Backbone 被过大的学习率迅速破坏。4.4.2 Codex 可以帮你自动分组参数例如请修改当前 Optimizer 参数配置。 目标 1. pretrained backbone 使用 lr1e-5 2. newly initialized head 使用 lr1e-4 3. 其他 AdamW 参数保持不变 4. 日志中打印每个 param group 的参数数量和学习率 5. 不修改网络结构 6. 确保 scheduler 可以同时作用于两个 param group。对于复杂网络这比自己手工检查参数名安全很多。五、系统进行超参数搜索手工调参经常是1e-4 不行 ↓ 换成 1e-3 还不行 ↓ 换成 5e-5这种方式容易遗漏真正有效的区域。更加规范的方法是使用Grid SearchRandom SearchOptunaWandB Sweep。5.1 优先搜索哪些参数一般优先考虑Learning Rate Weight Decay Batch Size Dropout Loss Weight Warmup Ratio例如学习率1e-3 3e-4 1e-4 3e-5 1e-5Weight Decay1e-2 1e-3 1e-4 1e-55.2 前期不一定需要完整训练如果正式实验需要200 Epoch前期搜索可以先2030 Epoch筛选出明显不好的参数组合。然后再对 Top-K 参数进行完整训练。这样能节省大量时间。5.3 利用 Optuna 自动搜索Optuna 可以实现自动生成参数 ↓ 启动训练 ↓ 读取验证指标 ↓ 继续尝试 ↓ 逐渐找到较优区域5.4 让 Codex 帮你生成 Optuna 搜索脚本可以这样要求请基于当前训练入口编写 Optuna 超参数搜索脚本。 搜索 learning_rate1e-6 1e-3对数采样 weight_decay1e-6 1e-2对数采样 batch_size4、8、16、32 dropout0.0 0.4 要求 1. 每个 Trial 保存到独立目录 2. 不覆盖已有实验 3. 记录完整参数 4. 记录最佳验证集指标 5. 失败 Trial 不影响后续搜索 6. 自动输出 best_trials.csv 7. 原始训练代码尽量少修改。这样就可以把大量重复实验交给程序完成。六、几个非常实用的训练技巧6.1 EMA指数移动平均EMA 可以简单理解成不要只相信当前这一刻的模型参数 ↓ 参考过去一段时间的参数 ↓ 得到更加平滑的权重训练完成后可以同时测试普通 checkpoint vs EMA checkpoint看哪一个验证集指标更高。6.1.1 利用 Codex 加入 EMA例如请给当前训练代码增加 EMA。 要求 1. 不影响原始模型正常训练 2. 每次 optimizer.step 后更新 EMA 3. checkpoint 同时保存普通模型和 EMA 4. resume 后 EMA 状态能够恢复 5. 验证阶段分别评估 raw model 和 EMA model 6. 不覆盖原始 checkpoint 命名。这类功能自己实现时很容易漏掉恢复逻辑因此非常适合交给 Codex 检查。6.2 Gradient Accumulation假设 GPU 只能运行batch_size 4但希望模拟batch_size 16可以设置gradient_accumulation_steps 4也就是4 张 4 张 4 张 4 张 ↓ 再进行一次 optimizer.step()有效 Batch Size 大约相当于4 × 4 16需要注意有效 Batch Size 改变后最佳学习率也可能发生变化。6.3 AMP 混合精度训练AMP 主要用于减少显存提高训练速度支持更大 Batch支持更高输入分辨率。它本身并不等于直接涨点。但是它可能让你能够使用更大的 Batch 更高的分辨率 更大的模型所以属于非常实用的工程优化手段。6.4 Progressive ResizingProgressive Resizing 是低分辨率训练 ↓ 中分辨率 ↓ 高分辨率例如224×224 ↓ 384×384 ↓ 512×512前期学习整体结构后期学习细节。但是对于边缘检测线描提取小目标精细分割要谨慎使用因为低分辨率可能直接破坏关键细节。七、指标上不去时先分析 Bad Case这是很多实验中最容易被忽略的一步。当模型指标已经卡住时继续乱调参数往往效率很低。真正应该问的是模型到底错在哪里7.1 分析 False Positive 和 False Negative可以分别保存False Positive False Negative 高置信度错误 低置信度样本例如发现False Positive 大量集中在复杂背景说明问题可能是模型把背景纹理误认为目标此时更应该考虑增加困难负样本调整数据增强增加背景监督修改特征选择机制而不是直接换更大的 Backbone。7.2 利用 Codex 自动筛选错误样本可以直接要求请编写验证集 Bad Case 分析脚本。 分别保存 1. False Positive 2. False Negative 3. 高置信度错误预测 4. 最低置信度正确预测。 要求 每类最多保存 100 张 文件名包含 GT、Pred 和 Confidence 同时输出 bad_cases.csv 不修改原始图片。这样能迅速把“指标问题”变成“可观察的问题”。7.3 Grad-CAM 与 Attention Map分类模型可以使用 Grad-CAM 观察网络真正关注了哪里。例如目标是猫但是模型一直看背景沙发。说明它可能学到的是这种沙发经常出现猫而不是猫本身。这种问题往往说明数据存在偏差或者模型过度依赖背景信息7.4 混淆矩阵对于多分类任务可以观察A 类经常预测成 B 类 C 类 Recall 很低 D 类 Precision 很低从而判断是否需要增加特定类别数据修改类别权重检查标注质量使用 Focal Loss做困难样本挖掘。八、基础训练稳定后再考虑网络结构优化前面的数据、Loss、学习率和训练策略都基本稳定以后才建议开始修改网络结构。原因是只有知道模型哪里有问题结构修改才有明确目的。8.1 激活函数替换可以尝试ReLU GELU SiLU / Swish建议做E0ReLU E1GELU E2SiLU其他设置保持完全一致。8.2 Dropout、DropPath 与 Stochastic Depth如果出现训练集指标非常高 验证集明显低可能存在过拟合。可以尝试Dropout DropPath Stochastic Depth例如Dropout 0.1 0.2 0.3逐步测试。不要一次性加得太大否则容易从过拟合直接变成欠拟合。8.3 Attention 模块常见模块包括SE CBAM ECA Coordinate Attention它们通常用于加强网络对重要通道 重要空间区域的关注。但必须注意Attention 不是越多越好。如果模型本身已经存在Self-Attention Channel Attention Gating Transformer Feature Fusion继续叠加 Attention 很可能只是增加复杂度。正确的问题应该是当前模型缺少什么信息而不是哪里还能再塞一个 CBAM8.4 用 Codex 做结构实验时要限制修改范围这是非常重要的一点。例如可以告诉 Codex请在当前 Baseline 中加入一个 CBAM 模块。 约束 1. 只允许修改 Stage3 输出之后 2. 不修改 Backbone 其他结构 3. 不改变训练 Loss 4. 不改变数据处理 5. 不改变 Optimizer 6. 参数增加量需要统计 7. 保留 Baseline 模型文件 8. 新模型使用新的 class name 9. 输出网络前后参数量和 FLOPs 对比。如果不给范围自动修改代码时很容易无意间改变多个变量。九、辅助损失与深度监督9.1 什么是深度监督普通模型可能只有最终输出计算 Loss输入 ↓ Stage1 ↓ Stage2 ↓ Stage3 ↓ Stage4 ↓ 最终 Loss深度监督则可能变成Stage2 → Aux Loss 1 Stage3 → Aux Loss 2 Stage4 → Main Loss可以简单理解成不只有期末考试中间也安排阶段测验。这样可以让中间特征层获得更加直接的监督信号。9.2 哪些任务比较常见尤其常见于语义分割边缘检测医学分割多尺度预测图像恢复。9.3 注意辅助 Loss 权重例如Main Loss 0.3 × Aux Loss 1 0.2 × Aux Loss 2辅助 Loss 只是辅助。如果权重过大反而可能影响主任务。因此应该单独做λ_aux 0.1 0.2 0.3的实验。十、尝试更强的 Backbone 与预训练模型10.1 更换 Backbone如果确实判断当前特征提取能力不足可以尝试ResNet ↓ ResNeXt ResNet ↓ ConvNeXt CNN ↓ Swin Transformer但是一定要注意只换 Backbone其他条件尽量保持一致。10.2 预训练权重可能比结构本身更重要可以尝试ImageNet CLIP DINO DINOv2 MAE特别是在小数据集上强预训练往往非常重要。有时候更合适的预训练权重比再增加几个 Attention更加值得尝试。10.3 利用 Codex 检查预训练权重是否真的加载成功这是一个非常实用的检查。可以要求请检查当前预训练 Backbone 是否真正成功加载。 需要输出 1. checkpoint 中 key 数量 2. 成功匹配的 key 3. missing keys 4. unexpected keys 5. shape mismatch 6. 实际加载比例 7. Backbone 第一层和最后一层参数统计。 不要仅根据 load_state_dict 没报错判断成功。有些项目“看起来加载了预训练权重”实际上只加载了一部分。十一、训练结束以后不要忽略后处理11.1 分类任务调整阈值二分类通常默认threshold 0.5但是 0.5 并不一定是最优值。可以在验证集搜索0.1 0.2 0.3 ... 0.9然后观察Precision Recall F1 Accuracy选择符合任务目标的阈值。注意阈值只能在验证集上调。不能在测试集上反复搜索。11.2 检测任务可以尝试Confidence Threshold NMS Threshold IoU Threshold这些参数会直接影响 Precision 和 Recall。11.3 分割任务可以考虑去除小连通区域 孔洞填充 形态学操作 边界平滑 CRF同样参数必须通过验证集确定。十二、最后再进入真正的“模型魔改”当前面的常规优化都基本完成后就可以进入更加深入的模型设计。例如Self-Attention Cross-Attention Multi-Scale Fusion Feature Pyramid Dynamic Convolution Gated Fusion Feature Alignment 新的 Normalization 新的 Loss 组合但是这时候已经不是简单的“涨点 Trick”。而是进入模型创新设计。12.1 每一个新模块都应该回答三个问题12.1.1 为什么要加例如原模型小目标预测效果差所以引入Multi-Scale Feature Fusion这是有明确动机的。12.1.2 它解决什么问题例如背景误检严重那么新模块应该能够解释为什么它有能力抑制背景误检12.1.3 实验是否证明它真的有效至少需要Baseline vs Baseline Module进一步最好增加Ablation Study Visualization Multi-seed这样才具有学术说服力。十三、最重要的原则严格控制变量这是整个涨点过程中最重要的一条。13.1 为什么一定要控制变量假设同时修改Learning Rate Loss Batch Size Attention Data Augmentation结果Accuracy 90% ↓ 92%确实涨了。但是你根本不知道到底是谁带来的 2%13.2 正确的实验方式应该是E0 Baseline E1 Baseline Focal Loss E2 Baseline RandAugment E3 Baseline EMA E4 Baseline Cosine LR E5 Baseline CBAM然后分别比较。13.3 单个方法有效后再进行组合实验例如Focal Loss 有效 EMA 有效 RandAugment 有效再进一步E6 Focal EMA E7 RandAugment EMA E8 Focal RandAugment EMA因为单独有效的方法组合以后未必仍然有效。13.4 可以让 Codex 自动检查两个实验的差异这是 Codex 特别适合完成的工作。例如请比较 E0_Baseline 和 E1_Focal 两个实验。 检查以下内容是否完全一致 1. Dataset Split 2. Random Seed 3. Batch Size 4. Learning Rate 5. Optimizer 6. Scheduler 7. Data Augmentation 8. Epoch 9. Backbone 10. Pretrained Weight 11. Gradient Accumulation 12. AMP 配置 目标 确认除了 Loss 以外没有其他变量变化。 如果发现变化请按照严重程度列出。这类检查对论文实验非常有用。十四、不要过度相信一次实验结果深度学习训练本身存在随机性。14.1 哪些因素会引起随机波动例如随机初始化 DataLoader Shuffle Dropout CUDA 非确定性算子 数据采样顺序因此Baseline91.5% 新方法91.7%仅仅高了 0.2%并不能马上说明它有效。14.2 使用多个 Random Seed重要实验可以运行seed 0 seed 42 seed 3407例如得到91.2% 92.0% 91.6%最后报告平均性能 实验波动也就是论文里常见的Mean ± Std可以简单理解成Mean 平均水平 Std 多次实验之间波动大不大14.3 Codex 可以自动跑 Multi-seed 实验例如请基于当前训练命令生成 multi-seed 实验脚本。 Seeds 0 42 3407 要求 1. 每个 seed 使用独立实验目录 2. 不覆盖已有 checkpoint 3. 训练配置除 seed 外全部一致 4. 自动读取三个实验的最佳验证指标 5. 计算 Mean 和 Std 6. 输出 multi_seed_summary.csv。这样比手工跑三次可靠很多。十五、推荐的一套完整涨点路线如果拿到一个已经能够正常训练的项目我更推荐按照下面的顺序优化。15.1 第一阶段先把训练流程搞正确① 跑通 Baseline ↓ ② 检查 Dataset Split ↓ ③ 检查标签 ↓ ④ 检查 Normalization ↓ ⑤ 检查训练/验证/测试流程15.2 第二阶段低成本优化⑥ 基础数据增强 ↓ ⑦ RandAugment / Mixup / CutMix ↓ ⑧ Learning Rate ↓ ⑨ Warmup Cosine ↓ ⑩ 更适合的 Loss ↓ ⑪ EMA15.3 第三阶段系统调参⑫ Learning Rate Search ↓ ⑬ Weight Decay Search ↓ ⑭ Batch Size ↓ ⑮ Loss Weight ↓ ⑯ Optuna / WandB Sweep15.4 第四阶段分析模型到底错在哪里⑰ Bad Case ↓ ⑱ Confusion Matrix ↓ ⑲ Grad-CAM ↓ ⑳ False Positive / False Negative15.5 第五阶段模型结构优化㉑ Backbone ↓ ㉒ Pretrained Weight ↓ ㉓ Activation ↓ ㉔ Dropout / DropPath ↓ ㉕ Attention ↓ ㉖ Deep Supervision ↓ ㉗ 自定义创新模块15.6 第六阶段验证结论是否可靠㉘ 后处理 ↓ ㉙ Multi-seed ↓ ㉚ Ablation Study ↓ ㉛ 定量 定性分析十六、如何把 Codex 真正用到“涨点”过程中Codex 最大的价值并不是让它随便帮我们改一个模型。而是让它帮我们快速、规范、重复地完成实验。16.1 用 Codex 做代码体检例如检查 DataLoader 检查标签 检查 Loss 接线 检查 Scheduler 检查 checkpoint 检查 resume 检查验证流程16.2 用 Codex 快速实现单变量实验例如Baseline ↓ 只加 EMA或者Baseline ↓ 只换 Focal Loss这类修改非常适合交给 Codex。16.3 用 Codex 自动管理实验目录可以明确要求每一个实验必须使用新的 name。 禁止覆盖 Baseline。 目录中保存 config checkpoint metrics.csv train.log validation.log对于实验非常多的项目这一点特别重要。16.4 用 Codex 自动汇总实验结果例如请扫描 experiments 目录中所有实验。 读取每个实验 best epoch Accuracy Precision Recall F1 AUROC 生成 experiment_summary.csv 并按照 F1 从高到低排序。这样就不需要手工一个个打开日志。16.5 用 Codex 检查有没有“偷偷改变变量”这是我认为非常实用的一点。很多时候自己以为只改了一个 Loss实际上可能还改了Batch Size Scheduler Augmentation所以每次正式实验前都可以让 Codex做一次Baseline vs New Experiment配置审计。十七、不要迷信“某个 Trick 一定能涨几个点”网上经常会看到EMA 稳涨 1 个点 CBAM 稳涨 2 个点 Focal Loss 稳涨 3 个点 Cosine 稳涨 0.5 个点这些说法只能作为经验参考。真正的效果和很多因素有关数据集规模Baseline 强弱网络结构任务类型训练预算随机种子评价指标。一个方法在 ImageNet 分类有效并不代表在医学分割 工业缺陷检测 敦煌壁画线描 目标检测中一定有效。因此更加科学的表达应该是值得尝试。而不是一定涨点。十八、真正有价值的涨点实验应该回答什么我认为至少需要回答三个问题。18.1 原模型的问题是什么例如类别不平衡 背景误检 小目标漏检 过拟合 训练不稳定18.2 为什么这个方法可能解决问题例如类别不平衡 ↓ Focal Loss 训练后期权重波动 ↓ EMA 小目标效果差 ↓ Multi-Scale Feature Backbone 微调过快 ↓ 分层学习率18.3 实验是否真的证明它有效至少需要Baseline vs Baseline Method最好再增加Multi-seed Ablation Study Bad Case Visualization这样得到的提升才更加可信。十九、总结深度学习中的“涨点”不应该只是不断加模块 不断换 Loss 不断调参数而应该形成一个更加规范的流程发现问题 ↓ 分析原因 ↓ 提出假设 ↓ 只修改一个核心变量 ↓ 运行实验 ↓ 比较结果 ↓ 分析 Bad Case ↓ 判断假设是否成立更加推荐的优化顺序是数据 ↓ Loss ↓ Learning Rate ↓ Training Strategy ↓ Hyperparameter Search ↓ Bad Case ↓ Pretrained Model ↓ Backbone ↓ Network Modification ↓ Post-processing ↓ Multi-seed ↓ Ablation Study而 Codex 在这个过程中最适合做的是检查代码 ↓ 修改代码 ↓ 生成实验脚本 ↓ 管理不同实验 ↓ 自动统计指标 ↓ 筛选 Bad Case ↓ 检查控制变量它能够极大降低重复性工程工作的成本但是最终真正决定实验质量的仍然是我们是否能够回答为什么要这么改这个修改针对什么问题涨点以后是否能够证明真的是它起作用换一个随机种子以后还能不能成立如果能够把这些问题回答清楚那么“跑代码提升指标”就不再只是不断尝试各种 Trick而会逐渐变成一套更加规范、可重复、可解释的深度学习实验方法。
返回列表