第 7 章 感知不确定性估计

在具身智能系统中,感知模块的输出并非绝对真理,而是受到传感器噪声、环境变化和模型局限性的影响。**不确定性估计(Uncertainty Quantification)**为智能体提供了"知道自己不知道什么"的元认知能力,这是实现安全决策、主动探索和故障恢复的关键前提。

7.1 不确定性的类型与来源

深度神经网络的不确定性可分解为两个根本不同的组成部分:偶然不确定性(Aleatoric Uncertainty)认知不确定性(Epistemic Uncertainty)

7.1.1 偶然不确定性(Aleatoric)

偶然不确定性源于数据本身的固有噪声,反映了任务本身的随机性或观测过程中的不可消除的随机因素。这种不确定性无法通过增加训练数据来消除,只能通过更精确的传感器或改进观测模型来降低。

7.1.1.1 观测噪声建模

在具身智能体的感知链中,观测噪声通常建模为条件概率分布 p(y \\mid x, \\theta)。对于回归任务,常假设为高斯分布:

p(y \\mid x, \\theta) = \\mathcal{N}(y; f_\\mu(x, \\theta), f_\\sigma(x, \\theta)\^2)

其中神经网络同时输出均值 f_\\mu 和方差 f_\\sigma,后者即对偶然不确定性的显式估计。通过最大化对数似然函数学习:

\\mathcal{L}(\\theta) = \\sum_{i} \\frac{1}{2\\sigma(x_i)\^2} \|\|y_i - f_\\mu(x_i)\|\|\^2 + \\frac{1}{2} \\log \\sigma(x_i)\^2

这种**异方差回归(Heteroscedastic Regression)**允许模型对不同输入赋予不同的噪声水平。在非高斯场景中(如多模态分布),可采用混合密度网络(MDN)或标准化流(Normalizing Flows)建模更复杂的偶然不确定性。

7.1.1.2 任务固有模糊性

某些任务本身具有固有的模糊性:

  • 视觉遮挡:物体部分被遮挡导致深度估计多解。

  • 反射与透明:玻璃、水面等材质引起的光路歧义。

  • 相似外观:不同类别物体具有相似视觉特征。

通过不确定性分离(Uncertainty Disentanglement),模型可识别这些区域并避免过度自信的决策。

7.1.2 认知不确定性(Epistemic)

认知不确定性反映模型参数的知识缺失,源于训练数据不足或分布偏移。与偶然不确定性不同,认知不确定性可通过收集更多数据、改进模型架构或增加训练时间来降低

7.1.2.1 模型不确定性

贝叶斯框架下,认知不确定性通过后验分布 p(\\theta \\mid \\mathcal{D}) 刻画。预测分布通过对参数空间积分获得:

p(y \\mid x, \\mathcal{D}) = \\int p(y \\mid x, \\theta) p(\\theta \\mid \\mathcal{D}) d\\theta

由于后验分布计算困难,通常采用变分推断近似 q(\\theta) \\approx p(\\theta \\mid \\mathcal{D}),预测方差分解为:

\\text{Var}(y) \\approx \\underbrace{\\mathbb{E}_{q(\\theta)}\[\\text{Var}(y \\mid x, \\theta)\]}_{\\text{Aleatoric}} + \\underbrace{\\text{Var}_{q(\\theta)}(\\mathbb{E}\[y \\mid x, \\theta\])}_{\\text{Epistemic}}

7.1.2.2 数据分布外检测(OOD)

认知不确定性的关键应用是分布外(Out-of-Distribution, OOD)检测。当输入远离训练分布时,模型应触发警报或保守策略。在自动驾驶中可识别:

  • 未见过的障碍物类型(如施工设备、动物)。

  • 恶劣天气条件(暴雪、浓雾导致的传感器失效)。

  • 对抗性攻击(故意设计的欺骗性输入)。

实验表明,**深度集成(Deep Ensembles)**在 OOD 检测中显著优于单点估计方法。


