Как использовать CholeskyLKJ в тензорном потоке и не получать nans? - PullRequest
0 голосов
/ 23 марта 2020

Если вы установите более низкую матрицу tri angular, подобную этой, и затем нормализуете строки, чтобы они стали единичными, вы, похоже, всегда получаете nans в распределении LKJ. Что-то не так с этим?

In [335]: d = 50                                                                                                                                                                                                   

In [336]: B = tfp.math.fill_triangular(np.random.randn(int(d * (d + 1) / 2)))                                                                                                                                      

In [337]: s = tf.math.sqrt(tf.reduce_sum(B ** 2, axis=1)) 
     ...: B = B / s[:, None]                                                                                                                                                                                       

In [339]: dist.log_prob(B)                                                                                                                                                                                         
Out[339]: <tf.Tensor: shape=(), dtype=float64, numpy=nan>

In [341]: B @ tf.transpose(B)                                                                                                                                                                                      
Out[341]: 
<tf.Tensor: shape=(50, 50), dtype=float64, numpy=
array([[ 1.        , -0.73015288,  0.73013938, ..., -0.13672552,  0.26941728,  0.02689988],
       [-0.73015288,  1.        , -0.91766958, ..., -0.00929982, -0.17288787, -0.10765312],
       [ 0.73013938, -0.91766958,  1.        , ..., -0.05525723,  0.14590141,  0.08019668],
       ...,
       [-0.13672552, -0.00929982, -0.05525723, ...,  1.        , -0.31836374,  0.09192339],
       [ 0.26941728, -0.17288787,  0.14590141, ..., -0.31836374,  1.        ,  0.10353604],
       [ 0.02689988, -0.10765312,  0.08019668, ...,  0.09192339,  0.10353604,  1.        ]])>

ОБНОВЛЕНИЕ:

Просто используйте dist.sample (1) [0] if в качестве инициализатора, если вы просто пытаетесь выбрать начальные веса. Есть некоторые числовые проблемы в более высоких измерениях, если вы не будете осторожны при создании корреляционных матриц для dist.

...