人工智能02-深度学习中的不确定性测量

news2025/4/23 10:25:51

🔬 深度学习中的不确定性测量详解

Uncertainty Measurement in Deep Learning


🧠 一、什么是不确定性(Uncertainty)?

在深度学习中,不确定性是指模型对其预测结果的“信心程度”。一个模型不仅要输出预测,还要知道自己有多确定这个预测是对的。特别在如下任务中尤为重要:

  • 图像分类(Image Classification)

  • 图像分割(Semantic Segmentation)

  • 医疗影像分析、自动驾驶、金融风险评估等关键应用场景

简单理解:预测是“猫”的概率是 0.95,模型很有信心;如果是 0.51,那说明模型不太确定,存在不确定性。


🎯 二、不确定性的分类

不确定性主要分为以下三种类型:

1. Predictive Uncertainty(预测不确定性)

  • 指模型最终对预测结果整体的不确定性。

  • 是以下两种不确定性的叠加:

    Predictive Uncertainty=Aleatoric+Epistemic\text{Predictive Uncertainty} = \text{Aleatoric} + \text{Epistemic}

2. Aleatoric Uncertainty(数据不确定性)

  • 来源:输入数据中固有的噪声或模糊性

  • 示例:

    • 医学图像模糊不清,无法判断器官边界

    • 拍摄条件差,图像中信息不足

  • 特点:

    • 无法通过增加数据或改善模型来完全消除

    • 可以通过最大概率或**熵(entropy)**来度量


3. Epistemic Uncertainty(模型不确定性)

  • 来源:模型自身的未知性或知识盲区

  • 示例:

    • 模型训练集中从未见过某类输入

    • 模型容量不足或过拟合

  • 特点:

    • 可以通过增加训练数据、优化模型结构来减小

    • 常用MC Dropout预测方差(Predictive Variance) 来估算


📊 三、Aleatoric 不确定性测量方法


✅ 方法一:1 - Maximum Probability(1 - MP)

  • 模型的输出为一组类别概率 [p1,p2,...,pC][p_1, p_2, ..., p_C]

  • 最大概率值表示模型最信心的预测:

    pmax=max⁡(p1,...,pC)p_{\text{max}} = \max(p_1, ..., p_C)
  • 不确定性定义为:

    Uncertainty=1−pmax\text{Uncertainty} = 1 - p_{\text{max}}

🔎 理解:

  • 最大概率接近 1 → 模型很有信心 → 不确定性低

  • 最大概率接近 0.5 → 模型犹豫不决 → 不确定性高


✅ 方法二:熵(Entropy)

熵衡量整个概率分布的混乱程度:

H=−∑i=1Cpilog⁡(pi)H = - \sum_{i=1}^{C} p_i \log(p_i)

  • 如果模型集中在某个类别上(例如 [0.99, 0.005, 0.005]),熵很低 → 确信

  • 如果模型预测均衡(如 [0.33, 0.33, 0.34]),熵很高 → 很困惑

📈 最大熵出现在所有类别概率接近均匀分布的时候。


🧠 四、Epistemic 不确定性测量方法

Epistemic 不确定性是模型对自身的预测能力没有信心,尤其是面对未知输入或训练集覆盖不足时。


✅ 核心方法:MC Dropout + 多次预测 + 方差估计


✳️ 步骤解析:

Step 1:启用 Dropout
  • 正常测试阶段关闭 Dropout

  • 这里需要打开 Dropout以引入模型结构的随机性

在 PyTorch 中通过 model.train() 来启用 Dropout


Step 2:对同一个输入进行 N 次前向传播(Forward Passes)
  • 每次由于 Dropout 结构不同 → 预测结果略有差异

  • 得到 N 个概率预测集合:

    {pi1,pi2,...,piN}\{p_{i1}, p_{i2}, ..., p_{iN}\}

Step 3:计算预测方差(Predictive Variance)

对于第 ii 类别的概率,计算方差如下:

Var(pi)=1N∑k=1Npik2−(1N∑k=1Npik)2\text{Var}(p_i) = \frac{1}{N} \sum_{k=1}^{N} p_{ik}^2 - \left( \frac{1}{N} \sum_{k=1}^{N} p_{ik} \right)^2

  • 第一项:平方的平均值

  • 第二项:平均值的平方