7.2 贝叶斯深度学习方法

7.2.1 变分推断(Variational Inference, VI)

通过优化变分分布 q(\\theta) 近似难以计算的后验 p(\\theta \\mid \\mathcal{D}),最小化 KL 散度:

q\^\*(\\theta) = \\arg\\min_q D_{KL}(q(\\theta) \|\| p(\\theta \\mid \\mathcal{D}))

7.2.1.1 贝叶斯神经网络(BNNs)

为每层权重引入先验分布(通常为标准高斯 \\mathcal{N}(0, I)),目标函数为证据下界(ELBO)

\\mathcal{L}_{VI} = \\mathbb{E}_{q(\\theta)}\[\\log p(\\mathcal{D} \\mid \\theta)\] - D_{KL}(q(\\theta) \|\| p(\\theta))

此外,**函数空间变分推断(Function-Space VI)**通过随机过程先验引入结构化不确定性,在医疗诊断等安全关键任务中表现更可靠。

7.2.1.2 变分 Dropout (MC Dropout)

蒙特卡洛 Dropout 提供了一种计算高效的近似贝叶斯推断方法。对于 T 次前向传播,预测均值和方差估计为:

\\hat{\\mu} = \\frac{1}{T} \\sum_{t=1}\^T f(x, \\theta_t)

\\hat{\\sigma}\^2 = \\frac{1}{T} \\sum_{t=1}\^T f(x, \\theta_t)\^2 - \\hat{\\mu}\^2 + \\frac{1}{T} \\sum_{t=1}\^T \\sigma\^2(x, \\theta_t)

其中第一项为认知不确定性,第二项为偶然不确定性。在自动驾驶测试中,MC Dropout 能有效提前数秒发出故障警报。

7.2.2 集成方法

7.2.2.1 深度集成(Deep Ensembles)

训练 M 个独立神经网络,将集成预测视为混合高斯分布:

\\mu\^\*(x) = \\frac{1}{M} \\sum_{i=1}\^M f_{\\theta_i}(x)

\\sigma\^{\*2}(x) = \\underbrace{\\frac{1}{M} \\sum_{i=1}\^M \\sigma_{\\theta_i}\^2(x)}_{\\text{Aleatoric}} + \\underbrace{\\frac{1}{M} \\sum_{i=1}\^M (f_{\\theta_i}(x) - \\mu\^\*(x))\^2}_{\\text{Epistemic}}

实验显示,仅使用 10 个模型的集成即可使 F_3 分数提升 25%-42%。

7.2.2.2 快照集成(Snapshot Ensembles)

通过周期性循环学习率 \\alpha(t) 使模型收敛到不同的局部极小值:

\\alpha(t) = \\frac{\\alpha_0}{2} \\left( \\cos \\left( \\frac{\\pi \\text{mod}(t-1, \\lceil T/M \\rceil)}{\\lceil T/M \\rceil} \\right) + 1 \\right)

每个周期结束时保存快照。**随机权重平均(SWA)**与 SWAG 进一步通过平均权重轨迹提供更高效的估计。


7.3 不确定性在决策中的应用

7.3.1 安全决策

7.3.1.1 风险敏感策略

在 POMDP 框架下,定义风险价值函数:

Q_{risk}(s, a) = \\mathbb{E}\[Q(s, a)\] - \\beta \\cdot \\text{Var}(Q(s, a))

其中 \\beta \> 0 为风险规避系数。高不确定性下,智能体选择减速、停车等保守动作。在扩散模型驱动的规划中,通过**扩散集成(Diffusion Ensembles)**量化轨迹预测方差。

7.3.1.2 保守探索

认知不确定性用于识别"知识空白"区域,优先探索高认知不确定性状态,同时避免在高偶然不确定性(已知危险)区域冒险。

7.3.2 主动学习(Active Learning)

7.3.2.1 不确定性采样

