拓冰建站拓冰建站
首页 / 资讯中心 / 正文

NAS+Focal Loss+SHAP:端到端可解释不平衡分类框架设计与实践

做分类任务做到一定程度大家手里的模型其实都差不多精度的上限受限于数据受限于算力也受限于你选的 backbone 能表达什么样的特征。但如果你在做一个偏研究性质的项目或者想冲一篇论文光有精度是不够的你得讲清楚“为什么这么做”“网络结构是怎么定出来的”“模型为什么给出这个判断”。这个标题里提到的三个东西——网络架构搜索、Focal Loss、SHAP——刚好对应了这三个问题结构怎么来、难样本怎么处理、预测怎么解释。我这次就把这套框架从设计到落地完整拆开讲一遍。这套东西最初是想解决一个很实际的痛点在一个类别分布极不均匀、且特征模式比较隐蔽的数据集上人工设计的网络结构要么欠拟合少数类要么在调参上浪费大量时间。既然 Nature 子刊上有不少工作证明了自动搜索结构是可行的为什么不直接借这个思路把结构搜索、难样本加权、事后解释串成一个端到端的分类框架这篇文章就是围绕这个框架写的适合正在做分类任务、想引入 NAS 但不知道怎么跟损失函数和可解释性结合的同学也适合准备写论文但还在纠结“创新点怎么凑”的人。它不是一个完整的可复现实验记录但给出了所有关键模块的设计思路和取舍。1. 方案设计与核心思路拆解1.1 为什么是“NAS Focal Loss SHAP”这个组合先说结论这三者不是堆砌而是分别对应了模型开发链路里的三个独立环节——结构设计、训练优化、结果解释。很多人在做改进时容易陷入一个误区就是觉得创新点必须是一个全新的网络结构或者一个全新的损失函数。但实际上把成熟技术按照正确的逻辑组合起来并让它们互相弥补短板本身就是一种有效的方法论。这里我选择 NAS 作为结构生成器是因为传统的人工调结构在这个数据集上已经表现出明显的天花板网络加深会导致少数类过拟合网络变宽又会稀释已经稀缺的正样本信号。NAS 的搜索空间可以同时涵盖深度和宽度而且通过搜索策略可以找到针对当前数据分布更合适的连接方式。Focal Loss 的引入动机也很直接。这个数据集的类别不平衡比大约在 20:1 到 50:1 之间直接用交叉熵训练模型会迅速收敛到“全预测多数类”的局部最优解。而 Focal Loss 通过调制因子降低易分类样本的损失贡献把训练重心压到难样本上。选择它而不是其他采样方法是因为它不需要改变数据分布避免过采样带来的过拟合和欠采样带来的信息丢失。SHAP 则解决了“模型可信吗”的问题。NAS 搜出来的结构往往有一些非常规的连线或分支人工很难直观理解这些结构到底用了什么特征。SHAP 可以对每个样本给出特征贡献值也能汇总出全局重要性排序这样整个框架才不是黑盒——结构是机器选的但判断依据是可解释的。1.2 框架整体管线与模块职责整个框架可以划分为四个阶段预处理与特征工程、架构搜索、模型训练、解释分析。这个顺序不是随意的而是每一步都在为下一步服务。预处理阶段的核心工作是特征对齐和数据划分。架构搜索阶段需要消耗大量计算资源如果特征没有提前标准化搜索过程很容易因为数值尺度问题而震荡。同时NAS 的搜索空间需要根据特征维度确定比如卷积核尺寸、注意力头数这些超参数都受输入维度约束。架构搜索阶段输出的不是最终模型而是一个结构编码称为“最优架构描述”后面训练阶段会用它来实例化完整网络。训练阶段的关键是 Focal Loss 与超参数联动。搜索阶段用的代理指标是加速后的验证精度只做粗筛真正训练时要用完整数据、完整 epoch 数并且需要配合早停和模型快照。解释阶段则是用训练好的模型跑 SHAP这里有一点需要提醒SHAP 的 KernelExplainer 对特征数量敏感特征维度超过 50 时计算量会显著上升所以前置的特征筛选非常重要。1.3 与常规分类框架的差异在哪里常规分类框架通常是“人工设计网络 固定损失函数 事后用注意力图凑解释”。这套框架的最大差异是用搜索替代人工设计用自适应损失替代固定损失用博弈论解释替代可视化热力图。具体来说NAS 环节的搜索空间里包含了不同尺寸的卷积核、不同数量的 Transformer 编码层、不同的池化策略这让最终模型有机会发现人工设计中容易忽略的组合方式。Focal Loss 的自适应性体现在它能够根据训练进度动态调整难样本的梯度贡献相当于训练早期模型还在“广撒网”后期则集中精力“啃硬骨头”。而 SHAP 相比 Grad-CAM 这类方法的最大优势在于它能够处理特征之间的交互效应——对于表格型数据这种交互往往才是分类决策的关键单纯看激活区域会漏掉大量信息。从工作量角度看这套框架的启动成本确实比普通训练脚本高不少但收益也直观结构不需要手工反复试loss 不需要根据训练曲线人工调整模型输出有数值化的解释依据。这套组合在后续迁移到其他数据集时也具备很强的复用性。2. 三大核心组件深度解析2.1 网络架构搜索搜索空间、搜索策略与评估策略NAS 落到具体实现本质上是三个子问题的组合搜索空间定义、搜索策略选择、评估策略设计。任何一个环节偷懒都会导致搜索结果不可用。搜索空间我采用的是基于 Cell 的搜索方式这也是 Nature 子刊上那类工作里比较常见的做法。一个 Cell 内部包含若干个节点每个节点代表一个特征图节点之间的边是操作候选集比如3x3 卷积、5x5 深度可分离卷积、跳跃连接、池化等。多个 Cell 堆叠组成最终网络。这样做的好处是搜索空间的大小是“单元级”的而不是“网络级”的能够显著降低搜索难度。搜索策略这里需要对比一下随机搜索和可微搜索。随机搜索的优点是简单、并行性好但效率较低。可微搜索如 DARTS 的思路通过将结构权重连续化可以用梯度下降优化结构参数效率高很多。考虑到算力有限我选择了可微搜索的变体并在搜索过程中加了early stop如果验证集精度连续多个 epoch 没有提升就提前终止当前结构候选的评估。评估策略是整个 NAS 环节里最容易被低估的部分。为了节省时间常规做法是只用验证集的一个子集且只训练少量 epoch 来评估候选结构。但这里有个坑代理指标与真实指标的相关性不一定稳定。我的做法是保留一个“精英池”每轮搜索结束后把验证子集上表现最好的若干个结构送入“精英池”用完整数据做二次精炼再选出最终结构。2.2 Focal Loss公式拆解与关键参数配置Focal Loss 是在交叉熵基础上加了一个调制系数核心公式是[ FL(p_t) -\alpha_t (1 - p_t)^\gamma \log(p_t) ]这里的 (p_t) 是模型对正确类别的预测概率。当 (p_t) 接近 1 时说明样本已经被模型正确分类此时 ((1-p_t)^\gamma) 趋近于 0损失贡献被压低当 (p_t) 很小、模型预测错误时这个因子接近 1损失保持不变。(\gamma) 控制“压低”的强度(\alpha_t) 则是类别权重用于处理正负样本数目的绝对不平衡。实际配置时(\gamma) 和 (\alpha) 的选值很关键。我试过 (\gamma2.0, \alpha0.25)、(\gamma1.5, \alpha0.3) 等多组组合最后在验证集上表现最好的是 (\gamma2.0, \alpha0.3)。需要注意(\alpha) 并不严格等于样本占比的倒数因为 Focal Loss 的调制因子本身已经在改变样本权重了如果 (\alpha) 过大少数类会过拟合损失曲线会出现后期震荡。另外一点实操经验是Focal Loss 一定要配合概率校准使用。因为调制因子 ( (1-p_t)^\gamma ) 对概率值的敏感度很高如果模型输出概率存在严重过自信调制效果会失真。我的做法是在训练的最后几个 epoch 用温度标度Temperature Scaling对模型输出做一次校准然后再进入验证和测试阶段。2.3 SHAP从全局解释到局部解释SHAP 的核心思想来自博弈论中的 Shapley 值它把每个特征看作一个“玩家”把模型的预测看作“总收益”然后计算每个玩家对收益的边际贡献。相比简单的重要性排序SHAP 能给出每个样本内部的特征贡献分解也能汇总出全局趋势。在表格数据上我优先选择TreeExplainer或KernelExplainer。如果基模型是树模型TreeExplainer 的速度快很多如果是深度学习模型则只能用 KernelExplainer。KernelExplainer 的原理是对特征子集做采样然后用加权线性回归近似 Shapley 值所以计算量较大。在特征维度 30 左右、样本 5000 条时耗时大约十几分钟可以接受。还有一个实用的可视化技巧SHAP 的force_plot适合单样本解释summary_plot适合全局特征重要性展示而dependence_plot能够揭示某个特征对预测的非线性影响。对于要写论文的场景这三个图基本就是解释性实验的全部素材。3. 实操过程与核心环节实现3.1 数据准备与预处理我用的数据集是公开的表格型分类数据类别严重不平衡。原始特征里包含数值型、分类型和少量缺失值所以第一步是分别处理。数值型特征做标准化分类型特征做目标编码或 one-hot。这里特别注意目标编码的时序泄漏问题如果先用全量数据计算类别均值再切分训练集和验证集验证集的信息就提前混入了训练过程。正确的做法是先切分数据再只在训练集上拟合编码器然后应用到验证集和测试集。缺失值的处理上我用的是简单的均值填充加一个“缺失指示位”。这个指示位在某些情况下会变成重要特征——比如缺失本身可能代表某种业务含义SHAP 后面也能帮你验证这一点。数据划分采用分层采样确保训练集、验证集、测试集中的正负样本比例与原始分布一致。我额外保留了一个“极小验证集”用于 NAS 搜索阶段大小约为完整验证集的 20%。因为搜索阶段需要几千次结构评估用完整验证集会浪费大量算力。3.2 网络架构搜索的完整实现与参数说明在这个项目中我基于一个开源的 AutoML 框架进行改造。搜索空间配置大致如下搜索空间类型基于 Cell 的 DARTS 风格候选操作3x3 卷积、5x5 卷积、3x3 深度可分离卷积、跳跃连接、最大池化、零操作Cell 数量4前 2/3 用于特征提取后 1/3 用于分类头初始通道数16搜索 epoch50优化器SGDmomentum0.9, weight_decay3e-4结构优化器Adamlr0.001关键配置的取舍逻辑初始通道数设得比较小是为了让搜索阶段可容纳更大的 batch_size提高结构评估的稳定性。如果通道数过大显存占用会飙升搜索速度明显下降而且小通道下的最优结构在大通道下通常依然有效——这是 DARTS 系列工作里被反复验证的一个性质。搜索过程中我会在每 5 个 epoch 记录一次当前最优结构的验证精度同时把搜索过程中的结构权重分布画出来观察是否存在“跳过连接主导”的退化现象。如果发现几乎所有 Cell 都在选择跳跃连接说明搜索空间或优化配置有问题需要检查是不是 skip connection 的权重初始化过大。搜索完成后得到的最终结构会被序列化成一份 JSON 描述文件里面记录了每个 Cell 内部节点之间的操作类型和连接方式。后续训练阶段直接读取这份描述文件重建完整的网络。3.3 Focal Loss 的封装与训练策略Focal Loss 的实现并不复杂关键点在于数值稳定性。我参考了 RetinaNet 里的官方实现风格先算交叉熵再算调制因子最后做组合。有一个细节容易被忽略在计算 (p_t) 时需要先将 logits 过 sigmoid如果直接对 softmax 输出做处理类别数大于 2 时代价会明显上升。我训练时用的损失函数是二分类的 Focal Loss所以 sigmoid 版本就够用了。如果后续要扩展到多分类需要把 sigmoid 替换成 softmax并且调制因子的计算要按类别分别处理。训练配置如下优化器AdamW初始学习率 1e-3权重衰减 5e-4学习率调度余弦退火最小学习率 1e-5Batch size64Epoch120早停patience15监控验证集的 F1 分数损失函数参数(\gamma2.0, \alpha0.3)训练时我额外做了一点在前 5 个 epoch 用标准交叉熵作为热身之后切换到 Focal Loss。原因是最开始的模型输出是完全随机的所有样本的 (p_t) 都很小Focal Loss 的调制因子几乎不起作用反而会因梯度异常导致收敛变慢。用交叉熵预热可以让模型先学到基本的特征分布再让 Focal Loss 去精调难样本。训练过程中我记录了每个 epoch 的训练损失、验证损失、精确率、召回率、F1 和 AUC。比较重要的观察是加入 Focal Loss 后验证损失曲线会出现一个“缓升”阶段这其实是模型在牺牲部分多数类精度来换取少数类召回的表现。如果此时看整体准确率指标可能是下降的所以一定要以 F1 或 AUC 作为早停依据而不能用准确率。3.4 SHAP 解释与可视化模型训练完成后我单独从训练集中随机抽取了 1000 条样本、从测试集中抽取了 500 条样本用于 SHAP 分析。为什么要单独抽样本而不是直接喂全量数据因为 KernelExplainer 的计算复杂度随样本数线性增长全量数据下等待时间过长而且 SHAP 值本身就是一种估计样本数足够多就能获得稳定结果。1000 条训练样本足以计算全局特征重要性500 条测试样本足以做局部解释案例展示。我做了以下几类分析全局特征重要性summary_plot按平均绝对 SHAP 值排序识别出对模型输出影响最大的特征单样本解释force_plot对测试集中随机抽取的正确分类和错误分类样本分别展示特征贡献特征依赖图dependence_plot选择的特征是全局重要性排名前三的特征观察它们与预测概率的关系交互效应分析通过 SHAP interaction values 查看特征两两之间的交互作用在依赖图上我发现了明显的非线性模式某个数值特征在小于某个阈值时对预测的影响是正向的超过阈值后影响转为负向。这种模式在传统特征重要性分析里是看不出来的但对写论文来说是非常有价值的发现。4. 训练评估与对照实验设计4.1 评估指标选择这类不平衡分类任务评估指标不能只看准确率。准确率在 50:1 的类别比下会存在严重误导——即使模型把所有样本都预测为多数类准确率也能达到 98%。所以我的核心指标确定为三个F1 Score、AUC、PR-AUC其中 PR-AUC 对不平衡数据更敏感能更细致地反映少数类的分类效果。此外我还记录了每个类别的精确率和召回率。对于多数类要求精确率高对于少数类要求召回率优先。这两个指标往往是对立的所以最终模型选择时会留意 F1 的平衡点。4.2 消融实验设计为了验证“NAS Focal Loss SHAP”这个组合中每个模块的有效性我设计了四组对照实验实验编号网络结构生成方式损失函数SHAP 解释目的A人工设计固定结构交叉熵无基线BNAS 搜索交叉熵无验证 NAS 有效性C人工设计固定结构Focal Loss无验证 Focal Loss 有效性DNAS 搜索Focal LossSHAP完整框架每组实验保持训练 epoch、优化器配置、数据划分完全一致唯一变量就是表格里列出的差异项。从实验结果看B 组相比 A 组在 F1 上大约提升了 4 到 6 个百分点说明 NAS 搜索到的结构确实优于人工设计的结构。C 组相比 A 组在少数类召回率上有明显提升但精确率略有下降。D 组相比所有对照组在综合指标上都最优说明两个模块的收益是可以叠加的。这种消融设计也是后续写论文时最稳妥的实验呈现方式。4.3 样本量与稳定性验证为了确保结果不是因为运气好碰出来的我做了多次重复实验。由于 NAS 搜索的随机性同一个搜索空间在不同随机种子下可能得到不同的最优结构。我设置了三个随机种子每个种子下运行完整流程然后对比三组结果的均值与方差。结果发现主要指标的标准差控制在可控范围内F1 的波动在 0.8% 以内AUC 的波动在 0.3% 以内。这说明框架的整体稳定性是可接受的最终报告中可以采用三组实验的平均值作为核心结果。另外还做了一个小规模的“数据量鲁棒性”实验将训练数据分别裁剪到 25%、50%、75%观察指标变化趋势。结果显示在 25% 数据量下NAS 搜索出的结构倾向于选择更多跳跃连接和更少卷积操作出现一定程度的“退化”说明数据量不足时搜索更容易过拟合。这个现象值得在论文的讨论部分写一笔。5. 常见问题与排查技巧实录5.1 NAS 搜索不收敛或结果退化怎么办这是整个流程里最容易让人心态崩的环节。搜索阶段输出的结构如果出现大量跳跃连接、几乎没有任何卷积操作基本可以判定搜索失败。我的排查顺序是这样的首先检查结构权重初始化尤其是跳跃连接的初始权重是否过大。跳跃连接在可微搜索里是天然的“捷径”如果初始权重就偏高梯度更新后它会迅速占据主导。解决办法是把跳跃连接的初始权重设置为其他操作的 0.5 倍甚至更低。其次检查搜索阶段的 batch size。如果 batch size 过小结构权重的梯度噪声会很大导致更新方向不稳定。我最后稳定在 batch size 128 进行搜索而训练阶段用的是 64两者是分开配置的。最后检查是否需要对结构权重做正则化。在搜索损失中加入 L2 结构正则能够有效抑制结构权重的极化现象但强度需要控制过大会导致所有操作权重趋同失去搜索意义。5.2 Focal Loss 训练不稳定的处理方法Focal Loss 在训练初期不稳定是一个普遍问题。我遇到的情况是损失值在前 10 个 epoch 内剧烈震荡AUC 也忽高忽低。检查后发现问题出在初始学习率上。Focal Loss 的梯度形态与交叉熵不同调制因子会放大部分样本的梯度因此初始学习率需要适当调低。我从默认的 1e-3 降到 5e-4 后震荡得到明显缓解。另一个方法是前面提到的“交叉熵热身”策略。前 5 个 epoch 用交叉熵之后切到 Focal Loss在这个过程中学习率可以保持不变。我也试过在切换损失函数的同时把学习率下降一个量级效果更平滑只是需要多调一组参数。如果训练后期发现 F1 不再提升可以尝试把 (\gamma) 降低 0.5 再训练几个 epoch有时会有意外收获。5.3 SHAP 计算过慢或内存占用过高KernelExplainer 在高维特征和大样本量下确实会遇到性能瓶颈。我遇到的特征维度大约 40 维5000 条样本跑了接近半小时内存占用也偏高。优化思路有两个方向。第一个是降维。先用树模型的特征重要性或简单的互信息法筛掉明显无关的特征把维度压到 30 以内。SHAP 本身的解释并不需要太多冗余特征因为 SHAP 的一大优势就是能剔除无关特征的影响。不过需要注意SHAP 值的可靠性依赖于输入特征如果把有交互效应的特征提前删掉后续解释会失真所以筛选时宁可多留不要少留。第二个是样本量控制。全局解释用 1000 个样本就足够了。如果你发现两次随机采样得到的 SHAP 特征重要性排序有明显差异说明样本量不够需要增多如果排序稳定就没有必要增加样本量。5.4 结构迁移到新数据集时的注意点NAS 搜出来的结构虽然是在一个数据集上得到的但它其实可以被迁移到类似的数据集上使用。我尝试过把针对不平衡数据集搜出来的结构迁移到另一个相似业务场景的数据集效果比从零搜索要差一些但比人工设计基线要好。有一点必须注意迁移时要把结构中的归一化层参数重新初始化并重新训练因为不同数据集的均值和方差差异会直接影响归一化层的有效性。另外如果新数据集的类别比与旧数据集差异很大建议对 Focal Loss 的 (\alpha) 重新做一次小范围搜索而不是沿用旧值。这类跨数据集的迁移能力如果写进论文可以作为“结构泛化性”论证的素材但需要做足实验不能拍脑袋下结论。6. 写作素材与论文呈现建议这套框架如果最终要写成论文有一些呈现上的建议。实验部分除了常规的指标对比表格建议把 NAS 搜索到的最优结构画成结构图用不同颜色区分不同类型的操作并用粗线表示被赋予较高权重的连接。这种图放在论文里非常直观比单纯贴一堆权重数字好得多。SHAP 的 summary_plot 通常放在模型分析部分dependence_plot 可以进一步展示单个特征的边际效应。这三张图加上消融实验表格基本上就是一篇方法类论文的核心支撑材料。描述创新点时可以强调“NAS 生成的结构在解释性上并不比人工设计差”这个结论。因为很多审稿人会质疑自动搜索的模型是黑盒而 SHAP 的分析恰好提供了一种量化证据来回应这个质疑。7. 最后的一些实操心得这套框架跑下来我最大的感受是创新点不一定需要凭空造轮子把成熟的方法按正确的逻辑组合起来并验证每一个模块的独立贡献本身就能形成一个扎实的工作。给准备复现的同学几个建议第一不要一开始就在完整数据集上跑 NAS先用一个小规模子集做流程验证确认各个模块之间的接口没有 bug再上全量数据。第二Focal Loss 的参数不要照搬论文一定要结合自己的数据分布调尤其是当多数类和少数类的相对比例变化时(\alpha) 的变化幅度会远超你的预期。第三SHAP 分析不是模型训完之后随便跑一下就行最好在建模任务开始前就想清楚“哪些特征可能有交互效应”这样后续分析会更有针对性。另外想单独提一句如果之后想把这套框架扩展到图像或文本数据NAS 部分的搜索空间需要换对应的操作集合Focal Loss 可以直接保留SHAP 则需要换成对应的图像/文本解释器。这个框架的方法论是可迁移的但具体实现里的每个组件都要跟着数据形态走。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门