{"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/arxiv-2509-26272","title":"PRPO: Paragraph-level Policy Optimization for Vision-Language Deepfake Detection","arxiv_id":"2509.26272","date":"2025-09-30","proceeding":"ICML","authors":["Tuan Nguyen","Naseem Khan","Khang Tran","NhatHai Phan","Issa Khalil"],"abstract":"The rapid rise of synthetic media has made deepfake detection a critical challenge for online safety and trust. Progress remains constrained by the scarcity of large, high-quality datasets. Although multimodal large language models (LLMs) exhibit strong reasoning capabilities, their performance on deepfake detection is poor, often producing explanations that are misaligned with visual evidence or hallucinatory. To address this limitation, we introduce a reasoning-annotated dataset for deepfake detection and propose Paragraph-level Relative Policy Optimization (PRPO), a reinforcement learning algorithm that aligns LLM reasoning with image content at the paragraph level. Experiments show that PRPO improves detection accuracy by a wide margin and achieves the highest reasoning score of 4.55/5.0. Ablation studies further demonstrate that PRPO significantly outperforms GRPO under test-time conditions. These results underscore the importance of grounding multimodal reasoning in visual evidence to enable more reliable and interpretable deepfake detection.","url_abs":"https://arxiv.org/abs/2509.26272","url_pdf":"https://arxiv.org/pdf/2509.26272","source":{"archive":null,"snapshot":"2025-07-28","note":"not in the Papers with Code archive (frozen at the snapshot)","row_kind":"graph","title_abstract_authors_date":"arXiv metadata, CC0 1.0 (https://info.arxiv.org/help/license)"},"code_links":[],"tasks":[],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2509.26272","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2509.26272"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-24T18:15:14+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":[{"mentioned_in_github":null,"is_official":null,"provenance":"deterministic:regex_extraction","mentioned_in_paper":null,"url":"https://github.com/tuanrpt/PRPO","reach":null}],"summary":{"ran":1,"ran_draft_wrong":2,"ran_fixture":3,"unverified":2},"by_repo_kind":{"found_in_text":{"samples":8,"ran":6,"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":0,"samples":[{"code_sha256_prefix":"0319f698d86f0e36","entry":"GrpoConfig","repo":"tuanrpt/PRPO","repo_kind":"found_in_text","path":"prpo/verl/trainer/ppo/core_algos.py","file_url":"https://github.com/tuanrpt/PRPO/blob/HEAD/prpo/verl/trainer/ppo/core_algos.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"0319f698d86f0e36"}},{"code_sha256_prefix":"4c66edc1f42be7a7","entry":"_compute_paragraph_logprobs","repo":"tuanrpt/PRPO","repo_kind":"found_in_text","path":"prpo/verl/trainer/ppo/core_algos.py","file_url":"https://github.com/tuanrpt/PRPO/blob/HEAD/prpo/verl/trainer/ppo/core_algos.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"MISDECLARED","metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"4c66edc1f42be7a7"}},{"code_sha256_prefix":"0ab57499b7d10cbf","entry":"_group_mean","repo":"tuanrpt/PRPO","repo_kind":"found_in_text","path":"prpo/verl/trainer/ppo/core_algos.py","file_url":"https://github.com/tuanrpt/PRPO/blob/HEAD/prpo/verl/trainer/ppo/core_algos.py","link_basis":"first_harvest_node","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"0ab57499b7d10cbf"}},{"code_sha256_prefix":"182deafeff9c5c10","entry":"_group_std","repo":"tuanrpt/PRPO","repo_kind":"found_in_text","path":"prpo/verl/trainer/ppo/core_algos.py","file_url":"https://github.com/tuanrpt/PRPO/blob/HEAD/prpo/verl/trainer/ppo/core_algos.py","link_basis":"first_harvest_node","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"182deafeff9c5c10"}},{"code_sha256_prefix":"a064f095b2208875","entry":"compute_grpo_outcome_advantage","repo":"tuanrpt/PRPO","repo_kind":"found_in_text","path":"prpo/verl/trainer/ppo/core_algos.py","file_url":"https://github.com/tuanrpt/PRPO/blob/HEAD/prpo/verl/trainer/ppo/core_algos.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"MISDECLARED","metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"a064f095b2208875"}},{"code_sha256_prefix":"a448d0668c2660b5","entry":"grpo_paragraph_objective","repo":"tuanrpt/PRPO","repo_kind":"found_in_text","path":"prpo/verl/trainer/ppo/core_algos.py","file_url":"https://github.com/tuanrpt/PRPO/blob/HEAD/prpo/verl/trainer/ppo/core_algos.py","link_basis":"first_harvest_node","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"a448d0668c2660b5"}},{"code_sha256_prefix":"d64d33420ff4e73e","entry":"AdvantageEstimator","repo":"tuanrpt/PRPO","repo_kind":"found_in_text","path":"prpo/verl/trainer/ppo/core_algos.py","file_url":"https://github.com/tuanrpt/PRPO/blob/HEAD/prpo/verl/trainer/ppo/core_algos.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"d64d33420ff4e73e"}},{"code_sha256_prefix":"adeadcfa6f90e620","entry":"compute_prpo_paragraph_advantage","repo":"tuanrpt/PRPO","repo_kind":"found_in_text","path":"prpo/verl/trainer/ppo/core_algos.py","file_url":"https://github.com/tuanrpt/PRPO/blob/HEAD/prpo/verl/trainer/ppo/core_algos.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"adeadcfa6f90e620"}}]},"arxiv_metadata":{"licence":"arXiv metadata, CC0 1.0 (https://info.arxiv.org/help/license)","fields":["title","abstract","authors","date"],"primary_category":"cs.CV","source":"arxiv_api"},"syntology_extracted_results":null}