В настоящее время я пытаюсь вычислить matrix F (N x D)
путем оптимизации следующей целевой функции.Скажем, у меня есть set X of pairs of {1, ... N}
.
Моя потеря может быть описана следующим образом:
Для всех пар (i, j) I суммана расстоянии L2 i-й и j-й строки F.
Все пары, находящиеся в X, взвешиваются на 1, а пары, которые не являютсяв X взвешены -1.Также я усредняю по этим парам.
Однако сведение к минимуму этой цели приводит к значениям NaN для F.
Для оптимизации я использую Адам.
Я пытался использовать потери для ребер (пар, которые в X), а также для одних не ребер, но каждый из них застрял вта же проблема, наводнение F NaNs.
Также я не вижу, почему градиент любой записи F должен стать NaN в любой точке.
</p>
<pre>def minibatch_l2_loss(F, edges_idx, nonedges_idx, squared=False):
""" Computes the l2 of given edges and nonedges.
Parameters
----------
F : tf.Tensor, shape [num_nodes, num_dims]
Embeddings for each node.
edges_idx : tf.Tensor, shape [num_edges, 2]
List of edges, each row representing the (u, v) tuple.
nonedges_idx : tf.Tensor, shape [num_nonedges, 2]
List of non-edges, each row representing the (u, v) tuple.
squared : bool
If the l2 norm will be squared.
Returns
-------
loss : tf.Tensor, shape []
Value of the loss (negative log-likelihood of edges and non-edges).
"""
e1, e2 = edges_idx[:, 0], edges_idx[:, 1]
diffs_edges = tf.norm(tf.gather(F, e1) - tf.gather(F, e2), ord=2, axis=1)
if squared:
diffs_edges = diffs_edges * diffs_edges
loss_edges = tf.reduce_mean(diffs_edges)
ne1, ne2 = nonedges_idx[:, 0], nonedges_idx[:, 1]
diffs_nonedges = tf.norm(tf.gather(F, ne1) - tf.gather(F, ne2), ord=2, axis=1)
if squared:
diffs_nonedges = diffs_nonedges * diffs_nonedges
loss_nonedges = tf.reduce_mean(diffs_nonedges)
return loss_edges - loss_nonedges
В результате после нескольких итераций (в зависимости от начального числа) я получаю F, который содержит NaN.Я не понимаю, как это происходит и где все нестабильно.