{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/sprec-leveraging-self-play-to-debias","title":"SPRec: Leveraging Self-Play to Debias Preference Alignment for Large Language Model-based Recommendations","arxiv_id":"2412.09243","date":"2024-12-12","proceeding":null,"authors":["Chongming Gao","Ruijun Chen","Shuai Yuan","Kexin Huang","Yuanqing Yu","Xiangnan He"],"abstract":"Large language models (LLMs) have attracted significant attention in recommendation systems. Current LLM-based recommender systems primarily rely on supervised fine-tuning (SFT) to train the model for recommendation tasks. However, relying solely on positive samples limits the model's ability to align with user satisfaction and expectations. To address this, researchers have introduced Direct Preference Optimization (DPO), which explicitly aligns recommendations with user preferences using offline preference ranking data. Despite its advantages, our theoretical analysis reveals that DPO inherently biases the model towards a few items, exacerbating the filter bubble issue and ultimately degrading user experience. In this paper, we propose SPRec, a novel self-play recommendation framework designed to mitigate over-recommendation and improve fairness without requiring additional data or manual intervention. In each self-play iteration, the model undergoes an SFT step followed by a DPO step, treating offline interaction data as positive samples and the predicted outputs from the previous iteration as negative samples. This effectively re-weights the DPO loss function using the model's logits, adaptively suppressing biased items. Extensive experiments on multiple real-world datasets demonstrate SPRec's effectiveness in enhancing recommendation accuracy and addressing fairness concerns. The implementation is available via https://github.com/RegionCh/SPRec","url_abs":"https://arxiv.org/abs/2412.09243v2","url_pdf":"https://arxiv.org/pdf/2412.09243v2.pdf","source":{"archive":"pwc-archive (Hugging Face), CC BY-SA 4.0","snapshot":"2025-07-28","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","row_kind":"abstracts"},"code_links":[{"paper_slug":"sprec-leveraging-self-play-to-debias","repo_url":"https://github.com/regionch/sprec","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":0,"framework":"pytorch","reach":{"status":"ok"}}],"tasks":[{"task_slug":"fairness","task_name":"Fairness"},{"task_slug":"language-modeling","task_name":"Language Modeling"},{"task_slug":"language-modelling","task_name":"Language Modelling"},{"task_slug":"large-language-model","task_name":"Large Language Model"},{"task_slug":"recommendation-systems","task_name":"Recommendation Systems"}],"methods":[{"method_slug":"align","method_name":"ALIGN"},{"method_slug":"attention","method_name":"Attention"},{"method_slug":"dpo","method_name":"DPO"},{"method_slug":"sft","method_name":"SFT"},{"method_slug":"softmax","method_name":"Softmax"}],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"syntology_url":"https://syntology.ai/paper/2412.09243","atlas_url":"https://app.syntology.ai/?focus=2412.09243","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2412.09243"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-25T09:33:49+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/regionch/sprec","reach":{"status":"ok"}}],"summary":{"ran_draft_wrong":2,"unverified":7},"by_repo_kind":{"official":{"samples":9,"ran":2,"repositories":1}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":9,"samples":[{"code_sha256_prefix":"ec980d0edf81e31d","entry":"generate_prompt","repo":"regionch/sprec","repo_kind":"official","path":"eval/inference.py","file_url":"https://github.com/regionch/sprec/blob/HEAD/eval/inference.py","link_basis":"plan_row","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":"deterministic","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"ec980d0edf81e31d"}},{"code_sha256_prefix":"0f0719bdf2116801","entry":"get_hash","repo":"regionch/sprec","repo_kind":"official","path":"baselines/D3/D3_evaluate.py","file_url":"https://github.com/regionch/sprec/blob/HEAD/baselines/D3/D3_evaluate.py","link_basis":"plan_row","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"0f0719bdf2116801"}},{"code_sha256_prefix":"5892b82410fdeb2e","entry":"gh_ta","repo":"regionch/sprec","repo_kind":"official","path":"baselines/Re-weighting/RW_SFT.py","file_url":"https://github.com/regionch/sprec/blob/HEAD/baselines/Re-weighting/RW_SFT.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"5892b82410fdeb2e"}},{"code_sha256_prefix":"beb0fac6dffc01a2","entry":"gh_tr","repo":"regionch/sprec","repo_kind":"official","path":"baselines/Re-weighting/RW_SFT.py","file_url":"https://github.com/regionch/sprec/blob/HEAD/baselines/Re-weighting/RW_SFT.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"beb0fac6dffc01a2"}},{"code_sha256_prefix":"42ea65e48852f658","entry":"main","repo":"regionch/sprec","repo_kind":"official","path":"eval/inference.py","file_url":"https://github.com/regionch/sprec/blob/HEAD/eval/inference.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"42ea65e48852f658"}},{"code_sha256_prefix":"0b117d807444bd80","entry":"main","repo":"regionch/sprec","repo_kind":"official","path":"train/data_generate.py","file_url":"https://github.com/regionch/sprec/blob/HEAD/train/data_generate.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"0b117d807444bd80"}},{"code_sha256_prefix":"ea8ede0d54bd8225","entry":"pad_to_length","repo":"regionch/sprec","repo_kind":"official","path":"baselines/DMPO/utils.py","file_url":"https://github.com/regionch/sprec/blob/HEAD/baselines/DMPO/utils.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"ea8ede0d54bd8225"}},{"code_sha256_prefix":"ae7eaf0f2d85dfdf","entry":"read_json","repo":"regionch/sprec","repo_kind":"official","path":"baselines/Re-weighting/RW_SFT.py","file_url":"https://github.com/regionch/sprec/blob/HEAD/baselines/Re-weighting/RW_SFT.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"ae7eaf0f2d85dfdf"}},{"code_sha256_prefix":"1fbace523638910b","entry":"sum_of_first_i_keys","repo":"regionch/sprec","repo_kind":"official","path":"eval/evaluate.py","file_url":"https://github.com/regionch/sprec/blob/HEAD/eval/evaluate.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"1fbace523638910b"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}