首页 > 解决方案 > 如何在 Tensorflow 2.0 (TFP) 中调试爆炸梯度(协方差矩阵)

问题描述

一个问题来自于我从未如此深入地在 TF 中调试我的模型。

我正在使用 Tensorflow Probability 进行全秩高斯近似的变分推理。我注意到我的优化经常爆发。这是我的损失曲线

我怀疑数值问题,因为所有损失和优化过程看起来都很合理,而且我没有观察到任何 NaN。

我使用通过默认对角线移位tfp.distributions.MultivariateNormalTriL转换的协方差参数。tfp.bijectors.FillScaleTriL协方差矩阵的条件数是合理的。变分推理是用fit_surrogate_posterior函数执行的。

我使用带有动量的 SGD 进行优化,每次迭代使用 10 个样本。

在 Tensorflow Probability 源代码内部,最小化目标使用梯度带:

   with tf.GradientTape(watch_accessed_variables=trainable_variables is None) as tape:
      for v in trainable_variables or []:
        tape.watch(v)
      loss = loss_fn()

为了解决我的问题,我想通过每个操作查看渐变。

我的问题是如何更深入地了解梯度计算正在爆炸的操作?如何获得每个张量的梯度值?

如果你们中的任何人遇到类似的问题: 有没有更好的方法来防止协方差矩阵优化中的不稳定性?

详细解释:

我观察到这种爆炸是由一个参数引起的(尽管爆炸的参数并不总是相同)。这可以通过比较爆炸前两次迭代的协方差矩阵来简单地检查

以及在损失爆发点之前的一次迭代

注意最后一个参数。当我多次运行相同的优化时,可能会发生“小”参数之一(从 9 到最后的行)在某个时候爆炸。

谢谢,马特乌斯

标签: tensorflowdebuggingtensorflow2.0tensorflow-probabilitygradienttape

解决方案


推荐阅读