想象一位叫阿哲的主厨。客人问:“这道菜辣不辣?”普通神经网络只会报一个分数:辣度 8 分。可如果明天辣椒换了产地、后厨温度有了变化,这个 8 分还能信吗?贝叶斯深度学习希望像一位诚实的主厨那样回答:“我最有把握是 8 分,但可能落在 6 到 10 分之间;而且遇到从没试过的新食材,我的把握会更小。”它不是丢掉神经网络,而是给网络里的每个配方参数都加上一层“信念分布”,再用数据不断更新信念。贝叶斯神经网络(BNN)直接给权重套分布;MC Dropout 则用“随机忘掉一些配料”的巧妙近似,把贝叶斯采样变成工程上可落地的方案。

岗位关联

学会用概率审视神经网络的输出,你才能告诉业务方:模型不仅给了答案,还给了答案的把握程度。这是安全关键系统对 AI 从业者的硬要求。

目录
  1. 可视化演示
  2. 为何需要不确定
  3. 贝叶斯神经网络
  4. 后验推断难题
  5. 变分推断近似
  6. MC近似推断
  7. 不确定性分解
  8. 实践与评估
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示HTTPS/TLS握手建立加密通道的完整流程,包含ClientHello、证书验证、密钥协商、握手完成和加密传输五个核心阶段的步进式演示。

本节配有交互动效(进入视口后自动加载,约 3KB)。

ClientHello 阶段 客户端发送支持的TLS版本、加密套件和随机数Client Random → ClientHello 握手开始建立安全通道

为何需要不确定

阿哲的餐厅有一道招牌菜,客人总问:“辣不辣?”以前他只会干脆地回答:“8 分。”可有一天,供应商送来的辣椒特别辣,客人被呛到,从此阿哲意识到:只说一个分数不够,还要说出这个分数有多可靠。

传统神经网络做的事情就像这个“只说 8 分”的主厨。网络把输入 \(x\) 经过层层计算,得到唯一的输出 \(y\),这种做法叫点估计。点估计在大多数乖巧数据上够用,但在自动驾驶、医疗诊断这类场景里,一个错判可能带来严重代价。模型需要的不是“最可能的答案”,而是“答案的可信范围”。

所以,贝叶斯深度学习的核心思路是:让模型输出一个分布,而不是一个点。面对一份没见过的病例,模型不应该自信地说“良性”,而应该说“我判断良性,但把握只有 62%,建议医生复核”。对 AI 从业者来说,这种“知道自己不知道”的能力,往往比精度数字更有商业价值。

贝叶斯神经网络

阿哲意识到,他对菜品的判断不是凭空来的。他有一本“配方笔记本”,里面写着很多候选配方;每做一次菜、尝一次客人的反馈,他就在笔记本上调整哪些配方更可信。贝叶斯神经网络(BNN)做的正是这件事:不再把神经网络的权重 \(\theta\) 当成一个固定常数,而是当成一个随机变量,并维护它的分布。

当我们拿到训练数据 \(\mathcal{D}\) 后,真正关心的是权重的后验分布:在看到数据之后,每个候选权重有多可信。贝叶斯公式给出了答案:

有了权重后验,预测新样本 \(x^\) 时不能只用一个权重,而是要把所有可能权重下的预测都加权平均,最终得到预测分布 \(p(y^ \mid x^*, \mathcal{D})\)。这就像阿哲不再只说“8 分”,而是翻开整本配方笔记本,给出一个“分数带”。

p(θ∣D)=p(D∣θ) p(θ)p(D)\displaystyle p(\theta \mid \mathcal{D}) = \frac{p(\mathcal{D} \mid \theta)\, p(\theta)}{p(\mathcal{D})}
这个公式把“先验信念”和“数据证据”合在一起,得到“更新后的信念”。
  1. 后验 \(p(\theta \mid \mathcal{D})\)看到训练数据 \(\mathcal{D}\) 之后,我们对权重 \(\theta\) 的新信念。它是 BNN 一切推断的起点。
    p(θ∣D)\displaystyle p(\theta \mid \mathcal{D})
  2. 似然 \(p(\mathcal{D} \mid \theta)\)如果某个候选权重 \(\theta\) 是真的,它能解释当前这批数据的可能性有多大。像阿哲试了几种配方后,判断哪份配方最像客人吃到的味道。
    p(D∣θ)\displaystyle p(\mathcal{D} \mid \theta)
  3. 先验 \(p(\theta)\)还没看数据时,我们对权重已有的初始判断。比如主厨认为“盐不能太多”“辣度要适中”,这就是先验。
    p(θ)\displaystyle p(\theta)
  4. 证据 \(p(\mathcal{D})\)在所有可能的权重下,观测到这批数据的总体概率。它像所有配方的综合得分,用来把后验归一化成一个合法概率分布。
    p(D)\displaystyle p(\mathcal{D})

