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轮时,已可观察到最低标准差位置存在异常竖线现象;将训练轮次提升至25000轮时,训练集与验证集的效果均进一步提升,但前述竖线现象更加明显:随着训练轮次增加,所有输出的方差逐步收敛到0.68左右(精确值为0.6931571960449219),此时预测标准差完全失去参考价值,需确认以下几点:
- 该现象是否属于过拟合
- 方差收敛到0.693这个固定值的原因
- 无法得到更低标准差的原因
- 如果该现象从2000轮就开始出现,是否意味着模型在2000轮时就已经过拟合
训练轮次提升至25000轮时的损失监控曲线:
25000轮训练下绝对误差与方差关系图:
观察到的权衡现象
训练轮次较少时模型精度稍差,但可提供一定的不确定性参考(效果仍不达预期);训练轮次充足时模型精度更高,但所有输出的标准差一致,完全失去不确定性参考价值,需明确该问题的成因与解决方案。
内容的提问来源于stack exchange,提问作者maxlamenace
相关产品推荐
相关产品推荐

