TensorFlow Probability的层(例如DenseFlipout)有一个losses
方法(或属性),它获取“与该层相关的损失”。有人能解释这些损失是什么吗?
在浏览了Flipout论文后,我认为这些损失指的是权重和偏置的先验和后验分布之间的库尔巴克-莱布勒散度。如果有人比我更了解这些事情,请纠正我。
回答:
你的猜测是正确的,尽管文档说明不够充分。例如,在下面的代码片段中
import tensorflow_probability as tfpmodel = tf.keras.Sequential([ tfp.layers.DenseFlipout(512, activation=tf.nn.relu), tfp.layers.DenseFlipout(10),])logits = model(features)neg_log_likelihood = tf.nn.softmax_cross_entropy_with_logits( labels=labels, logits=logits)kl = sum(model.losses) # 损失被求和# 将负对数似然和KL项结合起来loss = neg_log_likelihood + kl train_op = tf.train.AdamOptimizer().minimize(loss)
在DenseFlipout
层的文档中提供的,losses
被求和以获得KL项,而对数似然项是单独计算的,并与KL项结合形成ELBO。
你可以在这里看到添加的损失这里,经过几次间接引用后,揭示了正在使用的{kernel,bias}_divergence_fn
,而这反过来默认是一个调用tfd.kl_divergence(q, p)
的lambda
函数。