后验推断难题

理论很优雅,但阿哲很快发现,他不可能真的把整本笔记本里的配方都试一遍。世上配方有无限多种,而神经网络里哪怕只有一百万个小参数,参数的组合空间也大到无法想象。

问题出在后验公式的分母 \(p(\mathcal{D})\) 上:

这个积分要对所有权重 \(\theta\) 求。深度网络的参数通常是百万甚至上亿级,这个积分既没有解析解,也不可能用简单枚举完成。

这就像阿哲想计算“所有可能配方下客人满意的总概率”,可配方组合比宇宙原子还多。因此,我们必须接受近似:不求完美后验,只求一个“足够好的替身”。

p(D)=∫p(D∣θ) p(θ) dθ\displaystyle p(\mathcal{D}) = \int p(\mathcal{D} \mid \theta)\, p(\theta)\, d\theta
  1. 证据项 \(p(\mathcal{D})\)后验公式里那个负责归一化的分母,它衡量“在所有配方下,这批数据整体出现的概率”。
    p(D)\displaystyle p(\mathcal{D})
  2. 被积函数 \(p(\mathcal{D} \mid \theta) p(\theta)\)在某个具体配方 \(\theta\) 下,先验与似然的乘积,表示“这个配方本身有多合理,又能多好地解释数据”。
    p(D∣θ) p(θ)\displaystyle p(\mathcal{D} \mid \theta)\, p(\theta)
  3. 积分变量 \(d\theta\)要把所有维度的权重都积分一遍。权重维度越高,积分复杂度指数级上升。
    dθ\displaystyle d\theta
  4. 无闭式解深层网络的积分没有简洁的数学表达式,只能靠近似方法解决。

变分推断近似

既然精确后验算不动,阿哲换了个思路:与其研究整本无穷厚的配方书,不如从“容易操作的配方家族”里挑一位代表,让它尽量接近真实信念。这个“容易操作的配方家族”通常选高斯分布,因为我们只需要记录均值和方差就能描述它。

这个挑选过程就叫变分推断。我们定义一个候选分布 \(q_\phi(\theta)\),希望它尽量接近真实后验 \(p(\theta \mid \mathcal{D})\)。优化目标是最大化 ELBO(证据下界):

实际操作时,我们常用“重参数化技巧”:把从 \(q_\phi(\theta)\) 中采样的随机性拆出来,变成“确定性函数加噪声”,这样就能用梯度下降训练 BNN。相当于阿哲不再翻阅整本配方书,而是记住一个“最像答案的配方范围”,并且知道这个范围有多大。

L(ϕ)=Eqϕ(θ)[log⁡p(D∣θ)]−KL⁡(qϕ(θ) ∥ p(θ))\displaystyle \mathcal{L}(\phi) = \mathbb{E}_{q_\phi(\theta)}\left[\log p(\mathcal{D} \mid \theta)\right] - \operatorname{KL}\left(q_\phi(\theta)\,\Vert\, p(\theta)\right)
ELBO 一边鼓励候选分布能解释数据,一边惩罚它与先验差得太远。最大化它,等价于最小化候选分布与真实后验的 KL 散度。
  1. 变分分布 \(q_\phi(\theta)\)我们选定的、容易处理的候选权重分布,\(\phi\) 是它的参数,比如高斯分布的均值和方差。
    qϕ(θ)\displaystyle q_\phi(\theta)
  2. 期望对数似然在候选分布下,随机抽取一些权重,看它们平均能把数据解释得多好。数值越大,说明候选配方越贴合数据。
    Eqϕ(θ)[log⁡p(D∣θ)]\displaystyle \mathbb{E}_{q_\phi(\theta)}\left[\log p(\mathcal{D} \mid \theta)\right]
  3. KL 散度度量候选分布与先验分布的差距。它防止我们为了迎合数据而彻底违背常识。
    KL⁡(qϕ(θ) ∥ p(θ))\displaystyle \operatorname{KL}\left(q_\phi(\theta)\,\Vert\, p(\theta)\right)
  4. 最大化 ELBO前面两项互相平衡,最终找到离真实后验最近的简单分布。这就是工程上可优化的目标。
    L(ϕ)\displaystyle \mathcal{L}(\phi)