方差越大 → 模型每次预测结果波动大 → 不确定性高


Step 4:所有类别平均 → 得到整体不确定性

Uncertainty=1C∑i=1CVar(pi)\text{Uncertainty} = \frac{1}{C} \sum_{i=1}^{C} \text{Var}(p_i)

最终得到每个输入样本的整体模型不确定性。


💻 五、代码实现(PyTorch)

def compute_epistemic_uncertainty(model, input_tensor, num_passes=20):
    model.train()  # 打开 Dropout
    softmax_outputs = []

    with torch.no_grad():
        for _ in range(num_passes):
            outputs = model(input_tensor)  # 模型输出 logits
            probs = F.softmax(outputs, dim=1)
            softmax_outputs.append(probs.unsqueeze(0))  # shape: [1, B, C]

    stacked = torch.cat(softmax_outputs, dim=0)  # shape: [N, B, C]
    mean_probs = stacked.mean(dim=0)             # shape: [B, C]
    var_probs = stacked.var(dim=0)               # shape: [B, C]
    epistemic_uncertainty = var_probs.mean(dim=1)  # shape: [B]
    return mean_probs, epistemic_uncertainty

🔁 六、Aleatoric 与 Epistemic 不确定性的对比

属性AleatoricEpistemic
来源数据噪声、模糊性模型对知识掌握不足
是否可被学习降低❌ 否✅ 是
常用方法1 - MP, 熵MC Dropout, 预测方差
举例图像模糊,听不清语音新类别输入、训练不足

🧪 七、实际案例与应用场景

应用场景推荐评估方法原因
医疗图像分类熵 + MC Dropout风险高、需可信预测
自动驾驶MC Dropout安全性极高需求
文本情感分析多分类概率分布解释性强
零样本学习MC Dropout检测 unseen 类别更有效

✅ 八、总复习:核心公式与重点记忆

Aleatoric:

  • 1 - MP:

    Uncertainty=1−max⁡(p1,...,pC)\text{Uncertainty} = 1 - \max(p_1, ..., p_C)
  • 熵:

    H=−∑pilog⁡(pi)H = - \sum p_i \log(p_i)

Epistemic:

  • 预测方差:

    Var(pi)=1N∑pik2−(1N∑pik)2\text{Var}(p_i) = \frac{1}{N} \sum p_{ik}^2 - \left( \frac{1}{N} \sum p_{ik} \right)^2
  • 总不确定性:

    Uncertainty=1C∑i=1CVar(pi)\text{Uncertainty} = \frac{1}{C} \sum_{i=1}^{C} \text{Var}(p_i)

📦 模型设置与优化配置

criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.0001)

✅ 解释:

  • nn.CrossEntropyLoss():用于多分类任务的损失函数,衡量模型预测与真实标签的差距。

  • optim.Adam(...):优化器,采用自适应学习率算法,能够有效更新模型参数。

  • lr=0.0001:设置较小学习率以确保训练稳定。


🎯 Practice 0: 混淆矩阵评估模型预测准确性

from sklearn.metrics import confusion_matrix

model.eval()
all_predictions = []
all_labels = []

with torch.no_grad():
    for images, labels in tqdm(test_loader, desc="Evaluating"):
        images, labels = images.to(device), labels.to(device)
        outputs = model(images)
        _, predicted = torch.max(outputs, 1)
        all_predictions.extend(predicted.cpu().numpy())
        all_labels.extend(labels.cpu().numpy())

conf_matrix = confusion_matrix(all_labels, all_predictions)
print("Confusion Matrix:")
print(conf_matrix)

✅ 分析:

  • 模型设为 eval 模式,关闭 Dropout、BatchNorm 训练特性。

  • 遍历测试集,记录预测结果与真实标签。

  • 使用 sklearn 生成 混淆矩阵,评估每类分类效果,发现模型在哪些类别上容易混淆。


🔎 Practice 1: 查看模型输出(logits & 概率)

model.eval()
for images, labels in test_loader:
    images, labels = images.to(device), labels.to(device)
    outputs = model(images)
    print(outputs.shape)
    print(outputs)
    probabilities = torch.softmax(outputs, dim=1)
    print(probabilities)
    break

