
多智能体交互中一个核心难题是你无法直接读取对方的意图只能通过它执行出来的动作去反推。更麻烦的是动作背后常常带着执行噪声——机器人关节抖动、人类手指误触、策略网络输出被环境扰动这些都会让“实际动作”偏离“本来意图”。此时如果还要在类似囚徒困境、公共品博弈这类社交困境里判断对方到底是想合作还是想背叛不确定性的处理就直接决定推断质量。这次我们讨论的方向就是把意图推断过程中的不确定性拆成两半来看一半是 aleatoric uncertainty偶然不确定性由执行噪声这类不可消除的随机性造成另一半是 epistemic uncertainty认识不确定性由观察数据不足、对对方策略类型掌握不够造成。拆开之后意图推断才真正可解释、可量化、可改进。本文会从问题建模、数学定义、分离方法、基准实验设计到工程实现思路完整梳理一遍重点讲清楚这几类不确定性在社交困境实验中应该怎么建模、怎么测试、怎么落地到你的 MARL 或人机交互项目里。这个方向不适合指望“装个包就能跑”的读者它更适合做多智能体强化学习、博弈论建模、机器人决策以及人机协作的研究者和工程实现者。如果你正在做对手建模、意图识别、行为预测这类模块这篇文章可以直接收藏里面给出的建模方法和实验设计可以直接套用。1. 核心概念与问题定位先把几个概念放在同一张表里对齐后面所有讨论都基于这些定义。概念定义在意图推断中的角色Intention Inference从观测行为序列推断其他智能体隐藏意图或策略类型的过程核心任务Execution Noise智能体在执行选定动作时叠加的随机扰动导致实际动作偏离意图动作误差来源之一Aleatoric Uncertainty由执行噪声等系统内在随机性造成的不确定性数据再多也无法消除推断后验中的固有方差Epistemic Uncertainty因观测数据不足、模型假设错误造成的不确定性可通过更多数据或信息消除可被主动探索降低的部分Social Dilemma个体理性与集体理性冲突的交互场景典型如囚徒困境、公共品博弈测试环境这里的 execution noise 与 observation noise 要区分开。observation noise 是“你看到的动作不准确”execution noise 是“对方本来想执行 A结果系统实际执行了 A”。两者的数学位置不同后文建模时会体现。这个方向的关键判断是如果不区分两类不确定性你只会得到一个“对方行为很难预测”的结论却不知道难点到底在哪。Aleatoric 不确定性提示你对方动作本身带有随机性就算你完全掌握对方策略也无法精确预判此时应该调整自己的决策策略减少对对方精确行为的依赖。Epistemic 不确定性提示你你还需要更多交互样本来认识对方此时主动探索和信息收集比盲目防御更有价值。2. 问题动机执行噪声如何破坏意图推断2.1 动作 → 意图的推断链断裂在理想情况下一个智能体的行为链条是“意图 → 策略选择动作 → 执行动作”。观察者通过执行出来的动作反推意图。如果执行环节完全精确动作与意图的映射就是确定的推断只是查表。但在真实系统中执行环节几乎不可能完全精确。机器人规划了一套轨迹底层控制器会引入跟踪误差游戏 AI 选了一个按钮通信延迟可能导致动作丢包或重复人类玩家在紧张状态下按键也可能抖。执行噪声使得“可观测动作”不再是“意图动作”的确定性函数而是带上了一个随机核。意图 θ → 策略 π_θ → 意图动作 a* → 执行噪声 ε → 观测动作 a观察者能拿到的是 a想推断的是 θ。中间隔着 π_θ 和 ε 两级不确定性。2.2 不确定性混淆导致策略误判在社交困境中这类误判的代价很直接。以重复囚徒困境为例两方每一轮都选择合作或背叛。如果对方策略实际是“永远合作”某轮却因为执行噪声做出了背叛动作观察者如果忽略噪声会很快把对方类型判定为“不可靠”或“敌对”进而改变自己的策略最终双方陷入互相背叛的纳什均衡。反过来如果对方实际策略是“一报还一报”但由于执行噪声导致偶尔的背叛被观察者归因为“测试边界”观察者又可能低估对方的报复能力继续挑衅最终同样滑向非合作均衡。所以执行噪声不只是底层实现细节它会直接污染高层的意图推断结果。解决思路不是消除噪声——很多场景下噪声无法消除——而是在推断过程中显式建模噪声并把噪声造成的不确定性从“对类型认识不足”里分离出来。2.3 为什么要做不确定性分离分离两类不确定性的实际收益体现在决策策略上如果当前主要不确定性是 epistemic 的说明多收集几轮交互数据对方类型就会更清楚值得付出试探成本。如果主要不确定性是 aleatoric 的说明数据再多也没用对方执行行为本来就带随机性此时最优策略是采用稳健策略而不是继续观测。这对应两种完全不同的行动方向。混在一起处理只能得到“对方不可预测”的笼统结论无法指导后续决策调优。3. 数学建模把执行噪声引入意图推断3.1 基本模型设定假设社交困境中有两个智能体其中一个固定策略类型为 θθ 属于有限类型集合 Θ。类型 θ 决定了智能体的策略 π_θ即给定历史状态 h_t 和意图动作空间 A选择意图动作 a* 的概率分布。在每一轮 t真实执行出来的动作 a_t 会额外叠加执行噪声导致的扰动P(a_t | a*) NoiseModel(a_t; a*, σ)σ 是噪声强度参数。对离散动作常见建模是以概率 1-σ 保持原动作以概率 σ 均匀或偏向性选择其他动作对连续动作常见建模是高斯分布a_t ~ N(a*, σ²I)。观察者已经观测到动作序列 a_1:t它要更新对类型 θ 的信念P(θ | a_1:t) ∝ P(a_1:t | θ) · P(θ) P(θ) · Π_{k1..t} Σ_{a*} P(a_k | a*) · π_θ(a* | h_k)这里的关键是边缘化掉了中间变量 a*。累加号的存在把执行噪声的随机性从单步动作传到了类型推断的置信度中。3.2 两类不确定性在公式中的位置从这个公式能清楚看到两类不确定性的来源差异Aleatoric uncertainty 来自 P(a_k | a*) 的随机核。即使 σ 已知且固定它也会让每次观测动作偏离意图动作导致后验分布 P(θ | a_1:t) 的方差无法降到零。Epistemic uncertainty 来自对 θ 本身信息不足。当 t 很小或者观测动作序列高度相似时后验分布还分散在多个 θ 上需要通过增加 t 或主动改变情境来消除。3.3 一个简化的动作生成与推断示例下面用 Python 演示如何生成带执行噪声的观测动作序列以及如何做一次简化的后验更新。这是理解整个方向的起点。import numpy as np # 类型空间0永远合作, 1永远背叛, 2一报还一报 types [0, 1, 2] def policy_dist(theta, history): 返回意图动作分布。动作 0合作, 1背叛。 if theta 0: return np.array([0.95, 0.05]) # 几乎总合作带轻微探索 elif theta 1: return np.array([0.05, 0.95]) else: if len(history) 0: return np.array([0.9, 0.1]) # 一报还一报模仿对方上一轮动作 last history[-1] if last 0: return np.array([0.9, 0.1]) else: return np.array([0.1, 0.9]) def execution_noise(a_intent, sigma0.2): 离散动作执行噪声。以概率 sigma 翻转动作。 if np.random.rand() sigma: return 1 - a_intent return a_intent def generate_obs(theta, sigma, n_steps20): history [] obs [] for _ in range(n_steps): intent_dist policy_dist(theta, history) a_intent np.random.choice([0, 1], pintent_dist) a_obs execution_noise(a_intent, sigma) obs.append(a_obs) history.append(a_obs) return np.array(obs) def posterior_update(obs, sigma, prior): 在已知噪声强度下计算各类型的后验概率。 log_prior np.log(prior) for t, a_obs in enumerate(obs): history list(obs[:t]) log_lik np.zeros(len(types)) for i, theta in enumerate(types): intent_dist policy_dist(theta, history) # 对意图动作做边缘化累加执行噪声概率 p_obs 0.0 for a_intent, p_a in enumerate(intent_dist): if a_intent a_obs: p_obs p_a * (1 - sigma) else: p_obs p_a * sigma log_lik[i] np.log(max(p_obs, 1e-12)) log_prior log_prior log_lik log_prior log_prior - np.max(log_prior) posterior np.exp(log_prior) return posterior / posterior.sum() prior np.array([0.33, 0.33, 0.34]) sigma 0.3 obs generate_obs(theta0, sigmasigma, n_steps10) post posterior_update(obs, sigma, prior) print(type posterior:, post)这段代码不是一个完整实验但足以展示核心逻辑观测生成时如何注入执行噪声、后验更新时如何对意图动作做边缘化。建议你先跑通它把 sigma 从 0 调到 0.5看看后验收敛速度和置信度如何变化。这能直观感受到 aleatoric 不确定性对推断上限的压制。4. 分离两类不确定性的方法路径把公式建好之后下一个问题是给出一组观测序列如何把后验的不确定性拆成 aleatoric 和 epistemic 两部分。下面整理几种工程上可落地的思路。4.1 显式概率模型 参数扫描最直接的方法是对每个候选类型 θ 和噪声强度 σ都维护一个显式概率模型。此时Aleatoric 部分来自固定的噪声核 P(a_k | a*)它的影响可以直接积分计算。Epistemic 部分来自后验 P(θ | a_1:t) 的熵t 增大时这部分下降。实现上不需要神经网络只要对每个类型做策略枚举和概率计算即可。适合类型空间很小、策略逻辑清晰的场景比如本文示例中的三类型设置。缺点是无法扩展到连续类型或复杂策略。4.2 深度集成Deep Ensemble工程上用得更多的一类方案是训练一组带不同随机种子的神经网络模型输入观测序列输出“类型分布”。测试时集成内部各成员的预测方差反映 epistemic uncertainty。原因是不同初始化对应不同的参数假设数据不足时模型之间会发散数据充足时会收敛。单个模型预测的固有熵或方差反映 aleatoric uncertainty。因为即使每个模型都拟合得很好执行噪声导致的动作随机性依然会体现在单模型的输出熵里。# 伪代码深度集成的不确定性分解 for model in ensemble: pred model(obs_sequence) # 返回类型分布 aleatoric[i] entropy(pred) # 单模型内熵 ≈ 偶然不确定性 epistemic variance(ensemble_predictions, axis0) # 集成间方差 ≈ 认识不确定性 total entropy(mean(ensemble_predictions, axis0))这个思路在工程里最容易实现也最容易和现有行为预测模型对接。需要注意单模型熵和集成间方差只是 aleatoric / epistemic 的一种近似分解不是严格的数学定义用于工程决策足够。4.3 贝叶斯神经网络如果希望从原理上更严格地拆解不确定性可以走 Bayesian Neural NetworkBNN路线。BNN 对网络权重维护后验分布预测时通过对权重后验采样得到一个预测分布族。权重采样带来的预测方差 → epistemic uncertainty固定一组采样权重下的输出熵 → aleatoric uncertainty实现上有现成工具比如 Pyro、TensorFlow Probability或者用 Hamiltonian Monte Carlo 对小网络做采样。代价是训练慢、收敛调试麻烦。对以社交困境为背景的实验建议先用小规模 MLP 验证不要一上来就上大模型。4.4 证据深度学习Evidential Deep Learning另一种较新的思路是通过 Dirichlet 分布建模类型预测让网络同时输出证据量evidence。证据量高时Dirichlet 分布集中epistemic 低证据量低时Dirichlet 分布发散epistemic 高。而类型分布本身的熵对应 aleatoric。这种方法的好处是单次前向推理就能同时输出两类不确定性推理开销小适合需要实时决策的场景。缺点是训练时需要对 Evidence Loss 做调参数值稳定性需要额外处理。4.5 四种方法对比方法Aleatoric 估计Epistemic 估计实现成本适用规模显式概率模型噪声核积分计算后验熵低小类型空间深度集成单模型输出熵集成方差中中大规模贝叶斯神经网络权重采样下输出熵权重后验方差高小网络证据深度学习预测分布熵证据量/分布集中度中高中大规模选型建议第一版实验用显式概率模型验证问题设定确认分离逻辑有效后再上深度集成或证据学习。不要一开始就叠加过多方法否则实验结果分不清是方法差异还是问题本身差异。5. 社交困境基准实验设计模型和算法确定后就需要一套可重复的实验环境来验证效果。这一节给出一个可落地的实验设计框架你可以直接用它来搭建自己的验证流程。5.1 选择社交困境场景推荐从以下经典场景中选择 2 到 3 个做交叉验证场景动作空间冲突来源适合验证什么重复囚徒困境合作 / 背叛个体短期利益 vs 长期合作收益不确定性分离对合作率的影响公共品博弈投入 0~N搭便车诱惑 vs 集体收益对他人投入意愿的推断精度信任博弈投资 / 返还信任与被信任意图推断对信任建立的影响雪堆博弈合作 / 不合作任务完成 vs 成本分摊对对方冒险倾向的推断建议第一轮只跑重复囚徒困境因为动作空间小、策略可枚举方便 debug。后续再扩展到公共品博弈。5.2 生成带执行噪声的交互数据每个 episode 的流程是为两个智能体各自分配一个真实类型 θ_1、θ_2。每轮智能体根据自身策略和历史选择意图动作 a*。对意图动作施加执行噪声得到观测动作 a。双方都能看到观测动作序列并更新对对方的类型后验。记录合作率、类型推断准确率、后验置信度。对每个噪声水平 σ建议生成多组 seed 数据避免单次随机种子导致结论偏差。5.3 核心评价指标指标计算方法要回答的问题类型推断准确率后验最大概率类型是否等于真实类型意图推断整体是否有效后验校准误差预测置信度与真实频率的差距如 ECE不确定性估计是否可靠合作率合作动作在全部动作中的占比意图推断误差是否破坏了合作社会最优距离累计收益 vs 合作最优场景收益的差距推断质量对全局收益的影响Aleatoric/Epistemic 比值两类不确定性占总不确定性的比例不同噪声水平下哪类不确定性主导这里最值得关注的是 ECEExpected Calibration Error。如果你的模型输出“对方是合作型置信度 0.8”那么在所有预测置信度 0.8 的样本里实际情况应该大约有 80% 确实是合作型。不确定性的分解方法好不好看校准曲线比只看准确率更可靠。5.4 实验变量控制需要重点控制的变量包括噪声强度 σ建议取 0、0.1、0.2、0.3、0.4 五个梯度观察两个不确定性分量的变化趋势。先验 P(θ)均匀先验 vs 偏向合作先验 vs 偏向背叛先验用来测试 epistemic 不确定性对不同先验的敏感度。交互轮数 T从 5 轮到 50 轮测试 epistemic 不确定性是否随 T 增加而下降。策略类型集合从 3 类到 10 类类型越多epistemic 不确定性应越高。一个合理的实验矩阵是5 个噪声水平 × 3 个先验 × 3 个轮数 × 20 个随机种子 900 组实验。对小规模模型来说这个量级在普通机器上完全可跑。6. 从算法到工程实现最小复现思路这一节给出一套可运行的工程框架实现“分离 aleatoric 和 epistemic uncertainty”的核心闭环。这里不绑定具体深度学习框架以伪代码和流程说明为主。6.1 整体流程初始化场景参数 → 生成带噪声的交互数据 → 训练意图推断模型或直接使用显式概率模型 → 在前向推理中分解不确定性 → 评估合作率、校准误差、uncertainty 指标 → 可视化不确定性随时间变化的曲线6.2 数据生成器模板class SocialDilemmaEpisode: def __init__(self, theta_0, theta_1, sigma, n_rounds): self.theta_0 theta_0 self.theta_1 theta_1 self.sigma sigma self.n_rounds n_rounds self.history_0 [] self.history_1 [] def step(self): # 两个智能体分别选择意图动作 intent_0 sample_intent(self.theta_0, self.history_1) intent_1 sample_intent(self.theta_1, self.history_0) # 施加执行噪声 obs_0 apply_noise(intent_0, self.sigma) obs_1 apply_noise(intent_1, self.sigma) # 记录至历史 self.history_0.append(obs_0) self.history_1.append(obs_1) return obs_0, obs_1注意如果你的目标是研究“执行噪声下的意图推断”这里的历史记录一定要用观测动作而不是意图动作。很多实现失误源于在训练时不小心用了 ground truth 意图导致测试时性能虚假偏高。6.3 意图推断模型训练伪代码以深度集成为例# 伪代码实际实现需要按框架调整 class IntentInferenceNet(nn.Module): def __init__(self, obs_dim, type_num): super().__init__() self.encoder nn.GRU(obs_dim, hidden_dim64, batch_firstTrue) self.head nn.Linear(64, type_num) def forward(self, obs_seq): _, hidden self.encoder(obs_seq) logits self.head(hidden[-1]) return logits def train_ensemble(train_loader, n_models5): ensemble [] for seed in range(n_models): torch.manual_seed(seed) model IntentInferenceNet(obs_dim2, type_num3) optimizer torch.optim.Adam(model.parameters(), lr1e-3) loss_fn nn.CrossEntropyLoss() for epoch in range(50): for obs_seq, label in train_loader: logits model(obs_seq) loss loss_fn(logits, label) optimizer.zero_grad() loss.backward() optimizer.step() ensemble.append(model) return ensemble训练时输入是“某一方完整观察到的对方动作历史”标签是“对方真实类型”。数据必须覆盖多个噪声水平否则模型只会学到某一个噪声水平下的映射泛化会出问题。6.4 不确定性分解评估伪代码def decompose_uncertainty(ensemble, obs_seq): pred_logits [model(obs_seq) for model in ensemble] pred_probs [softmax(logits) for logits in pred_logits] mean_prob np.mean(pred_probs, axis0) aleatoric np.mean([entropy(p) for p in pred_probs]) epistemic entropy(mean_prob) - aleatoric return mean_prob, aleatoric, epistemic这里 epistemic 的计算用的是“总不确定性 - aleatoric 近似”的方式对应前面说的集成法分解。实际项目中可以根据你的模型类型选择其他分解方式。6.5 与常见 MARL 模拟器的对接如果你不想从零搭建博弈环境可以考虑对接已有仿真器OpenSpiel支持大量博弈场景适合实现囚徒困境、雪堆博弈等注重算法可复现性。Melting PotDeepMind 推出的多智能体评估套件场景更多样适合研究社交困境中的行为涌现。自定义 Gymnasium 环境如果你需要控制执行噪声的具体注入位置自己实现一个简单的重复囚徒困境环境并不困难反而更容易 debug。对接时不要在框架内部强行改执行逻辑建议在动作输出层外再做一层封装统一注入执行噪声。这样能保证原始环境逻辑不被破坏也方便对比不同噪声水平下的结果。7. 资源占用与实验成本控制这类实验并不像大语言模型或扩散模型那样吃显存但要控制好实验规模和重复次数。7.1 硬件需求判断显式概率模型和简单 GRU 模型纯 CPU 即可跑普通桌面机器完全够用。深度集成 中等规模序列模型建议有一张 NVIDIA 显卡显存需求不大4G 到 8G 基本够跑具体取决于序列长度和隐藏层维度。贝叶斯神经网络对采样步数敏感训练耗时可能较长建议先用小网络验证。不要一上来就跑大模型。这个问题的核心在于实验设计和统计显著性而不是模型规模。先用最小模型验证“执行噪声确实导致 aleatoric 不确定性上升”这个假设比直接堆一个大模型有价值得多。7.2 运行时间估算以 900 组实验为例每组一个 20 轮的 episode模型是小的 GRU 或显式概率模型单机 CPU/GPU 混跑通常几分钟到十几分钟就能完成一轮完整评估。瓶颈往往不是单次实验而是调参和调试次数。建议第一轮用 5 个 seed 跑通流程确认指标输出正确。第二轮扩展到 20 个 seed得到正式结果。第三轮如果结果稳定再考虑增加策略类型或实验场景。7.3 观测资源的方法如果你使用 GPU 训练可以用nvidia-smi实时观察显存占用watch -n 1 nvidia-smi如果你的模型很小显存占用通常很低更值得关注的是 CPU 内存和训练时长。建议在代码里记录每个 epoch 的时间方便判断是网络太慢还是数据加载太慢。7.4 可复现性基础配置# 统一随机种子 python train.py --seed 42 --config configs/sigma_02.yaml建议把所有随机种子、噪声水平、策略类型集合都写进配置文件输出目录按“场景-噪声-种子”三级目录组织避免后面分析结果时找不到数据来源。results/ ├── prisoner_dilemma/ │ ├── sigma_0.0/ │ │ ├── seed_0/ │ │ ├── seed_1/ │ └── sigma_0.2/ └── public_goods/8. 常见问题与排查方法在这个方向的实验和落地过程中比较容易踩到下面几个坑提前说明排查思路。问题现象可能原因排查方式解决方案后验始终不收敛或震荡未正确边缘化执行噪声把观测动作当作意图动作打印单步似然检查噪声核函数在后验更新里显式累加意图动作的噪声概率aleatoric 不确定性随数据增加不下降数据生成时 sigma 设得过大导致信息量太低可视化不同 sigma 下的动作序列降低 sigma或增加每个状态的重复观测次数epistemic 不确定性几乎为零模型只见过单一噪声水平或单一类型无法泛化检查训练集类型和噪声分布训练数据混合不同 sigma 和类型调低先验集中度ECE 过高模型置信度未校准画校准曲线增加温度缩放或使用保序回归校准深度集成成员预测完全一致初始化或数据顺序过于相似检查各成员 seed 和数据 shuffle加大随机性或增加网络容量差异加入执行噪声后合作率反而异常升高噪声方向和策略设定不匹配或观测历史使用错误检查真实意图动作和观测动作之间的映射确认记录的是观测动作而不是意图动作实验结论对随机种子敏感每个条件只跑了一两次固定 seed 重复实验每个条件至少 20 个 seed报告均值和方差训练时 loss 下降测试指标很差训练数据分布与测试分布不一致检查训练和测试的 sigma、类型分布确保测试 sigma 包含在训练范围内或使用域随机化最容易忽略的一点是后验更新和目标模型的训练数据分布要保持一致。如果你训练模型时用的是 sigma0.2 的数据测试时却想在 sigma0.4 的条件下表现良好几乎不可能。要么把噪声水平作为模型输入特征要么在训练集里覆盖多个噪声水平。9. 最佳实践与使用建议9.1 从最简单的博弈场景起步第一次实验不要直接上公共品博弈或复杂信任博弈就用重复囚徒困境三个策略类型一个噪声变量跑完后验更新和不确定性分解。这个最小闭环跑通之后再逐步增加场景复杂度和策略类型。这样能确保每个环节都可控。9.2 用多组噪声水平建立基线执行噪声强度 σ 是核心实验变量一定要做多水平对比。用单一噪声水平做出结论很难说明方法的泛化性。建议至少对比 σ0、0.1、0.2、0.3、0.4 五个档位观察两类不确定性的变化趋势是否符合建模预期σ 上升时 aleatoric 上升t 增加时 epistemic 下降。9.3 不确定性分解结果要可视化不要只报指标数字。建议画出以下三张图不同 σ 下 aleatoric 和 epistemic 随交互轮数的变化曲线。后验预测的校准曲线。不同类型策略下的预测置信度分布。这三张图基本能说清楚不确定性分离的效果也方便在复现或评审时直接展示。9.4 主动探索策略可以接在后面如果你发现某类场景中 epistemic 不确定性持续偏高说明当前交互数据不足可以设计主动探索策略让对方进入更多样的情境从而更快收敛类型推断。这一点对机器人主动感知、人机协作都有直接应用价值。9.5 安全与合规边界涉及真实人类行为数据、真实用户交互实验时要确保数据采集和实验设计符合隐私保护和伦理规范。如果要做涉及人脸、声音、个人行为特征的推断实验必须取得明确授权并在发布前做好合规审查。本文讨论的实验框架更适合在模拟环境或合法授权的数据环境中运行。10. 总结与下一步这个方向最值得尝试的点是把“对方不可预测”这个笼统结论拆成“对方执行本身有随机性”和“我还没掌握足够信息”两个可操作判断。两者对应的行动策略完全不同前者要改为稳健决策后者要增加主动探索。这个视角对多智能体博弈、机器人协作、人机信任建模都有直接参考价值。建议你拿到代码后第一件事不是上深度学习而是先跑通第三部分给出的简单后验更新示例把 sigma 从 0 调到 0.5 观察置信度变化。这一步能最快帮你建立对执行噪声如何影响意图推断的直觉。然后按第五部分的实验矩阵搭一个最小实验用显式概率模型验证不确定性分离的可行性再考虑用深度集成或证据学习扩展到更大类型空间。下一步可以考虑把时序建模加进来用真实场景中的变长历史来处理意图推断也可以把主动探索策略接入决策循环让 agent 在检测到高 epistemic 不确定性时主动制造信息增益还可以把本文的方法迁移到自动驾驶交互预测、多人游戏竞技机器人等真实场景中。如果你已经在做类似的工作欢迎在评论区聊聊你们的执行噪声建模方式和不确定性分解方案这对交流验证方法很有价值。