Option to redraw negatives that coincide with the target in `CatalogUniformSampler`
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 78/100
- Issue type
- Feature
- Clarity
- Clearly specified
- Activity status
- Active
- Domain
- machine-learning
Research direction
Start with rectools/models/nn/transformers/negative_sampler.py and read CatalogUniformSampler.get_negatives; compare its collision handling with _NegativeSampler in rectools/fast_transformers/unisrec/model.py. Add the opt-in behavior through negative_sampler_kwargs, keeping the default behavior unchanged, and check the sampler's unit tests. Done means colliding negatives are redrawn when enabled and existing behavior is preserved by default.
Written by the indexing model from the issue text.
Description
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.
- Dominant language
- Python
- Stars
- 457
- Forks
- 55
- PR merge metrics
- No merged PRs in 30d
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from MTSWebServices/RecTools
-
Is it not possible to `load` transformer model on cpu onlyPossibly taken @maxteneff claimed this 22 days ago. Openbug good first issue
Difficulty 3/5 1-2 days Newbie friendliness 35/100
MTSWebServices/RecTools#286 · 3 comments ·
-
bug good first issue
Difficulty 2/5 1-3 hours Newbie friendliness 35/100
MTSWebServices/RecTools#269 · 4 comments ·
-
enhancement
Difficulty 5/5 Over a week Newbie friendliness 25/100
MTSWebServices/RecTools#249 ·
-
enhancement
Difficulty 5/5 Over a week Newbie friendliness 25/100
MTSWebServices/RecTools#243 ·
-
enhancement
Difficulty 5/5 Over a week Newbie friendliness 25/100
MTSWebServices/RecTools#242 ·
All issues in MTSWebServices/RecTools
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 83/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 87/100
Maintainers usually reply within 7 days
-
area: web priority: P1 story
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
nfiasco/Quant-Time-Machine#151 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
autowarefoundation/autoware_carla_scenario#2019 ·
Maintainers usually reply within 1 day
-
docs pydanty:is-working
Difficulty 1/5 1-3 hours Newbie friendliness 85/100
pydantic/pydantic-ai#12892 ·
Maintainers usually reply within 1 day