✅ 分析:

  • 查看模型对一批样本的输出:

    • outputs 是 logits,未归一化的类别得分。

    • softmax(outputs) 转换为概率分布。

    • 每个样本的输出维度为 [num_classes],用于多分类预测。


📊 Practice 2: Aleatoric 不确定性评估 —— 最大概率法

# 1 - max probability
all_mp = []

with torch.no_grad():
    for images, labels in tqdm(test_loader, desc="Evaluating"):
        images, labels = images.to(device), labels.to(device)
        outputs = model(images)
        probabilities = torch.softmax(outputs, dim=1)
        max_prob, _ = torch.max(probabilities, dim=1)
        max_prob = 1 - max_prob
        all_mp.extend(max_prob.cpu().numpy())

all_mp = np.array(all_mp)
data_uncertainty = np.mean(all_mp)
print(f"Data Uncertainty: {data_uncertainty}")

✅ 分析:

  • 对每个样本,找出模型预测的最大类别概率 pmaxp_{\text{max}}。

  • 计算 1−pmax1 - p_{\text{max}} 作为不确定性得分。

  • 所有样本的平均值即为数据不确定性(Aleatoric)。


📈 Practice 3: Aleatoric 不确定性评估 —— 熵方法

# Entropy
all_entropy = []

with torch.no_grad():
    for images, labels in tqdm(test_loader, desc="Evaluating"):
        images, labels = images.to(device), labels.to(device)
        outputs = model(images)
        probabilities = torch.softmax(outputs, dim=1)
        entropy = -torch.sum(probabilities * torch.log(probabilities + 1e-8), dim=1)
        all_entropy.extend(entropy.cpu().numpy())

all_entropy = np.array(all_entropy)
data_uncertainty = np.mean(all_entropy)
print(f"Data Uncertainty: {data_uncertainty}")

✅ 分析:

  • 使用信息熵公式:

    H=−∑pilog⁡(pi)H = -\sum p_i \log(p_i)
  • 熵越大,模型越“困惑”;熵越小,模型越“自信”。

  • 这是更细腻的 Aleatoric 估计方法。


🎛️ Practice 4: 模型结构修改 —— 添加 Dropout(用于 Epistemic 不确定性)

model.fc2 = nn.Sequential(
    nn.Dropout(p=0.5),
    nn.Linear(in_features=84, out_features=10)
)

✅ 分析:

  • 替换输出层为 Dropout + Linear,用于支持 MC Dropout

  • Dropout 增加模型在推理时的随机性(前提是测试阶段强制开启 Dropout)。


🧩 Practice 5: 启用 Dropout 层(仅用于推理阶段)

def enable_dropout(model):
    """Function to enable dropout during inference."""
    for module in model.modules():
        if module.__class__.__name__.startswith('Dropout'):
            module.train()

✅ 分析:

  • 通常测试阶段 Dropout 是关闭的。

  • 为了做 MC Dropout,只开启 Dropout 层而不影响 BatchNorm 等其他模块。

  • 模拟“多个模型预测”,以计算 Epistemic 不确定性。


🔁 Practice 6: Epistemic Uncertainty via MC Dropout

model.eval()
enable_dropout(model)

num_mc_passes = 20
all_mean_probs = []
all_var_probs = []

with torch.no_grad():
    for images, labels in tqdm(test_loader, desc="MC Dropout Inference"):
        images = images.to(device)
        mc_probs = []

        for _ in range(num_mc_passes):
            outputs = model(images)
            probs = torch.softmax(outputs, dim=1)
            mc_probs.append(probs.unsqueeze(0))

        stacked_probs = torch.cat(mc_probs, dim=0)
        mean_probs = stacked_probs.mean(dim=0)
        var_probs = stacked_probs.var(dim=0)
        epistemic_uncertainty = var_probs.mean(dim=1)

        all_mean_probs.extend(mean_probs.cpu().numpy())
        all_var_probs.extend(epistemic_uncertainty.cpu().numpy())

all_mean_probs = np.array(all_mean_probs)
all_var_probs = np.array(all_var_probs)
mean_uncertainty = np.mean(all_var_probs)
print(f"Epistemic Uncertainty (average): {mean_uncertainty:.6f}")

