当前位置: 首页 > news >正文

认知深度学习:基于信度函数的不确定性量化与随机集神经网络实践

1. 认知深度学习从“知道”到“知道不知道”的范式演进在自动驾驶汽车试图识别雨雾中模糊的物体或者医疗AI系统面对一张与训练集截然不同的病理影像时我们最希望模型做的不是给出一个高达99%的、但可能是错误的单一答案而是坦诚地说“这个情况我不确定需要人类专家介入。”这种“知道不知道”的能力正是当前人工智能尤其是深度学习在迈向安全、可靠部署过程中最缺失的一环。我们常说的模型“自信”在技术层面往往体现为softmax层输出的一个接近1.0的概率值。然而这种自信可能是虚假的。当模型遇到从未见过的数据分布Out-of-Distribution OoD、精心设计的对抗性扰动或者仅仅是带有噪声的输入时它依然可能“信心满满”地给出错误预测。这种过度自信的根源在于传统模型无法有效区分和量化两种本质不同的不确定性偶然不确定性和认知不确定性。偶然不确定性是数据本身固有的、不可消除的随机性比如传感器噪声或图像中物体的自然遮挡。而认知不确定性则源于模型知识的不足——训练数据有限、有偏差或者模型结构无法捕捉复杂模式。传统方法如贝叶斯神经网络或深度集成主要通过对参数或预测的分布进行建模来提供不确定性估计。但它们输出的仍然是一个单一的概率分布这个分布在面对完全未知的情况时往往无法充分表达“我不知道”这种认知状态。这就像问一个只学过猫狗分类的模型“这张图片是飞机吗”它被迫在“猫”和“狗”之间分配概率总和为1的置信度而无法表达“这既不是猫也不是狗”的根本性无知。因此我的研究核心即“认知人工智能”旨在推动模型从输出一个可能过度自信的“点估计”或“概率分布”转向输出一个能显式表达无知的、更丰富的数学对象。这需要借助随机集、信度函数等二阶不确定性理论。简单来说我们不再要求模型说“这是猫的概率是80%是狗的概率是20%”而是允许它说“我有70%的把握认为这是猫或狗中的一种但有30%的可能性它根本不属于我已知的任何类别。”这种表达方式为后续的安全决策如拒绝判断、请求人工复核提供了更可靠、更直观的依据。2. 核心原理拆解从概率分布到信度函数的跃迁要理解认知深度学习的核心我们需要暂时跳出熟悉的概率论框架。传统深度学习模型如CNN的最后一层通常使用softmax函数将神经网络的原始输出logits转换为一个在所有类别上的概率分布。这个分布满足概率公理每个类别的概率在0到1之间且所有类别概率之和为1。这个“和为1”的约束正是导致模型在陌生场景下被迫“硬着头皮”做出过度自信预测的数学根源。2.1 信度函数一种更灵活的不确定性语言信度函数理论也称为Dempster-Shafer理论提供了一种更通用的不确定性表达框架。在这个框架中基本单位不再是单个类别而是所有可能类别的子集称为“焦元”。模型可以为这些子集分配“质量”mass。举个例子假设一个三分类任务类别为{猫 狗 鸟}。一个信度函数的输出可能如下质量 0.6 分配给单元素集 {猫}质量 0.2 分配给集合 {猫 狗}质量 0.1 分配给集合 {狗 鸟}质量 0.1 分配给全集 {猫 狗 鸟}这里分配给{猫}的0.6表示模型有明确的证据支持“这是猫”分配给{猫 狗}的0.2表示证据支持“这是猫或狗但无法区分具体是哪一种”分配给全集的0.1则表示模型完全无知证据不指向任何特定子集。所有焦元的质量之和为1。从这个信度函数我们可以推导出两个关键概念信度对某个命题如“是猫”的最小支持程度。例如Belief(猫) 质量({猫}) 0.6。似真度对某个命题的最大可能支持程度。例如Plausibility(猫) 质量({猫}) 质量({猫 狗}) 质量({猫 狗 鸟}) 0.9。信度和似真度构成了一个概率区间[Belief, Plausibility]。对于“猫”这个类别其概率落在[0.6, 0.9]这个区间内。这个区间本身而非一个单一数值就是对认知不确定性的直接量化。区间越宽表示模型的不确定性越高。实操心得理解信度函数的关键在于摆脱“概率必须精确分配”的思维定式。信度函数允许将部分概率质量分配给“模糊”的集合如{猫狗}这正是在模型知识不完整时最合理的表达。在代码实现时神经网络的输出维度会从类别数C变为2^C所有可能子集的数量这显然是指数爆炸的。因此实际中需要通过“预算”技术只考虑一部分有意义的子集焦元这是工程实现的核心挑战和技巧所在。2.2 随机集神经网络将理论嵌入深度学习架构随机集神经网络是实现上述思想的具体架构。其核心创新在于对训练目标和输出表示的重新设计。1. 训练目标的转变从独热编码到信度编码传统分类使用独热编码作为监督信号对于“猫”的图片标签是[1, 0, 0]。RS-NN则使用信度函数作为监督信号。如何为每个训练样本构建这样的“软标签”这通过一个称为“预算”的预处理步骤完成。预算的目标是基于训练数据的特征空间结构自动为每个样本分配一个信度函数标签。具体步骤通常如下使用一个预训练的特征提取器如ResNet的倒数第二层获取所有训练样本的特征向量。对这些特征进行聚类如使用高斯混合模型GMM或层次聚类。每个聚类中心代表一个“原型”。对于一个给定样本根据其与各个聚类中心的距离计算它属于每个聚类的“隶属度”。将这些聚类映射回类别标签的集合。如果一个聚类主要包含“猫”和“狗”的样本那么这个聚类就对应焦元{猫 狗}。样本属于该聚类的隶属度就部分分配为这个焦元的质量。这样一个“猫”的图片其真实标签不再是一个僵硬的[1,0,0]而可能是一个如{猫: 0.7, {猫狗}: 0.2 {猫狗鸟}: 0.1}的信度函数。这更符合现实即使是清晰的猫图也可能与某些狗图在特征空间上接近。2. 损失函数的设计模型的训练目标是让网络预测的信度函数尽可能接近上述“预算”得到的信度函数标签。这通常通过最小化两者之间的差异来实现例如使用信度函数版本的交叉熵损失或直接最小化信度/似真度向量的均方误差。损失函数中通常会引入正则化项鼓励模型在证据不足时将质量分配给更大的集合即表达无知而不是强行分配给某个单点。3. 推理与决策在推理时RS-NN输出一个信度函数。为了做出最终分类决策我们需要从这个信度函数中提取一个点估计。最常用的方法是计算皮格尼斯蒂克概率。这是一种将信度函数转化为概率分布的方法其思想是将分配给每个集合的质量平均分摊给该集合内的所有元素。 对于之前的例子P(猫) 0.6 (来自{猫}) 0.2/2 (来自{猫狗}) 0.1/3 (来自{猫狗鸟}) 0.6 0.1 0.033 ≈ 0.733P(狗) 0 0.2/2 0.1/3 ≈ 0.133P(鸟) 0 0.1/3 ≈ 0.033 然后取概率最大的类别作为预测结果。同时我们可以计算这个概率分布的熵作为预测不确定性的一个标量度量。更重要的是我们可以直接观察信度函数输出的信度集宽度即似真度与信度之差这个区间宽度是认知不确定性的直接体现。3. 实战构建从零实现一个简易RS-NN理论可能有些抽象我们通过一个简化版的PyTorch实现来具体感受RS-NN的构建过程。这里我们以CIFAR-10数据集为例并使用一个简单的CNN作为骨干网络。3.1 环境准备与数据加载首先确保安装必要的库并准备好数据。import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import numpy as np from sklearn.mixture import GaussianMixture from scipy.special import softmax import itertools # 设备配置 device torch.device(cuda if torch.cuda.is_available() else cpu) # 数据预处理和加载 transform_train transforms.Compose([ transforms.RandomCrop(32, padding4), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), ]) transform_test transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), ]) trainset datasets.CIFAR10(root./data, trainTrue, downloadTrue, transformtransform_train) testset datasets.CIFAR10(root./data, trainFalse, downloadTrue, transformtransform_test) trainloader DataLoader(trainset, batch_size128, shuffleTrue, num_workers2) testloader DataLoader(testset, batch_size100, shuffleFalse, num_workers2)3.2 预算生成信度函数标签这是RS-NN训练前最关键的预处理步骤。我们需要为每个训练样本生成一个信度函数形式的软标签。def budget_belief_labels(trainset, n_classes10, n_components30, feature_dim512): 预算函数为训练集生成信度函数标签。 简化版使用预训练特征提取器GMM聚类来生成软标签。 实际论文中可能使用更复杂的层次聚类或图方法。 # 步骤1: 提取特征。这里为了简化我们使用一个预训练的ResNet18的倒数第二层。 # 在实际研究中你可能需要先训练或加载一个特征提取器。 print(Extracting features for budgeting...) # 假设我们有一个预训练的特征提取器 feature_extractor # all_features [] # all_labels [] # with torch.no_grad(): # for data, target in trainloader: # data, target data.to(device), target.to(device) # features feature_extractor(data) # 形状: [batch, feature_dim] # all_features.append(features.cpu().numpy()) # all_labels.append(target.cpu().numpy()) # all_features np.vstack(all_features) # [N, feature_dim] # all_labels np.hstack(all_labels) # [N] # 由于简化我们这里用一个随机生成的特征矩阵模拟。实际应用必须替换。 num_samples len(trainset) all_features np.random.randn(num_samples, feature_dim) # 模拟特征 all_labels np.array([trainset[i][1] for i in range(num_samples)]) # 步骤2: 使用高斯混合模型(GMM)对特征空间进行聚类 print(Fitting GMM for clustering...) gmm GaussianMixture(n_componentsn_components, covariance_typediag, random_state42) gmm.fit(all_features) cluster_probs gmm.predict_proba(all_features) # [N, n_components] 样本属于每个聚类的概率 # 步骤3: 将每个聚类映射到类别集合焦元 # 计算每个聚类中各类别样本的占比 cluster_class_distribution np.zeros((n_components, n_classes)) for i in range(n_components): # 获取属于聚类i的样本的标签 weights cluster_probs[:, i] # 样本属于聚类i的概率作为权重 for c in range(n_classes): # 加权计算聚类i中类别c的“质量” cluster_class_distribution[i, c] np.sum(weights * (all_labels c)) # 归一化使每个聚类的类别分布和为1 if cluster_class_distribution[i].sum() 0: cluster_class_distribution[i] / cluster_class_distribution[i].sum() # 定义焦元这里简化只考虑单点集和最大的两个集合基于类内相似性。 # 实际论文中会通过阈值或层次聚类自动确定焦元。 focal_sets [] # 添加所有单点集 for c in range(n_classes): focal_sets.append(frozenset([c])) # 添加一些双点集示例例如根据CIFAR-10语义猫 vs 狗 车 vs 卡车 semantic_pairs [(3, 5), (1, 9), (2, 4), (7, 8)] # 示例猫(3)-狗(5) 鸟(2)-鹿(4)等 for c1, c2 in semantic_pairs: focal_sets.append(frozenset([c1, c2])) # 添加全集表示完全无知 focal_sets.append(frozenset(range(n_classes))) K len(focal_sets) # 焦元数量 print(fDefined {K} focal sets.) # 步骤4: 为每个样本计算属于每个焦元的质量 # 一个样本属于一个焦元的质量等于它属于那些“主导类别在该焦元内”的聚类的概率之和。 belief_labels np.zeros((num_samples, K)) for idx, sample_feat in enumerate(all_features): # 样本属于各聚类的概率 [n_components] sample_cluster_probs cluster_probs[idx] for k, focal_set in enumerate(focal_sets): mass 0.0 for comp_idx in range(n_components): # 检查聚类comp_idx的“主导类别”是否在焦元focal_set内 # 这里简化取该聚类分布中概率最大的类别作为主导类别 dominant_class np.argmax(cluster_class_distribution[comp_idx]) if dominant_class in focal_set: # 如果主导类别在焦元内则将该聚类概率的一部分加入质量 # 更精细的做法可以按类别比例分配 mass sample_cluster_probs[comp_idx] * (cluster_class_distribution[comp_idx, dominant_class]) belief_labels[idx, k] mass # 归一化使该样本的所有焦元质量和为1 belief_labels[idx] / belief_labels[idx].sum() 1e-10 # 将numpy数组转换为PyTorch张量并创建信度标签数据集 from torch.utils.data import TensorDataset belief_labels_tensor torch.FloatTensor(belief_labels) # 注意我们需要重新包装数据集将原始图像和信度标签对应起来 # 这里简化处理实际需要重构数据加载器 # 我们返回一个映射关系样本索引 - 信度标签 return belief_labels_tensor, focal_sets # 执行预算在实际运行中这会比较耗时 belief_labels_tensor, focal_sets budget_belief_labels(trainset) print(fFocal sets: {focal_sets}) print(fBelief labels shape: {belief_labels_tensor.shape})注意事项预算过程是RS-NN性能的关键。上述简化版仅用于演示原理。在实际研究中预算算法需要精心设计以确保生成的焦元具有语义意义如{猫狗}、{汽车卡车}并且质量分配能准确反映特征空间的局部结构。低质量的预算会导致模型学习到无义的信度模式。一个常见的技巧是使用层次聚类来自动发现数据中自然形成的类别分组并将其作为焦元。3.3 网络架构设计RS-NN的网络架构与传统CNN的主要区别在于最后一层。传统CNN输出C个logitsC为类别数然后通过softmax得到概率分布。RS-NN需要输出K个值K为焦元数量然后通过softmax或其他归一化函数如softplus后归一化得到分配给每个焦元的质量。class SimpleCNN(nn.Module): def __init__(self, num_focal_sets): super(SimpleCNN, self).__init__() # 一个简单的CNN骨干 self.conv1 nn.Conv2d(3, 32, kernel_size3, padding1) self.conv2 nn.Conv2d(32, 64, kernel_size3, padding1) self.pool nn.MaxPool2d(2, 2) self.dropout nn.Dropout(0.25) self.fc1 nn.Linear(64 * 8 * 8, 256) # CIFAR-10经过两次池化后是8x8 self.fc2 nn.Linear(256, num_focal_sets) # 关键输出维度 焦元数K def forward(self, x): x self.pool(F.relu(self.conv1(x))) x self.pool(F.relu(self.conv2(x))) x torch.flatten(x, 1) x F.relu(self.fc1(x)) x self.dropout(x) x self.fc2(x) # 输出K个logits return x class RSNetwork(nn.Module): def __init__(self, backbone, focal_sets): super(RSNetwork, self).__init__() self.backbone backbone self.focal_sets focal_sets self.num_classes max([max(fs) for fs in focal_sets if fs]) 1 # 从焦元推断类别数 def forward(self, x): focal_logits self.backbone(x) # [batch, K] # 使用softmax将logits转换为质量函数m(A) mass F.softmax(focal_logits, dim-1) # [batch, K] return mass def predict_pignistic(self, mass): 根据质量函数计算皮格尼斯蒂克概率分布。 mass: [batch, K] 或 [K] if mass.dim() 1: mass mass.unsqueeze(0) batch_size mass.shape[0] pignistic torch.zeros(batch_size, self.num_classes).to(mass.device) for k, focal_set in enumerate(self.focal_sets): if len(focal_set) 0: for cls in focal_set: pignistic[:, cls] mass[:, k] / len(focal_set) return pignistic # [batch, C] def predict_credal_width(self, mass): 计算每个类别的信度集宽度似真度 - 信度。 mass: [batch, K] batch_size, _ mass.shape belief torch.zeros(batch_size, self.num_classes).to(mass.device) plausibility torch.zeros(batch_size, self.num_classes).to(mass.device) for k, focal_set in enumerate(self.focal_sets): mass_k mass[:, k].unsqueeze(1) # [batch, 1] for cls in range(self.num_classes): # 信度质量分配给的子集必须是该类子的子集 if cls in focal_set and focal_set.issubset({cls}): # 单点集{cls} belief[:, cls] mass_k.squeeze() # 似真度质量分配给的子集与该类别有交集 if cls in focal_set: plausibility[:, cls] mass_k.squeeze() width plausibility - belief return width # [batch, C]3.4 损失函数与训练循环损失函数需要衡量预测的质量函数与预算得到的真实质量函数之间的差异。一个直接的选择是分类任务中常用的交叉熵损失但这里是在焦元空间上。def belief_loss(pred_mass, true_mass, alpha1e-3, beta1e-3): 信度损失函数。 pred_mass: 模型预测的质量 [batch, K] true_mass: 预算得到的真实质量 [batch, K] alpha, beta: 正则化超参数鼓励模型在不确定时将质量分配给更大的集合。 # 主损失预测质量与真实质量之间的KL散度或交叉熵 main_loss F.kl_div(F.log_softmax(pred_mass, dim-1), true_mass, reductionbatchmean) # 正则化项1鼓励对单点集的质量不要过高避免过度自信 # 假设focal_sets中前C个是单点集 singleton_mass pred_mass[:, :10].sum(dim1).mean() # 示例假设前10个是单点集 reg_singleton alpha * singleton_mass # 正则化项2鼓励对全集最后一个焦元分配一定质量保留无知能力 # 假设最后一个焦元是全集 ignorance_mass pred_mass[:, -1].mean() reg_ignorance -beta * ignorance_mass # 负号是因为我们希望鼓励它所以减去 total_loss main_loss reg_singleton reg_ignorance return total_loss, main_loss, reg_singleton, reg_ignorance # 初始化模型、优化器 num_focal_sets len(focal_sets) backbone SimpleCNN(num_focal_sets) model RSNetwork(backbone, focal_sets).to(device) optimizer optim.Adam(model.parameters(), lr0.001) scheduler optim.lr_scheduler.StepLR(optimizer, step_size30, gamma0.1) # 训练循环简化版需要将信度标签与图像数据配对加载 def train(epoch): model.train() running_loss 0.0 for batch_idx, (data, target) in enumerate(trainloader): # 注意这里target是原始类别标签我们需要的是信度标签。 # 在实际训练中需要创建一个新的DataLoader能同时加载图像和对应的belief_labels_tensor。 # 此处为演示我们跳过数据配对细节假设data和对应的belief_label已准备好。 # data, belief_label data.to(device), belief_label.to(device) # optimizer.zero_grad() # mass_pred model(data) # loss, main_loss, reg1, reg2 belief_loss(mass_pred, belief_label) # loss.backward() # optimizer.step() # running_loss loss.item() pass # scheduler.step() print(fEpoch {epoch}, Loss: {running_loss/len(trainloader)})3.5 推理与不确定性评估训练完成后我们可以使用模型进行预测并观察其不确定性量化能力。def evaluate(model, testloader, ood_loaderNone): model.eval() correct 0 total 0 entropy_list [] width_list [] with torch.no_grad(): for data, target in testloader: data, target data.to(device), target.to(device) mass model(data) # [batch, K] pignistic model.predict_pignistic(mass) # [batch, C] credal_width model.predict_credal_width(mass) # [batch, C] # 预测类别 _, predicted torch.max(pignistic, 1) total target.size(0) correct (predicted target).sum().item() # 计算预测分布的熵偶然认知不确定性 entropy -torch.sum(pignistic * torch.log(pignistic 1e-10), dim1) # [batch] entropy_list.extend(entropy.cpu().numpy()) # 计算平均信度集宽度认知不确定性的直接度量 avg_width credal_width.mean(dim1) # [batch] width_list.extend(avg_width.cpu().numpy()) accuracy 100 * correct / total avg_entropy np.mean(entropy_list) avg_width np.mean(width_list) print(fTest Accuracy: {accuracy:.2f}%) print(fAverage Predictive Entropy: {avg_entropy:.4f}) print(fAverage Credal Set Width: {avg_width:.4f}) # OoD检测评估如果提供了OoD数据 if ood_loader: # 计算在ID和OoD数据上的熵分布然后计算AUROC # 通常OoD样本应有更高的熵/信度集宽度 id_entropies np.array(entropy_list) ood_entropies [] for data, _ in ood_loader: data data.to(device) mass model(data) pignistic model.predict_pignistic(mass) entropy -torch.sum(pignistic * torch.log(pignistic 1e-10), dim1) ood_entropies.extend(entropy.cpu().numpy()) ood_entropies np.array(ood_entropies) # 这里省略AUROC计算代码可使用sklearn.metrics.roc_auc_score # labels np.concatenate([np.zeros_like(id_entropies), np.ones_like(ood_entropies)]) # scores np.concatenate([-id_entropies, -ood_entropies]) # 用负熵因为OoD熵高 # auroc roc_auc_score(labels, scores) # print(fOoD Detection AUROC (using entropy): {auroc:.4f}) return accuracy, avg_entropy, avg_width4. 效果验证与对比分析RS-NN的优势何在为了验证RS-NN的有效性我们需要将其与基线模型在多个维度进行对比。以下是基于原论文实验和我个人复现经验的总结。4.1 准确性、校准与效率在标准测试集如CIFAR-10上一个设计良好的RS-NN的分类准确率应该与同结构的传统CNN相当或略低1-2%以内因为它的学习目标更复杂学习信度函数。关键在于预期校准误差。ECE衡量模型预测置信度与真实准确率之间的匹配程度。理想情况下一个预测置信度为80%的样本组其真实准确率应接近80%。传统CNN往往过于自信ECE较高。RS-NN通过输出概率区间信度集其点估计皮格尼斯蒂克概率通常校准得更好。训练与推理时间RS-NN的主要开销在预算阶段离线进行一次性的和网络前向传播输出维度K可能大于类别数C。训练时间由于损失函数更复杂会略有增加。推理时间相比原CNN有轻微上升但远低于需要多次采样的贝叶斯方法或需要运行多个模型的深度集成。4.2 分布外检测能力这是RS-NN的强项。我们将CIFAR-10训练的模型在SVHN街景门牌号或ImageNet子集如Intel Image数据集上进行测试。评估指标是AUROC和AUPRC即模型能否根据其不确定性分数如预测熵、信度集宽度将ID样本和OoD样本分开。实验结果通常显示传统CNN在OoD数据上其softmax输出的“最大概率”依然可能很高熵很低无法有效区分。贝叶斯方法如MC Dropout通过多次采样计算预测方差对OoD更敏感但计算成本高。深度集成效果较好但需要训练和存储多个模型。RS-NN其信度集宽度在OoD样本上会显著增大皮格尼斯蒂克概率的熵也更高。在AUROC/AUPRC指标上RS-NN常能达到与深度集成相当甚至更好的性能同时模型更轻量。4.3 对抗鲁棒性使用FGSM或PGD等方法生成对抗样本。观察模型在对抗攻击下的准确率下降程度以及其不确定性是否同步升高。关键发现传统CNN在对抗样本上准确率骤降但其输出的置信度依然可能很高“自信的错误”。RS-NN在对抗样本上的表现是1) 准确率下降幅度可能更小得益于其更鲁棒的表征2) 更重要的是它对对抗样本预测的信度集宽度会显著增加熵值升高。这意味着模型“意识到”输入有问题发出了高不确定性信号。这对于安全系统至关重要因为一个能“报警”的失败比一个“沉默的失败”要好得多。4.4 噪声与旋转鲁棒性在测试图像中加入高斯噪声或进行随机旋转。RS-NN对于这类分布变化的敏感性也体现在其不确定性度量的增加上而分类准确率的下降可能比传统CNN更平缓。4.5 超参数影响与消融实验预算中焦元的选择焦元的设计至关重要。仅使用单点集会退化为传统模型。加入过多、过大的集合如过大的双点集、三点集可能会使模型过于“懒惰”总是输出宽区间。需要通过验证集性能如OoD检测的AUROC来选择有意义的焦元集合。原论文中使用层次聚类来自动发现语义相关的类别组是一个好方法。损失函数中的正则化系数α和βα控制对单点集的惩罚β控制对全集的鼓励。α太大可能导致模型拒绝做出任何明确预测β太大可能导致模型总是倾向于表达无知。需要精细调参。骨干网络RS-NN的思想可以嫁接在任何骨干网络上CNN ResNet ViT BERT LLM。实验表明随着骨干网络能力增强RS-NN的性能提升更明显。避坑指南在初次实现RS-NN时最常见的失败模式是模型学不到有意义的信度分配所有样本的质量都集中在全集上输出完全无知。这通常是因为1) 预算过程不合理生成的软标签噪声太大2) 损失函数中鼓励无知的正则项β过强3) 网络容量不足或训练不充分。调试时建议先可视化一批样本的预测质量分布检查是否与预期清晰样本质量集中在单点集模糊样本质量分布在较大集合相符。5. 统一评估框架如何公平比较不同的不确定性量化方法不同的不确定性量化方法输出形式各异贝叶斯网络输出概率分布样本集成方法输出多个预测的分布RS-NN输出信度函数证据深度学习输出狄利克雷分布参数。这使得直接比较它们的不确定性估计好坏变得困难。原论文提出的统一评估框架旨在解决这个问题。核心思想将所有模型的不确定性输出统一映射到信度集这一公共表示上。然后定义一个评估指标E该指标是两个部分的加权和距离预测的信度集与真实标签一个单点分布之间的距离。距离越小预测越准确。非特异性信度集的大小体积或宽度。非特异性越小预测越精确。指标公式可简化为E λ * 距离 (1 - λ) * 非特异性。其中λ是权衡参数取决于应用场景。在安全关键场景如医疗我们可能更看重低距离高准确率λ接近1在需要模型诚实表达无知的场景如自动驾驶遇到未知物体我们可能允许距离稍大但要求非特异性在不确定时必须增大λ接近0。具体操作对于贝叶斯模型其多次采样得到的概率向量集合可以计算其凸包这个凸包就是一个信度集所有可能概率分布的集合。对于深度集成每个成员模型的预测构成一个概率向量集合同样计算凸包。对于RS-NN其信度函数天然对应一个信度集所有与信度/似真度约束一致的概率分布集合。然后计算这个信度集到真实标签点的平均距离如KL散度、欧氏距离以及信度集的体积非特异性。这个框架的好处是提供了一个与模型无关的“标尺”。我们可以客观地说在某个λ取值下模型A的综合表现准确性与不确定性表达的平衡优于模型B。这为模型选择提供了更全面的依据而不仅仅是看准确率或AUROC。6. 扩展与应用从图像到文本从研究到落地6.1 随机集大语言模型将RS-NN的思想扩展到LLM是自然而然的。在文本生成中每个时间步预测下一个词的概率分布。RS-LLM预测下一个词的信度函数。例如在生成“The capital of France is ___”时传统LLM会给“Paris”很高的概率。RS-LLM可能会给{Paris}分配高质量但也可能给{Paris, Lyon, Marseille}这个集合分配一些质量如果上下文模糊比如有歧义。更重要的是当被问到训练数据之外的事实“The capital of Mars is ___”时理想的RS-LLM应该将大部分质量分配给大的集合如所有城市名的集合甚至全集词汇表从而表现出高不确定性而不是像当前LLM那样“一本正经地胡说八道”幻觉。技术实现上需要对LLM的词汇表进行“预算”形成有语义关联的词组作为焦元如通过词嵌入聚类并修改损失函数。初步实验表明RS-LLM能在保持回答质量的同时对自身不知道的问题给出更高的不确定性信号。6.2 在自动驾驶中的应用天气与锥桶分类这是一个非常贴切的落地场景。自动驾驶车辆需要识别天气晴、雨、、雪和锥桶颜色/类型。挑战在于数据有限难以收集所有极端天气条件下的充足数据。域适应在一个数据集如模拟器上训练的模型需要在真实世界数据上工作。安全关键错误识别可能导致事故。在该研究中使用RS-NN进行天气分类。当遇到训练集中未见的极端天气如沙尘暴时传统CNN可能错误地将其分类为“雾”或“雪”并给出高置信度。而RS-NN则会表现出很高的信度集宽度和熵系统可以据此触发降级策略如降低车速、请求人类接管。实验证实在跨域测试中RS-NN在保持可接受准确率的同时其不确定性指标对域偏移的敏感度远高于传统模型。7. 总结与展望认知AI的未来认知深度学习的核心价值在于将模型的“自知之明”从一种理想转化为可计算、可优化的工程属性。通过随机集和信度函数我们为模型提供了一种数学语言使其能够区分“我知道这是猫”和“我觉得这可能是猫或狗但我不确定”。从我个人的复现和实验经验来看这条路充满挑战但也极具前景。最大的挑战在于可扩展性和效率。对于有C个类别的任务理论上焦元数量是2^C这不可行。因此如何智能地、自适应地学习或选择一小部分有意义的焦元是未来研究的关键。另一个挑战是评估。虽然有了统一的评估框架但如何为不同的下游任务医疗诊断 vs. 内容推荐设定合理的权衡参数λ仍需领域知识。未来的方向可能包括动态焦元学习让模型在训练或推理过程中根据输入数据动态决定使用哪些焦元而不是固定预设。与因果推理结合将认知不确定性建模与因果发现结合区分由于混淆变量引起的不确定性和真正的机制性无知。更高效的推理算法开发近似算法在保持性能的同时降低RS-NN的计算开销。大规模预训练模型的认知化将RS思想注入如GPT、CLIP等大模型构建具有“自知之明”的基础模型。最终让机器学习模型“知其所不知”不仅是提升其可靠性的技术手段更是迈向更稳健、更可信、更可合作的人工智能系统的必经之路。当模型能够诚实地说“我不知道”时我们才能真正放心地将决策权部分移交构建起人机协同的智能新范式。
http://www.gsyq.cn/news/1376465.html

