You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TFP贝叶斯神经网络不确定性估计失效与方差收敛问题咨询

TFP贝叶斯神经网络回归任务不确定性输出异常问题

我是TensorFlow Probability入门使用者,在开展回归任务建模时,对贝叶斯神经网络的输出结果解释存在疑问。实践参考TensorFlow官方概率层回归示例中同时估计*偶然不确定性(Aleatoric Uncertainty)与认知不确定性(Epistemic Uncertainty)*的实现方案,核心代码如下:

def negative_loglikelihood(targets, estimated_distribution):
    return -estimated_distribution.log_prob(targets)


def posterior_mean_field(kernel_size, bias_size, dtype=None):
    n = kernel_size + bias_size #number of total paramaeters (Weights and Bias)
    c = np.log(np.expm1(1.)) 
    return tf.keras.Sequential([
        tfp.layers.VariableLayer(2 * n, dtype=dtype, initializer=lambda shape, dtype: random_gaussian_initializer(shape, dtype), trainable=True), 
        tfp.layers.DistributionLambda(lambda t: tfd.Independent(
            # The Normal distribution with location loc and scale parameters.
            tfd.Normal(loc=t[..., :n],
                       scale=1e-5 +0.01*tf.nn.softplus(c + t[..., n:])),
            reinterpreted_batch_ndims=1)),
    ])



def prior(kernel_size, bias_size, dtype=None):
    n = kernel_size + bias_size
    return tf.keras.Sequential([
        tfp.layers.VariableLayer(n, dtype=dtype),
        tfp.layers.DistributionLambda(lambda t: tfd.Independent(
            tfd.Normal(loc=t, scale=1),
            reinterpreted_batch_ndims=1)),
    ])




def build_model(param):
    model = keras.Sequential()
    for i in range(param["n_layers"] ):
        name="n_units_l"+str(i)
        num_hidden = param[name]
        model.add(tfp.layers.DenseVariational(units=num_hidden, make_prior_fn=prior,make_posterior_fn=posterior_mean_field,kl_weight=1/len(X_train),activation="relu"))
    model.add(tfp.layers.DenseVariational(units=2, make_prior_fn=prior,make_posterior_fn=posterior_mean_field,activation="relu",kl_weight=1/len(X_train))) 
    model.add(tfp.layers.DistributionLambda(lambda t: tfd.Normal(loc=t[..., :1],scale=1e-3 + tf.math.softplus(0.01 * t[...,1:]))))
    
    lr = param["learning_rate"]
    optimizer=optimizers.Adam(learning_rate=lr)
        
    model.compile(
        loss=negative_loglikelihood,  #negative_loglikelihood, 
        optimizer=optimizer,
        metrics=[keras.metrics.RootMeanSquaredError()],
    )

    return model

本次搭建的网络结构与TensorFlow Probability官方示例基本一致,仅增加了若干不同单元数的隐藏层;参考社区调优方案在后验计算的Softplus前增加0.01系数后,模型预测误差低于1%,点预测性能达到预期,但使用过程中遇到如下问题:

核心问题

  • 贝叶斯神经网络可度量预测不确定性,原本预期高方差预测对应更大的预测误差,但绘制绝对误差与方差的关系图后发现效果不达预期:虽然低方差区间整体预测效果更优,但低方差区间仍存在大量误差极高的预测结果,完全无法通过预测标准差过滤劣质预测,需明确贝叶斯神经网络无法输出可靠不确定性的原因。
    2000轮训练下绝对误差与方差关系图:
    2000轮训练下绝对误差与方差关系图
  • 模型训练2000轮时,已可观察到最低标准差位置存在异常竖线现象;将训练轮次提升至25000轮时,训练集与验证集的效果均进一步提升,但前述竖线现象更加明显:随着训练轮次增加,所有输出的方差逐步收敛到0.68左右(精确值为0.6931571960449219),此时预测标准差完全失去参考价值,需确认以下几点:
    • 该现象是否属于过拟合
    • 方差收敛到0.693这个固定值的原因
    • 无法得到更低标准差的原因
    • 如果该现象从2000轮就开始出现,是否意味着模型在2000轮时就已经过拟合
      训练轮次提升至25000轮时的损失监控曲线:
      25000轮训练损失监控曲线
      25000轮训练下绝对误差与方差关系图:
      25000轮训练下绝对误差与方差关系图

观察到的权衡现象

训练轮次较少时模型精度稍差,但可提供一定的不确定性参考(效果仍不达预期);训练轮次充足时模型精度更高,但所有输出的标准差一致,完全失去不确定性参考价值,需明确该问题的成因与解决方案。

内容的提问来源于stack exchange,提问作者maxlamenace

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:54:26