常用策略包括:

  • 最高熵(Maximum Entropy)x\^\* = \\arg\\max_x H(y \\mid x, \\theta)

  • BALD (Disagreement)\\text{BALD}(x) = H(y \\mid x, \\mathcal{D}) - \\mathbb{E}_{p(\\theta \\mid \\mathcal{D})}\[H(y \\mid x, \\theta)\]

    该策略优先选择能最大程度减少模型不确定性的样本(信息增益)。

7.3.2.2 信息增益最大化

考虑标注成本与模型改进的权衡,通过估计样本对参数分布的影响:

IG(x) = \\mathbb{E}_{y \\mid x, \\mathcal{D}} \[D_{KL}(p(\\theta \\mid \\mathcal{D} \\cup \\{(x, y)\\}) \|\| p(\\theta \\mid \\mathcal{D}))\]

在具身智能中,这可指导机器人选择模糊边界像素、遮挡严重的场景或视觉相似但语义不同的位置进行标注。

python实现

复制代码
import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np

class BayesianNN(nn.Module):
    """
    贝叶斯神经网络:使用变分Dropout实现
    支持不确定性分解(Aleatoric + Epistemic)
    """
    def __init__(self, input_dim, hidden_dim, output_dim, dropout_rate=0.1):
        super().__init__()
        self.fc1 = nn.Linear(input_dim, hidden_dim)
        self.fc2 = nn.Linear(hidden_dim, hidden_dim)
        self.fc_mu = nn.Linear(hidden_dim, output_dim)      # 预测均值
        self.fc_logvar = nn.Linear(hidden_dim, output_dim)  # 预测对数方差(Aleatoric)
        
        self.dropout_rate = dropout_rate
        
    def forward(self, x, sample_num=1):
        """
        前向传播,支持多次采样以估计不确定性
        """
        outputs = []
        logvars = []
        
        for _ in range(sample_num):
            # 应用Dropout(训练和推理都启用)
            h1 = F.dropout(F.relu(self.fc1(x)), p=self.dropout_rate, training=True)
            h2 = F.dropout(F.relu(self.fc2(h1)), p=self.dropout_rate, training=True)
            
            mu = self.fc_mu(h2)
            logvar = self.fc_logvar(h2)
            
            outputs.append(mu)
            logvars.append(logvar)
        
        outputs = torch.stack(outputs)  # (sample_num, batch, output_dim)
        logvars = torch.stack(logvars)
        
        return outputs, logvars
    
    def predict_uncertainty(self, x, sample_num=50):
        """
        预测并分解不确定性
        """
        outputs, logvars = self.forward(x, sample_num)
        
        # 预测均值(期望)
        pred_mean = outputs.mean(dim=0)
        
        # Epistemic Uncertainty(认知不确定性):模型预测的方差
        epistemic_var = outputs.var(dim=0)
        
        # Aleatoric Uncertainty(偶然不确定性):平均预测方差
        aleatoric_var = logvars.exp().mean(dim=0)
        
        # 总不确定性
        total_var = epistemic_var + aleatoric_var
        
        return {
            'mean': pred_mean,
            'epistemic': epistemic_var,
            'aleatoric': aleatoric_var,
            'total': total_var
        }

class DeepEnsemble(nn.Module):
    """
    深度集成:多模型集成估计不确定性
    """
    def __init__(self, input_dim, hidden_dim, output_dim, num_models=5):
        super().__init__()
        self.models = nn.ModuleList([
            BayesianNN(input_dim, hidden_dim, output_dim) 
            for _ in range(num_models)
        ])
        self.num_models = num_models
        
    def forward(self, x):
        predictions = []
        uncertainties = []
        
        for model in self.models:
            model.eval()
            with torch.no_grad():
                out = model.predict_uncertainty(x, sample_num=10)
                predictions.append(out['mean'])
                uncertainties.append(out['aleatoric'])
        
        predictions = torch.stack(predictions)
        
        # 集成预测均值
        ensemble_mean = predictions.mean(dim=0)
        
        # 集成Epistemic不确定性:模型间的分歧
        ensemble_epistemic = predictions.var(dim=0)
        
        # 集成Aleatoric不确定性:平均偶然不确定性
        ensemble_aleatoric = torch.stack(uncertainties).mean(dim=0)
        
        return {
            'mean': ensemble_mean,
            'epistemic': ensemble_epistemic,
            'aleatoric': ensemble_aleatoric,
            'total': ensemble_epistemic + ensemble_aleatoric,
            'models_std': predictions.std(dim=0)  # 模型间标准差
        }