MC近似推断

变分推断思路严谨,但实现起来仍然不轻松。阿哲发现还有一个偷懒但有效的办法:他做菜时经常“随机忘掉”某几种配料。同一道菜,他做十次,味道会稍微不同;把这些不同味道综合起来,也能看出这道菜的稳定程度。

这个技巧就是 MC Dropout。Dropout 本来是防止过拟合的正则化工具:训练时随机把一部分神经元置零。但后来人们发现,如果测试时也保留 Dropout,反复做多次前向传播,这些随机预测的平均值可以近似贝叶斯后验预测,而预测的方差正好给出不确定性。

MC Dropout 的优势是几乎不改变原有模型结构,训练时照常加 Dropout,测试时多跑几次前向就行。阿哲很喜欢这个办法:不用换新厨房,只要“多做几遍、每次少放点配料”,就能看出这道菜到底稳不稳。

p(y∣x,D)≈1T∑t=1Tp(y∣x,θt),θt∼q(θ)\displaystyle p(y \mid x, \mathcal{D}) \approx \frac{1}{T}\sum_{t=1}^{T} p\left(y \mid x, \theta_t\right),\quad \theta_t \sim q(\theta)
每一次测试时随机失活,就相当于从近似后验里抽取一个候选权重。抽取 \(T\) 次再做平均,就是用蒙特卡洛方法近似积分。
  1. 随机权重 \(\theta_t\)第 \(t\) 次前向传播时,Dropout 随机遮住一部分神经元,形成一个“不完整但可用”的候选权重。
    θt∼q(θ)\displaystyle \theta_t \sim q(\theta)
  2. 单次预测 \(p(y \mid x, \theta_t)\)在某个随机失活版本下,模型对样本 \(x\) 的输出概率。
    p(y∣x,θt)\displaystyle p\left(y \mid x, \theta_t\right)
  3. 取平均把 \(T\) 次预测加起来除以 \(T\),用平均值近似那个难算的积分。
    1T∑t=1T\displaystyle \frac{1}{T}\sum_{t=1}^{T}
  4. 后验预测 \(p(y \mid x, \mathcal{D})\)这才是我们真正想要的、带不确定性的预测分布。

不确定性分解

阿哲发现,菜品的“不确定”其实有两种完全不同的来源。第一种,是食材本身不稳定:同一批番茄,有的甜有的酸,这是无论怎么熟悉菜谱都消除不了的。第二种,是他对某些菜根本不熟:一个川菜师傅第一次做法国甜点,把握自然小,但多学多做之后,这种不确定会迅速下降。

机器学习中也一样。模型预测的总不确定性能拆成两部分:

这种分解对实际决策非常重要。在自动驾驶中,偶然不确定性高意味着“当前传感器和路况本身就很模糊”,需要更保守的规划;认知不确定性高则意味着“这个场景训练数据没见过”,需要把样本送去人工标注或模型升级。

Var⁡(y∣x)⏟总不确定性=E[Var⁡(y∣x,θ)]⏟偶然不确定性+Var⁡(E[y∣x,θ])⏟认知不确定性\displaystyle \underbrace{\operatorname{Var}(y \mid x)}_{\text{总不确定性}} = \underbrace{\mathbb{E}\left[\operatorname{Var}(y \mid x, \theta)\right]}_{\text{偶然不确定性}} + \underbrace{\operatorname{Var}\left(\mathbb{E}[y \mid x, \theta]\right)}_{\text{认知不确定性}}
第一项来自数据本身的随机噪声,第二项来自模型对参数的不确定。增加数据主要降低第二项。
  1. 条件方差 \(\operatorname{Var}(y \mid x, \theta)\)固定一组权重后,由于标签噪声、传感器噪声等带来的输出波动。
    Var⁡(y∣x,θ)\displaystyle \operatorname{Var}(y \mid x, \theta)
  2. 偶然不确定性对所有可能权重取平均后的“平均噪声水平”。它由数据生成过程中的内在随机性决定,数据再多也无法完全消除。
    E[Var⁡(y∣x,θ)]\displaystyle \mathbb{E}\left[\operatorname{Var}(y \mid x, \theta)\right]
  3. 认知不确定性不同候选权重给出的预测均值彼此相差多少。模型见过的数据越少、越陌生,这一项就越大。
    Var⁡(E[y∣x,θ])\displaystyle \operatorname{Var}\left(\mathbb{E}[y \mid x, \theta]\right)
  4. 加和关系总不确定性是两项之和,因此我们看到一个“大方差”时,要分辨它来自噪声,还是来自模型无知。

