Skip to content

Commit 6fb7e41

Browse files
committed
Pad sigmoid value to never be 0 or 1
1 parent d4071e0 commit 6fb7e41

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

algo/src/main/java/org/neo4j/gds/embeddings/node2vec/Node2VecModel.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ public class Node2VecModel {
6060
private final RandomWalkProbabilities randomWalkProbabilities;
6161
private final ProgressTracker progressTracker;
6262
private final long randomSeed;
63+
private static final double EPSILON = 1e-10;
6364

6465
public static MemoryEstimation memoryEstimation(int embeddingDimension) {
6566
var vectorMemoryEstimation = MemoryUsage.sizeOfFloatArray(embeddingDimension);
@@ -284,10 +285,11 @@ private void trainSample(long center, long context, boolean positive) {
284285
// L_neg = -log sigmoid(-center * context) ; gradient: sigmoid (center * context)
285286
float affinity = centerEmbedding.innerProduct(contextEmbedding);
286287

287-
double positiveSigmoid = Sigmoid.sigmoid(affinity);
288+
//When |affinity| > 40, positiveSigmoid = 1. Double precision is not enough.
289+
//Make sure negativeSigmoid can never be 0 to avoid infinity loss.
290+
double positiveSigmoid = Sigmoid.sigmoid(affinity) - EPSILON;
288291
double negativeSigmoid = 1 - positiveSigmoid;
289292

290-
291293
lossSum -= positive ? Math.log(positiveSigmoid) : Math.log(negativeSigmoid);
292294

293295
float gradient = positive ? (float) -negativeSigmoid : (float) positiveSigmoid;

0 commit comments

Comments
 (0)