Оптимизация потерь в потоке приводит к значениям NaN - PullRequest
0 голосов
/ 29 декабря 2018

В настоящее время я пытаюсь вычислить matrix F (N x D) путем оптимизации следующей целевой функции.Скажем, у меня есть set X of pairs of {1, ... N}.

Моя потеря может быть описана следующим образом:

  1. Для всех пар (i, j) I суммана расстоянии L2 i-й и j-й строки F.

  2. Все пары, находящиеся в X, взвешиваются на 1, а пары, которые не являютсяв X взвешены -1.Также я усредняю ​​по этим парам.

  3. Однако сведение к минимуму этой цели приводит к значениям NaN для F.

  4. Для оптимизации я использую Адам.

  5. Я пытался использовать потери для ребер (пар, которые в X), а также для одних не ребер, но каждый из них застрял вта же проблема, наводнение F NaNs.

  6. Также я не вижу, почему градиент любой записи 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.Я не понимаю, как это происходит и где все нестабильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...