实践与评估

理论落地时,阿哲不会只凭一次试菜就判断菜品稳定。他会同一道菜做十次,记录每次的客人反馈,再检查“我说 70% 把握时,是不是真的有 70% 的客人觉得好吃”。这对应模型校准:只有当预测置信度和真实正确率一致时,不确定性才有实际意义。

在工程实践里,MC Dropout 是最容易上手的贝叶斯近似方案。训练时在网络隐藏层插入 Dropout;预测阶段不要切到 eval() 模式,而是保持 train() 模式,重复前向 \(T\) 次;对回归任务取均值与标准差,对分类任务用多个 softmax 向量的平均作为概率、用多次输出的熵或方差作为不确定度。BNN 可以用变分推断训练,但成本更高,适合对不确定性精度要求极高的场景。

评估时,除了准确率,我们还要看可靠性图、期望校准误差(ECE),以及“高不确定样本的失败率”。一个能报出可靠不确定性的模型,才能在医疗、自动驾驶、金融风控等场景中被信任。就像阿哲的餐厅,只有每一句“我很有把握”都经得起回头客验证,他才能成为真正让人放心的主厨。

AI 应用场景

自动驾驶中的感知不确定性

阶段:模型推理与风险控制

解决的问题:传统目标检测模型只输出“前方是行人,置信度 0.9”,但当遇到遮挡、逆光或没见过车型时,0.9 可能严重虚高。MC Dropout 让同一张图前向采样多次,若行人框位置抖动很大,系统就能判断“当前感知不可靠”,主动减速或请求人工接管。

具体案例:某自动驾驶团队在夜间雨雾数据集上对检测模型做 MC Dropout。结果显示,碰撞风险最高的 5% 帧中,模型预测框的标准差明显高于正常帧。于是系统引入规则:当关键目标框位置方差超过阈值时,限制车速并触发传感器融合。

医疗影像辅助诊断

阶段:模型部署与医生协作

解决的问题:肺结节筛查模型如果直接给“良性/恶性”标签,医生很难判断该不该信。贝叶斯深度学习输出“恶性概率 70%,认知不确定性很高”时,系统会标注“该病例与训练分布差异大,建议专家复核”,减少漏诊。

具体案例:一家医学影像公司用变分推断训练 BNN 做胸片分类。模型对训练集中常见病灶给出较窄的置信区间;对罕见病灶则给出很宽的分布,放射科医生据此把高不确定病例优先排队复查,整体召回率提升 12%。

工业质检中的新缺陷发现

阶段:异常检测与样本回流

解决的问题:传统质检模型只认识训练过的缺陷类型,遇到新缺陷会强行分类到已知类。带不确定性的模型能识别“这个样本离所有已知类别都很远”,触发人工复检并把新样本加入训练集。

具体案例:某电子工厂在 PCB 缺陷检测中引入 MC Dropout。每当模型多次前向预测不一致时,系统自动将该图像送入复检通道。运行三个月后,未知缺陷被提前发现,误检率下降了约 30%。

Python 演示