相关文章:

  • 告别 TeamViewer:用这款免费卸载工具(如 Geek Uninstaller)一键清理所有痕迹,附手动检查清单
  • 别再死磕SRanipaRuntime了!用Unity 2021.3 + OpenXR插件搞定Vive Pro Eye眼动数据采集(附避坑指南)
  • 从Windows/Ubuntu到麒麟V10:给双系统玩家的分区避坑指南(附ESP/SYSBOOT详解)
  • 告别虚拟机!在WSL2上直接运行Unity打包的Linux游戏(Ubuntu 22.04实测)
  • 在Ubuntu 20.04上从源码编译Spconv 1.2.1:一份给点云感知开发者的避坑指南
  • Hitboxer:3步解决游戏按键冲突,让你的操作精准度提升300%
  • OpenSSH KEXINIT竞态漏洞原理与分层缓解实战
  • 【题单】海亮
  • Unity与Android Studio协同开发实战指南
  • 零代码也能做游戏?用Construct3半小时复刻经典《打砖块》
  • 2026年星火征途 Python编程(小学组4-6年级)模拟卷(二)答案
  • 集成学习在医疗诊断中的应用:基于MIMIC-III的脑膜炎早期预警模型构建
  • 从物理建模到游戏引擎:第一类曲面积分中的‘面积微元’在Unity/Blender中是怎么用的?
  • Unity UI布局避坑指南:搞懂LayoutGroup那三个勾选框,你的滚动列表就成功了一半
  • QQ音乐格式解密:QMCDecode让你轻松解锁加密音乐文件
  • Godot 4.x + C# + VSCode:新手避坑全指南,从环境搭建到第一个脚本运行
  • UE5 Mass框架实战:手把手教你用ECS架构搭建一个简单的AI人群系统
  • 如何让Windows 11真正“吃上“安卓应用?探索WSA的跨平台融合之路
  • 如何快速解决视频字幕不同步问题:video-subtitle-extractor终极指南
  • Unity项目从Built-in到URP渲染管线升级保姆级教程(含粉色材质修复)
  • 2026年亲测|7款必备降AI率工具推荐,论文快速过AI检测不踩坑 - 降AI实验室
  • UE动画师避坑指南:状态机(State Machine)乱成一团麻?试试这3个整理技巧和最佳实践
  • 实时机器学习中的可扩展差分隐私:分层聚合与自适应噪声调度实践
  • 如何一键备份QQ空间所有历史说说?GetQzonehistory完整指南
  • TrueAsync Server 为 PHP 带来了原生的高性能 HTTP 服务器
  • 三步免费获取百度网盘真实下载链接,告别限速烦恼的完整指南
  • Microsoft Agent Framework —— CodeAct:Agent写代码,沙箱执行
  • 机器学习加速宇宙学参数估计:神经网络与贝叶斯方法对比
  • Unity UI零运行时适配:基于Viewport锚点与自定义Shader的生产级方案
  • 机器学习加速辐照材料缺陷预测:从团簇动力学到神经网络代理模型