当前,我正在尝试通过优化以下目标函数来计算matrix F (N x D)
。假设我有一个set X of pairs of {1, ... N}
。
我的损失可以描述如下:
对于所有对(i,j),我求和F的第i行和第j行的 L2 距离。
X中所有对的权重为1,非X中对的权重为-1。我也平均那些对。
但是,最小化此目标会导致F的NaN值。
为了进行优化,我使用了 Adam 。
我尝试将损失用于边(X中的对)以及单独的非边,但是它们中的每一个都陷入了相同的问题,用NaN淹没了F。 p>
我也不明白,为什么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。我不知道这是怎么发生的,以及哪里不稳定。