MeliGraph.LightGCN.Trainer (MeliGraph v0.3.1)

Copy Markdown View Source

Loop de treinamento do LightGCN.

Lê o estado atual do grafo via MeliGraph.LightGCN.Matrix.build/2, inicializa os embeddings de camada 0 com Xavier, treina via BPR loss

  • Adam usando Nx.Defn para autodiferenciação, e devolve um binary serializado pronto para ser persistido pela aplicação caller.

Esta lib não persiste nada. O binary retornado deve ser salvo pelo caller (Postgres / R2 / S3) e recarregado depois via MeliGraph.LightGCN.EmbeddingStore.load/2.

Hiperparâmetros

OpçãoDefaultReferência
:embedding_dim64paper §4.1.2
:layers3paper §4.2
:epochs1000paper §4.1.2
:batch_size1024paper §4.1.2
:learning_rate0.001Adam default
:lambda1.0e-4paper §4.1.2

Negative sampling

Usamos sampling uniforme (qualquer item aleatório como negativo). Em grafos esparsos isso pode gerar falsos negativos ocasionais — o paper aceita isso explicitamente como trade-off em troca de simplicidade. Estratégias mais sofisticadas (hard negative, adversarial) ficam para v0.3+.

Summary

Functions

adam_step(e0, m, v, grad, lr, t)

loss_and_grad(e0, adj, batch_users, batch_pos, batch_neg, lambda, layers)

propagate(e0, adj, layers)

train(conf, user_prefix, opts \\ [])

@spec train(MeliGraph.Config.t(), String.t(), keyword()) ::
  {:ok, binary()} | {:error, term()}

Treina embeddings LightGCN no grafo apontado por conf.

Retorna {:ok, binary} com o payload serializado:

%{
  version: 1,
  embeddings: Nx.tensor() {node_count, embedding_dim},
  user_index: %{internal_id => row_index},
  item_index: %{internal_id => row_index},
  user_count: integer,
  item_count: integer,
  trained_at: unix_timestamp
}

Retorna {:error, :empty_graph} quando não há arestas user↔item suficientes para construir Ã.