✅ 分析:

  • 启用 Dropout,在推理阶段对每个样本预测多次。

  • 堆叠预测 → 计算每个类别的均值和方差。

  • 平均方差 = 样本的不确定性评分。

  • 全体样本平均值即为模型整体的 Epistemic 不确定性


🧠 结语:总结模型不确定性三种评估方式

方法类型特点
1 - Max ProbAleatoric快速、粗略估计
EntropyAleatoric更细腻,考虑整体分布
MC Dropout + 方差Epistemic测试阶段多次推理,评估模型知识盲区

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2340694.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【DeepSeek 学习推理】Llumnix: Dynamic Scheduling for Large Language Model Serving实验部分

6.1 实验设置 测试平台。我们使用阿里云上的16-GPU集群(包含4个GPU虚拟机,类型为ecs.gn7i-c32g1.32xlarge)。每台虚拟机配备4个NVIDIA A10(24 GB)GPU(通过PCI-e 4.0连接)、128个vCPU、752 GB内…

Kubernetes相关的名词解释kubeadm(19)

kubeadm是什么? kubeadm 是 Kubernetes 官方提供的一个用于快速部署和管理 Kubernetes 集群的命令行工具。它简化了集群的初始化、节点加入和升级过程,特别适合在生产环境或学习环境中快速搭建符合最佳实践的 Kubernetes 集群。 kubeadm 的定位 不是完整…

什么是负载均衡?NGINX是如何实现负载均衡的?

大家好,我是锋哥。今天分享关于【什么是负载均衡?NGINX是如何实现负载均衡的?】面试题。希望对大家有帮助; 什么是负载均衡?NGINX是如何实现负载均衡的? 1000道 互联网大厂Java工程师 精选面试题-Java资源…

基于Python(Django)+SQLite实现(Web)校园助手

校园助手 本校园助手采用 B/S 架构。并已将其部署到服务器上。在网址上输入 db.uplei.com 即可访问。 使用说明 可使用如下账号体验: 学生界面: 账号1:123 密码1:123 账户2:201805301348 密码2:1 # --------------…

从零开始搭建Django博客②--Django的服务器内容搭建

本文主要在Ubuntu环境上搭建,为便于研究理解,采用SSH连接在虚拟机里的ubuntu-24.04.2-desktop系统搭建,当涉及一些文件操作部分便于通过桌面化进行理解,通过Nginx代理绑定域名,对外发布。 此为从零开始搭建Django博客…

【读论文】HM-RAG:分层多智能体多模态检索增强生成

如何在多模态信息检索和生成中,通过协作式多智能体系统来处理复杂的多模态查询。传统的单代理RAG系统在处理需要跨异构数据生态系统进行协调推理的复杂查询时存在根本性限制:处理多种查询类型、数据格式异质性和检索任务目标的多样性;在视觉内容和文本内…

文件操作和IO(上)

绝对路径和相对路径 文件按照层级结构进行组织(类似于数据结构中的树型结构),将专门用来存放管理信息的特殊文件称为文件夹或目录。对于文件系统中文件的定位有两种方式,一种是绝对路径,另一种是相对路径。 绝对路径…

JavaFX深度实践:从零构建高级打地鼠游戏(含多物品与反馈机制)

大家好!经典的“打地鼠”游戏是许多人童年的回忆,也是学习 GUI 编程一个非常好的切入点。但仅仅是“地鼠出来就打”未免有些单调。今天,我们来点不一样的——用 JavaFX 打造一个高级版的打地鼠游戏!在这个版本中,洞里钻…

Python 简介与入门

目录 一、Python 初识 1、Python 的优势 2、Python 的特性 3、Python 的应用领域 二、Linux 环境中安装 Python 1、下载 Python3.11.6 2、安装依赖包 3、解压 Python 压缩包 4、安装 Python 5、编译及安装 6、建立软链接 7、测试 Python3 运行 8、设置国内 pip 更…

理解RAG第六部分:有效的检索优化

在RAG系统中,识别相关上下文的检索器组件的性能与语言模型在生成有效响应方面的性能同样重要,甚至更为重要。因此,一些改进RAG系统的努力将重点放在优化检索过程上。 从检索方面提高RAG系统性能的一些常见方法。通过实施高级检索技术&#x…

