分类模型何时该承认“不会“?用证据深度学习量化分类不确定性 分类模型何时该承认不会用证据深度学习量化分类不确定性【免费下载链接】annotated_deep_learning_paper_implementations‍ 60 Implementations/tutorials of deep learning papers with side-by-side notes ; including transformers (original, xl, switch, feedback, vit, ...), optimizers (adam, adabelief, sophia, ...), gans(cyclegan, stylegan2, ...), reinforcement learning (ppo, dqn), capsnet, distillation, ... 项目地址: https://gitcode.com/gh_mirrors/an/annotated_deep_learning_paper_implementations辅助阅片系统对着罕见病灶给出良性置信度99%——它并不知道自己在赌自动驾驶在雨雾里把限速牌认成120同样毫不心虚。在annotated_deep_learning_paper_implementations项目中证据深度学习Evidential Deep Learning正是为这类自信的误判而生的解法让模型在交出答案的同时如实告诉你它到底有多大把握。本文从模型为什么不敢认错讲起一步步带你给分类器装上一根不确定性探针。先承认一个残酷事实softmax 的高置信度不等于有把握别急着上方案我们得先看清问题出在哪。传统分类器最后几乎都压着一个 softmax 层它把网络输出硬生生压缩成一组总和为 1 的概率模型必须交卷——哪怕面对的是训练时从没见过的东西。这带来两个致命副作用。第一过度自信。softmax 只保证这些类别里谁相对更像并不保证我对它真有把握。把一张纯噪声图片丢给训练好的分类器它照样能输出 0.99 的信心。第二也是最要命的它分不清为什么没把握。同样是 0.8 的置信度可能代表这张图本来就模糊换谁来都难认也可能代表模型压根没见过这种类型。前者是数据自带的噪声偶然不确定性后者是模型知识的缺口认知不确定性。对下游系统来说这两种情况应采取的动作完全不同一个要再测一次一个要别乱动、找专家。softmax 给出的是相对自信而不是绝对把握。这正是证据深度学习要补上的那一块。换个玩法把单选交卷改成投票 可弃权 ✋想象你在组织一场诊断会诊。过去的规则是强制单选每位专家必须押一个答案还要表现得胸有成竹。证据深度学习把规则改成了投票加弃权专家可以给多个答案投支持票也可以明确投一票我说不准。把这个直觉搬进神经网络只需要三处改造最后一层不再输出概率而是输出证据e_k——一个非负数字表示数据对这个类别的支持强度。项目里用 ReLU 或 Softplus 把网络输出变成证据保证 e_k ≥ 0。把所有证据汇总成总支持度 S Σ(e_k 1)。每个类别的信念质量 b_k e_k / S全局的不确定性质量 u K / SK 是类别数。观察这个美妙的结果所有 b_k 加上 u 刚好等于 1。当证据整体趋近于零S 趋近于 Ku 趋近于 1——模型几乎把票全部投给了弃权这就是它在大声说我不知道。那么狄利克雷分布在哪它就是那个票箱把每个类别的票数 α_k e_k 1 装进去狄利克雷分布描述的不是某个答案一定对而是我对各类答案的把握程度整体长什么样。从这个分布取期望就得到每个类别的期望概率 p̂_k α_k / S分类时照旧取最大而 u 则告诉你要不要相信这个分类。更妙的是两类不确定性都被这个框架接住了模型没学好、没见过——证据整体偏少u 抬高数据本身模糊——证据在各类之间平均摊开概率分布变得扁平。一句话它既告诉你答案是啥也告诉你这答案几斤几两。三步接入证据深度学习模型给分类器装上不确定性信号 ️理论讲完上手其实比你想的简单。核心模块在labml_nn/uncertainty/evidence/目录下全程三步第一步把代码拿下来git clone https://gitcode.com/gh_mirrors/an/annotated_deep_learning_paper_implementations第二步动最后一层把模型末端的 softmax 换成 ReLU 或 Softplus让它输出非负的证据。模型骨架完全不用动——项目里跑 MNIST 的示例用的还是普通 LeNet。第三步换损失函数并训练从 evidence 模块里挑一个损失MaximumLikelihoodLoss、CrossEntropyBayesRisk 或 SquaredErrorBayesRisk再叠加 KLDivergenceLoss 做正则照常反向传播。项目自带的experiment.py已配好一套默认组合平方误差贝叶斯风险 Softplus跑通之后训练日志里除了准确率还会多出u.succ与u.fail两条曲线——它们分别统计预测正确和预测错误样本的不确定性分布。理想情况下这两条曲线会明显分开模型犯错时u 应该更高。新手最常问的四个问题 ❓Q要不要大改模型结构基本不用。MLP、CNN、Transformer 的骨架都能保留你只需要处理输出层把 softmax 换成 ReLU/Softplus 拿证据。证据深度学习是加装而非重造这是它好落地的重要原因。Q输出的 u 到底怎么读u K / S。u 越接近 1说明证据越单薄、模型越接近弃权u 越接近 0说明证据越扎实。分类看期望概率 p̂ 的最大值要不要相信则看 u。提醒一句u 和类别数 K 挂钩不同任务之间别直接比数值大小。Q和贝叶斯方法比好在哪里贝叶斯深度学习MC Dropout、变分推断那一类通常要多次前向采样或用近似推断推理开销和调参成本都不低。证据深度学习一次前向就同时给出预测和不确定性几乎不增加推理时间工程上更容易落地。代价是这个不确定性是主观逻辑框架下的度量而不是严格的后验概率——够用但别把它当成贝叶斯后验。Q我的 u 永远很低/很高怎么办按这个顺序排查证据转换用的是 ReLU 还是 SoftplusKL 正则系数是否从 0 开始退火一上来就给满模型会被压得什么都不敢信损失函数是否选得合适。避坑清单别让不确定性估计变成数字游戏 ️把代码跑通只是第一步下面这些坑几乎人人会踩别用固定阈值一刀切。u 的分布随数据集、类别数、任务难度变化没有普适的0.5 就是不确定。先用 TrackStatistics 统计出的u.succ/u.fail分布画出来再决定阈值放在哪。KL 正则别急着拉满。KLDivergenceLoss 会把分错样本的证据往零压系数要像退火一样从 0 慢慢涨到 1项目示例正是这么做的否则模型一开始就过度保守。三种损失各有脾气。max_likelihood 最直观cross_entropy_bayes_risk 会用到 digamma 函数squared_error_bayes_risk 把误差项和方差项拆成两半是项目默认。换数据集时最好都跑一遍看谁在校准曲线上表现更好。ReLU 与 Softplus 要对比着选。ReLU 会让部分类别证据严格为 0零支持Softplus 处处平滑可导、梯度更友好。两者对 u 分布的影响不小值得各试一轮。记住认知不确定性的边界。u 高只代表模型没见过不代表数据有问题。训练标签污染、类别不平衡都会把证据带歪让 u 失真。最后一定做校准验证。不确定性和真实错误率是否匹配要靠可靠性图来检验别只看 u 的曲线好不好看。谁最需要这个会认怂的分类器这项技术最有价值的场景恰恰是错误代价极高的地方医疗影像罕见病灶样本稀少模型没见过时主动报低把握、触发医生复核而不是硬给结论。自动驾驶雨雾、遮挡、陌生路段下感知模块把不确定性一并传给规划模块系统可以据此减速或请求接管。金融风控对偏离训练分布的申请给出低把握触发人工审核而不是让模型直接放行或拒绝。这三类场景有个共同点模型的价值不在于永远正确而在于知道自己可能不对。证据深度学习给出的正是这份自知之明。现在你手里已经有了证据、信念质量、狄利克雷这些词背后的直觉。下一步最好的老师是代码本身克隆仓库跑一遍 evidence_mnist 实验在日志里亲眼看着u.succ与u.fail两条曲线分开——那一刻你会真正理解让模型承认不确定究竟意味着什么。项目里docs/uncertainty/evidence/的文档页带着逐行注释从三种损失函数到退火调度都值得你亲手翻一遍。说到底深度学习不确定性估计这件事不是给模型添堵而是给它配上安全带——在它出错之前先让它学会喊停。【免费下载链接】annotated_deep_learning_paper_implementations‍ 60 Implementations/tutorials of deep learning papers with side-by-side notes ; including transformers (original, xl, switch, feedback, vit, ...), optimizers (adam, adabelief, sophia, ...), gans(cyclegan, stylegan2, ...), reinforcement learning (ppo, dqn), capsnet, distillation, ... 项目地址: https://gitcode.com/gh_mirrors/an/annotated_deep_learning_paper_implementations创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考