tensorflow - 如何在 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 到最后的行)在某个时候爆炸。
谢谢,马特乌斯
解决方案
推荐阅读
- tomcat - 如何使用 Jenkins 从 Windows 机器在 Unix 机器上重新启动 Tomcat?
- reactjs - 仅在子级上运行渲染和协调器
- java - Spring-data-elasticsearch @JsonProperty 不工作
- mysql - 如果列名包含且值等于 MYSQL,则选择计数
- laravel - 我可以从 laradock 创建单个 Dockerfile 吗?
- ruby-on-rails - 将自定义标签添加到 sanitized_allowed_tags 而不替换默认值
- bash - 如何在循环中特定行的末尾附加一个字符?
- angular - 以角度4将非静态对象传递给静态方法
- http - 为什么 TLS 允许将证书颁发给不同的子域?
- python - 使用 Python 在 PE 文件中搜索字符串