实训Day-2 流量分析与安全杂项

目录 实训Day-2-1流量分析实战 实训目的 实训任务1 SYN半链接攻击流量分析 实训任务2 SQL注入攻击流量分析一 实训任务3 SQL注入攻击流量分析二 实训任务4 Web入侵溯源一 实训任务5 Web入侵溯源二 ​编辑 实训Day-2-1安全杂项实战 实训目的 实训任务1 流量分析 FTP…

几种电气绝缘类型

1. 基本绝缘 1.1 绝缘等级 1.2 I类设备 2. 附加绝缘 3. 双重绝缘 4. 加强绝缘 5. 功能性绝缘 1. 基本绝缘 用于防止触及带电部件的初级保护,该防护是由绝缘材料完成的 基本绝缘的目的在于为防电击提供一个基本的保护,以避免触电的危险,不过此类绝缘只能保证正常状态下…

char32_t、char16_t、wchar_t 用于 c++ 语言里存储 unicode 编码的字符,给出它们的具体定义

&#xff08;1&#xff09; #include <iostream> #include <string>int main() { std::u16string s u"C11 引入 char16_t"; // 定义 UTF-16 字符串for (char16_t c : s) // 遍历输出每个 char16_t 的值std::cout << std::hex << (…

Java Set/List 知识点 Java面试 基础面试题

Java Set/List 知识点 Set与List区别 List 有序、值可重复,内部数据结构 Obejct[ ] 数组Set 无序、值不重复,内部数据结构 HashMap keyobject value固定new Object() ArrayList 有序存储元素允许元素重复&#xff0c;允许存储 null 值支持动态扩容非线程安全 HashSet、LinkedHa…

Oracle Database Resident Connection Pooling (DRCP) 白皮书阅读笔记

本文为“Extreme Oracle Database Connection Scalability with Database Resident Connection Pooling (DRCP)”的中文翻译加阅读笔记。觉得是重点的就用粗体表示了。 白皮书版本为March 2025, Version 3.3&#xff0c;副标题为&#xff1a;Optimizing Oracle Database resou…

FastAPI WebSocket 聊天应用详细教程

项目简介 这是一个基于 FastAPI 和 WebSocket 实现的实时聊天应用&#xff0c;支持一对一聊天、离线消息存储等功能。 技术栈 后端&#xff1a;FastAPI (Python)前端&#xff1a;HTML、JavaScript、CSS通信&#xff1a;WebSocket认证&#xff1a;简单的 token 认证 项目结构…

vue3+canvas裁剪框样式【前端】

目录 canvas绘制裁剪框&#xff1a;拖拽改变框的大小&#xff1a;圆圈样式&#xff1a;方块样式&#xff1a; canvas绘制裁剪框&#xff1a; // 绘制裁剪框 const drawCropRect (ctx: CanvasRenderingContext2D): void > {if (cropRect.value.width > 0 && crop…

软件功能测试和非功能测试有什么区别和联系?

软件测试是保障软件质量的核心环节&#xff0c;而软件功能测试和非功能测试作为测试领域的两大重要组成部分&#xff0c;承担着不同但又相互关联的职责。 软件功能测试指的是通过验证软件系统的各项功能是否按照需求规格说明书来正确实现&#xff0c;确保软件的功能和业务流程…

10_C++入门案例习题: 结构体案例

案例描述 学校正在做毕设项目&#xff0c;每名老师带领5个学生&#xff0c;总共有3名老师&#xff0c;需求如下 设计学生和老师的结构体&#xff0c;其中在老师的结构体中&#xff0c;有老师姓名和一个存放5名学生的数组作为成员 学生的成员有姓名、考试分数&#xff0c; 创建…

快速定位达梦缓存的执行计划并清理

开发告诉你一个sql慢&#xff0c;你想看看缓存中执行计划时&#xff0c;怎么精准快速定位&#xff1f; 可能一般人通过文本内容模糊搜索 select cache_item, substr(sqlstr,1,60)stmt from v$cachepln where sqlstr like %YOUR SQL STRING%; 搜出来的内容比较多&#xff0c;研…