python65 行
import torchimport torch.nn as nnimport numpy as np torch.manual_seed(0)np.random.seed(0)  def make_data(n=60):    x = np.linspace(-3.0, 3.0, n)    y = np.sin(x) + np.random.normal(0, 0.15, n)    xs = torch.tensor(x, dtype=torch.float32).reshape(-1, 1)    ys = torch.tensor(y, dtype=torch.float32).reshape(-1, 1)    return xs, ys  class Net(nn.Module):    def __init__(self):        super().__init__()        self.fc1 = nn.Linear(1, 64)        self.fc2 = nn.Linear(64, 64)        self.fc3 = nn.Linear(64, 1)        self.dropout = nn.Dropout(0.2)     def forward(self, x):        x = torch.tanh(self.fc1(x))        x = self.dropout(x)        x = torch.tanh(self.fc2(x))        x = self.dropout(x)        return self.fc3(x)  def train(model, xs, ys, epochs=600):    opt = torch.optim.Adam(model.parameters(), lr=0.02)    for _ in range(epochs):        opt.zero_grad()        loss = torch.nn.functional.mse_loss(model(xs), ys)        loss.backward()        opt.step()    return loss.item()  def mc_predict(model, xs, samples=200):    model.train()    preds = []    with torch.no_grad():        for _ in range(samples):            preds.append(model(xs).numpy().ravel())    return np.array(preds)  def main():    xs, ys = make_data()    model = Net()    train(model, xs, ys)    preds = mc_predict(model, xs, samples=200)    mean = preds.mean(axis=0)    std = preds.std(axis=0)    print("预测均值前3个:", mean[:3])    print("标准差分前3个:", std[:3])    print("平均不确定性:", std.mean())  if __name__ == "__main__":    main()
目的:用 MC Dropout 训练一个简单神经网络,在测试阶段保持 Dropout 开启,通过 200 次随机前向传播得到每个点的预测均值与标准差,从而量化模型的不确定性。
  1. self.dropout = nn.Dropout(0.2)在隐藏层加入随机失活结构,这是 MC Dropout 能近似贝叶斯推断的基础。
  2. model.train()预测时故意不切到 eval(),让 Dropout 继续随机遮神经元,才能产生多条不同的预测。
  3. preds.append(model(xs).numpy().ravel())每一次前向传播都相当于从近似后验中抽取一个“候选配方”。
  4. std = preds.std(axis=0)多条预测曲线在同一个 \(x\) 上的标准差,就是该点的不确定性估计。

常见误区

误区我只要在预测结果上随机加一点高斯噪声,让输出带个方差,这就叫贝叶斯神经网络了。

正解BNN 的核心是把网络的权重当作概率分布,而不是给最终输出人为加噪声。输出不确定性是权重分布经网络前向传播后自然产生的。就像主厨的不确定来自“对配方没把握”,而不是“上菜时故意手抖”。

为何常见:因为很多人只看到 BNN 的输出是一个分布,误以为不确定性只是输出层的装饰。

误区训练时才用 Dropout,测试时为了结果稳定一定要关闭,否则预测会随机抖动。

正解在 MC Dropout 中,测试时保持 Dropout 开启正是关键。多次随机前向的抖动不是噪声,而是对后验不确定性的近似估计。关闭 Dropout 后只能得到点估计,拿不到不确定性。

为何常见:传统深度学习训练流程反复强调“eval 模式关闭 Dropout”,很多人没有重新理解它在贝叶斯近似中的新角色。

误区只要模型里有 Dropout,不管训练得怎么样,测试时多前向几次就能得到靠谱的不确定性。

正解MC Dropout 的近似质量依赖模型已经拟合到合理状态,也依赖 Dropout 层位置和丢弃率设置。如果网络欠拟合或 Dropout 只在浅层,所得方差可能完全没有校准意义。

为何常见:因为“多次前向取方差”实现太简单,容易让人忽略模型质量和结构配置的重要性。

误区所有不确定性都是因为数据不够,只要我疯狂加数据,模型最终会变成完全确定。

正解偶然不确定性来自数据本身的内在随机性,比如传感器噪声、标签噪声,即使数据无限大也难以降为零;只有认知不确定性会随数据增加而下降。两者需要分开报告和处理。

为何常见:人们习惯用“更多数据解决一切问题”的直觉思考,忽略了数据生成过程中天然存在的随机性。

面试题

Q1. 贝叶斯神经网络中,权重在训练后通常被建模为:

单选题 · easy

  • A.固定常数权重
  • B.概率分布权重← 正确答案
  • C.随机噪声权重
  • D.高维向量权重

答案:B。BNN 的核心是把权重看作随机变量,用概率分布描述其不确定性。固定常数是传统网络;随机噪声不等同于分布建模;高维向量只是形状描述。