# 主动学习:不确定性采样
def uncertainty_sampling(model, unlabeled_data, num_samples):
    """
    基于BALD的主动学习采样
    """
    uncertainties = []
    
    for x in unlabeled_data:
        with torch.no_grad():
            out = model.predict_uncertainty(x.unsqueeze(0))
            
            # 计算预测熵(分类任务)
            pred_probs = F.softmax(out['mean'], dim=-1)
            entropy = -(pred_probs * torch.log(pred_probs + 1e-10)).sum()
            
            # 计算期望条件熵
            epistemic = out['epistemic'].mean()
            
            # BALD ≈ 熵 - 期望条件熵
            bald = entropy - epistemic
            uncertainties.append(bald.item())
    
    # 选择BALD分数最高的样本
    indices = np.argsort(uncertainties)[-num_samples:]
    return indices

# 安全决策示例:风险敏感控制
def risk_sensitive_action_selection(q_values, uncertainties, beta=0.5):
    """
    风险敏感Q函数:Q_risk = E[Q] - beta * Var[Q]
    """
    risk_adjusted_q = q_values - beta * uncertainties
    safe_action = torch.argmax(risk_adjusted_q)
    return safe_action

# 使用示例
if __name__ == "__main__":
    # 创建模型
    model = DeepEnsemble(input_dim=10, hidden_dim=128, output_dim=5, num_models=10)
    
    # 模拟输入
    x = torch.randn(32, 10)  # batch_size=32
    
    # 预测与不确定性估计
    result = model(x)
    
    print(f"预测均值: {result['mean'].shape}")
    print(f"认知不确定性: {result['epistemic'].mean().item():.4f}")
    print(f"偶然不确定性: {result['aleatoric'].mean().item():.4f}")
    
    # OOD检测:基于认知不确定性阈值
    ood_threshold = 0.5
    is_ood = result['epistemic'] > ood_threshold
    print(f"检测到OOD样本数: {is_ood.sum().item()}")
相关推荐
沪漂阿龙2 小时前
从感知机到GPT:一个1957年的“神经元”如何引爆2026年的AI革命?
人工智能·gpt·机器学习
AI视觉网奇2 小时前
‘figurecanvasInteragg‘ object has no attribute ‘tostring_rgb‘
人工智能
fof9202 小时前
Base LLM | 从 NLP 到 LLM 的算法全栈教程 第七天
人工智能·深度学习
缘友一世2 小时前
当LLM Agent遇上真实渗透测试:从失败分类到难度感知规划的系统性突破
人工智能·渗透测试
躺柒2 小时前
读2025世界前沿技术发展报告32极地考察与开发
人工智能·北极·海洋工程·极地探索·海洋技术
2301_764441332 小时前
Dify工作流中实现查询优化(QO):将查询复杂度分类法与QOL框架融入工作流
人工智能·语言模型·自然语言处理·命令模式
oG99bh7CK2 小时前
高光谱成像基础(六)滤波匹配 MF
人工智能·算法·目标跟踪
永霖光电_UVLED2 小时前
生物技术公司 BiomX 进军国防市场,计划收购 DFSL
人工智能·架构·汽车
龙文浩_2 小时前
AI深度学习/PyTorch/反向传播与梯度下降
人工智能·pytorch·深度学习