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

Keras TensorFlow Probability模型无法学习分布离散度的优化咨询

解决TensorFlow Probability模型无法学习分布离散度的问题

核心问题根源

你当前使用的均方误差(MSE)损失仅关注预测均值与真实值的偏差,完全没有对分布的标准差(scale)提供有效监督。模型会通过最小化scale来“规避”对离散度的学习——因为更小的scale会让分布更集中在均值附近,看似能降低MSE,但实际上完全忽略了数据本身的波动特性。


解决方案

1. 改用负对数似然(NLL)作为损失函数

这是让模型学习到真实离散度的关键。对于正态分布,NLL损失会同时约束均值(loc)和标准差(scale),它会迫使模型在“均值准确性”和“离散度匹配”之间找到最优平衡:如果scale过小,真实值与均值的偏差会被放大;如果scale过大,对数项会拉高损失,最终模型会学到符合数据波动的scale。

在Keras中实现NLL损失的代码示例:

def negative_log_likelihood(y_true, y_pred):
    # y_pred是DistributionLambda输出的分布对象
    return -y_pred.log_prob(y_true)

# 编译模型时使用该损失
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3), 
              loss=negative_log_likelihood)

2. 调整scale的初始化策略

你当前的scale计算逻辑是1e-5 + tf.nn.softplus(c + t[..., n:]),若c初始化过小,会导致初始scale极小,模型容易陷入局部最优。建议:

  • 将c初始化为0或1.0,让初始scale为1e-5 + tf.nn.softplus(0) ≈ 0.693,给模型留出调整离散度的空间;
  • 直接在输出Dense层中对scale对应的logits设置合理初始化,例如:
    # 输出层:前n个神经元对应loc,后n个对应scale的logits
    tf.keras.layers.Dense(2*n, 
                          bias_initializer=tf.keras.initializers.Constant(value=[0.]*n + [0.]*n))
    

3. 加入正则化约束极端scale

若使用NLL后模型出现scale过大/过小的情况,可对输出层参数添加L2正则化,避免模型过度拟合噪声:

tf.keras.layers.Dense(2*n, 
                      kernel_regularizer=tf.keras.regularizers.L2(1e-4),
                      bias_regularizer=tf.keras.regularizers.L2(1e-4))

4. 修正校准验证逻辑

训练完成后,验证scale校准的正确方式:

  • 将测试样本按预测scale分桶;
  • 计算每个桶内真实标签的标准差;
  • 对比桶内预测scale的平均值与真实标准差,若两者接近,则说明模型学到了正确的离散度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 02:33:27