具有自定义损失函数的 TensorFlow 2 的无效参数错误(学生 t 分布)

Invalid argument error with TensorFlow 2 with self-defined loss function (Student t distribution)

这个问题是以下已经回答的问题的后续问题,我想在这里正式提出一个新问题。原始问题位于此处:

如前所述,我目前正在训练 TensorFlow 模型来预测不同分布的参数。为此,我创建了适当的层并修改了损失函数。

不幸的是,当我使用多元 t 分布 (tfp.distributions.MultivariateStudentTLinearOperator) 时,出现以下错误结果:

InvalidArgumentError:  Input matrix is not invertible.
     [[node negative_t_loss_2/negative_t_loss_2_MultivariateStudentTLinearOperator/log_prob/LinearOperatorLowerTriangular/solve/triangular_solve/MatrixTriangularSolve (defined at d:_programming\python\virtualenvs\tensorflow-gpu-2\lib\site-packages\tensorflow_probability\python\distributions\multivariate_student_t.py:265) ]] [Op:__inference_train_function_1471]

Function call stack:
train_function

这次定义损失函数的过程如下:

def negative_t_loss_2(y_true, y_pred):
    # Separate the parameters
    n, mu1, mu2, sigma11, sigma12, sigma22 = tf.unstack(y_pred, num=6, axis=-1)
    mu = tf.transpose([mu1, mu2], perm=[1, 0])
    sigma = tf.linalg.LinearOperatorLowerTriangular(tf.transpose([[sigma11, sigma12], [sigma12, sigma22]], perm=[2, 0, 1]))
    dist = tfp.distributions.MultivariateStudentTLinearOperator(df=n, loc=mu, scale=sigma)
    nll = tf.reduce_mean(-dist.log_prob(y_true))
    return nll

我已将完整(更广泛)的代码和所需数据复制到

https://drive.google.com/drive/folders/1IIAtKDB8paWV0aFVFALDUAiZTCqa5fAN?usp=sharing

(笔记本“normdist_2D_not_working_t.ipynb”).

我使用的操作系统是Windows10,Python版本是3.6。示例代码中列出的所有库都是最新的,包括tensorflow-gpu。

如能解决问题,将不胜感激。该主题与金融部门特别相关,因为此类分布在这里起着重要作用,尤其是在风险管理中。

调用LinearOperatorLowerTriangular时尺度矩阵需要是下三角矩阵,将张量转换为线性算子,只需替换

sigma = tf.linalg.LinearOperatorLowerTriangular(tf.transpose([[sigma11, sigma12], [sigma12, sigma22]], perm=[2, 0, 1]))

作者:

sigma = tf.linalg.LinearOperatorLowerTriangular(tf.transpose([[sigma11, tf.zeros_like(sigma12)], [sigma12, sigma22]], perm=[2, 0, 1]))

另外Student-t的参数n是正数,所以在negative_t_layer_2函数中加上n = tf.keras.activations.softplus(n)

那么,它应该可以工作了。