Q2. 下列哪个是贝叶斯公式的正确形式?

单选题 · mid

  • A.P(θ|D)=P(D|θ)P(θ)÷P(D)← 正确答案
  • B.P(D|θ)=P(θ|D)P(D)÷P(θ)
  • C.P(θ|D)=P(θ)P(D)÷P(D|θ)
  • D.P(D)=P(D|θ)P(θ)÷P(θ|D)

答案:A。后验等于似然乘先验除以证据。选项 A 是标准贝叶斯公式;其余选项把分子分母位置交换,得到的不是后验更新规则。

Q3. 深度网络中精确贝叶斯后验难以计算的主要原因是:

单选题 · mid

  • A.数据量不足无法计算
  • B.参数高维积分无闭式解← 正确答案
  • C.后验一定是高斯分布
  • D.先验分布无法被定义

答案:B。深度网络参数有百万甚至上亿维,需要对所有权重做积分,既没有闭式解也无法枚举。数据量不足不是理论难点;后验也未必是高斯;先验可以人为指定。

Q4. ELBO 在变分推断中的作用是:

单选题 · mid

  • A.直接计算后验分布的精确值
  • B.通过最大化下界逼近真实后验← 正确答案
  • C.让先验分布服从均匀分布
  • D.让似然函数最大化到无穷

答案:B。变分推断把求精确后验转化为优化问题,最大化 ELBO 等价于最小化候选分布与真实后验的 KL 散度,因此是一种近似而非精确计算。

Q5. MC Dropout 近似贝叶斯推断的关键做法是:

单选题 · mid

  • A.在训练时固定所有神经元
  • B.测试时多次随机失活并平均← 正确答案
  • C.在损失函数中加入正则项
  • D.用极大似然估计网络权重

答案:B。测试时保持 Dropout 开启,多次前向传播相当于从近似后验中抽取多个权重样本,平均预测并计算方差,就得到不确定性估计。

Q6. 增加更多训练数据后,哪种不确定性基本不会下降?

单选题 · mid

  • A.偶然性不确定性← 正确答案
  • B.认知性不确定性
  • C.参数先验不确定性
  • D.结构搜索不确定性

答案:A。偶然不确定性源于数据本身的随机噪声,比如传感器噪声、标注不一致,增加数据不能消除它;认知不确定性源于模型未知区域,会随数据增加而下降。

Q7. 在贝叶斯神经网络中,先验分布表示的是:

单选题 · easy

  • A.观察数据之后的认识
  • B.看到数据之前的先验信念← 正确答案
  • C.网络输出的最终结果
  • D.梯度下降的最终方向

答案:B。先验是看到数据前对权重的初始判断。看到数据后更新得到的才是后验;网络输出是前向传播结果,与先验概念不同。

Q8. 关于认知不确定性,下列说法正确的是:

多选题 · mid

  • A.源于模型对未知区域不熟悉← 正确答案
  • B.数据增多之后显著下降← 正确答案
  • C.数据无限也无法消除
  • D.MC Dropout 可近似估计← 正确答案

答案:ABD。认知不确定性来自模型对未见过的样本区域不熟悉,数据越多、覆盖越好,它就越低;MC Dropout 的多次前向方差主要捕获的就是认知不确定性。选项 C 描述的是偶然不确定性。

Q9. 使用 MC Dropout 估计不确定性时,正确的操作包括:

多选题 · hard

  • A.预测时保持 Dropout 开启← 正确答案
  • B.多次前向求均值与方差← 正确答案
  • C.预测时强制关闭 Dropout
  • D.单次前向传播得到方差

答案:AB。必须保持 Dropout 开启,做多次随机前向传播,用均值作为预测、方差作为不确定性。关闭 Dropout 或只做单次前向都无法得到不确定性的统计信息。

Q10. 以下哪些方法可以给出预测的不确定性估计?

多选题 · easy

  • A.BNN 在后验上采样预测← 正确答案
  • B.MC Dropout 多次前向预测← 正确答案
  • C.忽略所有分布的普通网络
  • D.仅输出 argmax 标签

答案:AB。BNN 对权重后验做推断,MC Dropout 用随机失活近似后验,两者都能得到预测分布。普通点估计网络和只输出最大类别标签的做法没有不确定性信息。