Tensforflow损失优化产生NaN值

时间:2018-12-29 12:31:29

标签: tensorflow loss

当前,我正在尝试通过优化以下目标函数来计算matrix F (N x D)。假设我有一个set X of pairs of {1, ... N}

我的损失可以描述如下:

  1. 对于所有对(i,j),我求和F的第i行和第j行的 L2 距离。

  2. X中所有对的权重为1,非X中对的权重为-1。我也平均那些对。

  3. 但是,最小化此目标会导致F的NaN值。

  4. 为了进行优化,我使用了 Adam

  5. 我尝试将损失用于边(X中的对)以及单独的非边,但是它们中的每一个都陷入了相同的问题,用NaN淹没了F。 p>

  6. 我也不明白,为什么F的任何项的梯度在任何时候都应该能够成为NaN。

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

经过几次迭代(取决于种子),结果得到一个包含NaN的F。我不知道这是怎么发生的,以及哪里不稳定。

0 个答案:

没有答案