Option to redraw negatives that coincide with the target in `CatalogUniformSampler`

Ouverte Adaptée aux débutants
#330 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
78/100
Type d'issue
Fonctionnalité
Clarté
Clairement spécifiée
Activité
Active
Stack technique
python, pytorch

Piste de recherche

Commencez par rectools/models/nn/transformers/negative_sampler.py et lisez CatalogUniformSampler.get_negatives ; comparez la gestion des collisions avec _NegativeSampler dans rectools/fast_transformers/unisrec/model.py. Ajoutez le comportement optionnel via negative_sampler_kwargs, en conservant le comportement par défaut, et examinez les tests unitaires du sampler. Le travail est terminé lorsque les négatifs en collision sont tirés à nouveau lorsque le comportement est activé et que le comportement existant est conservé par défaut.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

good first issue
Feature Description

Add an opt-in parameter to CatalogUniformSampler (for example avoid_positive_collisions: bool = False) that redraws sampled negatives equal to the target item at the same position. It would be enabled through the existing negative_sampler_kwargs:

SASRecModel(loss="gBCE", n_negatives=256, negative_sampler_kwargs={"avoid_positive_collisions": True})

The default would keep the current behaviour, so existing configs and seeded results do not change.

Why this feature?

CatalogUniformSampler.get_negatives (rectools/models/nn/transformers/negative_sampler.py) samples negatives uniformly from all catalog items (as its docstring says) using torch.randint, without excluding the target. With BCE, gBCE or sampled_softmax, the same item can then be scored as both the positive and a negative in one loss term.

The UniSRec model added in 0.19.0 already handles this: _NegativeSampler in rectools/fast_transformers/unisrec/model.py redraws colliding negatives once. The transformer models in rectools.models.nn (SASRec, BERT4Rec, HSTU) have no such option, although users can subclass TransformerNegativeSamplerBase to get it.

The collision probability per negative is 1 / n_items. With n_negatives=256:

catalog size share of negatives equal to the target share of positions with at least one such negative
3,416 (ML-1M as used in the SASRec/gSASRec papers) 0.03% 7.2%
500 0.2% 40%
100 1.0% 92%

On a synthetic dataset with 100 items (2,000 users, 22 interactions each), SASRecModel with loss="sampled_softmax" and n_negatives=256 reached NDCG@10 of about 0.127 (RecTools NDCG(k=10), default settings). Redrawing colliding negatives until none were left changed this by -0.0009 on average over 3 seeds, which is within run-to-run noise. So I don't expect a measurable metric gain; the aim is consistency with UniSRec and sampling negatives the way the gBCE sampling rate alpha = n_negatives / (n_items - 1) already assumes.

Additional context

I have a small patch ready (one redraw pass, same as _NegativeSampler, plus unit tests and a changelog entry) and can open a PR if this is welcome.

Langage dominant
Python
Étoiles
457
Forks
55
Métriques de merge des PR
Aucune PR mergée en 30 j

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de MTSWebServices/RecTools

Toutes les issues de MTSWebServices/RecTools

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.