Papers › Latent-GRPO: Group Relative Policy Optimization for Latent Reasoning

Latent-GRPO: Group Relative Policy Optimization for Latent Reasoning

30 Apr 2026arXiv:2604.27998added by Syntology

Jingcheng Deng, Zihao Wei, Liang Pang, Junhong Wu, Shicheng Xu, Zenghao Duan, Huawei Shen

Title, abstract, authors and date from arXiv's metadata (CC0); this paper is not in the Papers with Code archive (frozen 2025-07-28).

Latent reasoning offers a more efficient alternative to explicit reasoning by compressing intermediate reasoning into continuous representations and substantially shortening reasoning chains. However, existing latent reasoning methods mainly focus on supervised learning, and reinforcement learning in latent space remains highly unstable. We study this problem through the lens of Group Relative Policy Optimization (GRPO), and show that directly adapting GRPO to latent reasoning is fundamentally non-trivial: latent reasoning changes both the probability density and the sampling mechanism, causing three coupled bottlenecks: absence of intrinsic latent manifolds, where unconstrained exploration pushes rollouts off the valid latent manifold; exploration-optimization misalignment, where trajectory-level rewards can induce incorrect token-level updates; and latent mixture non-closure, where jointly reinforcing multiple correct latent paths can produce an invalid averaged state. To address them, we propose \textbf{Latent-GRPO}, which combines invalid-sample advantage masking, one-sided noise sampling, and optimal correct-path first-token selection. Across four low-difficulty benchmarks (e.g., GSM8K-Aug) and four high-difficulty benchmarks (e.g., AIME), Latent-GRPO improves over its latent initialization by 7.86 Pass@1 points on low-difficulty tasks and surpasses explicit GRPO by 4.27 points on high-difficulty tasks while using 3--4× shorter reasoning chains. It also achieves stronger pass@k performance under Gumbel sampling. These results establish Latent-GRPO as an effective approach for stable and efficient latent reasoning.

PaperPDFCode Syntology ran

In Syntology Open this paper in Syntology's Atlas, the map of the papers in Syntology's graph and their citations.

For agents, Syntology's MCP tool lists every function and class Syntology harvested from this paper and whether it ran (how to connect): get_harvested_code_for_paper(arxiv_id="2604.27998")

Code

Syntology Ran 34 of 42 code samples harvested from 2 repositories linked to this paper; 8 have no recorded run. Of those that ran: 2 ran · our draft was wrong; 2 ran · fixture could not drive it; 30 ran with no contract checked.

By repository: found in paper text by Syntology: 42 samples from 2 repositories, 34 ran. The run record, sample by sample. “Ran” means executed on a synthesized input, not that the code is correct or reproduces the paper.

DJC-GO-SOLO/Latent-GRPO found in paper text by Syntology report
DJC-GO-SOLO/Latent-SFT found in paper text by Syntology report

Reachability, where shown, is from one Syntology probe window (2026-09-16 to 2026-09-18); repositories not probed show nothing. GitHub stars are not tracked.

Code Syntology ran Syntology

42 samples harvested; 34 ran; 0 honoured the contract we drafted; 8 have no recorded run. Read from Syntology's graph 2026-09-24; that is when this build read the record, not when the samples ran.

2ran · our draft was wrong
2ran · fixture could not drive it
30ran
8unverified

Licence: 0 of the 42 samples are pointer only, meaning Syntology does not serve that copy's text. This page shows no code text for any sample; each one links to its file in the repository.

Harvested from 2 repositories linked to this paper, official or community; each sample names its own and says which. “Ran” means the sample executed on a synthesized input. It does not mean the output is correct, and nothing here reproduces the paper's results. “Honoured” and “violated” refer to a contract Syntology drafted from the code itself; “our draft was wrong” and “fixture could not drive it” are failures of Syntology's instrument, not of the code.

Each sample ends with its code_sha256, Syntology's identity for that exact code. An agent fetches the stored sample with Syntology's MCP tool get_code(code_sha256="…") (how to connect); click an identity to copy that call.

Repository labels, per sample. official repository: The archive marks this repository official for the paper. named in the paper: The archive records that the paper mentions this repository; it is not marked official. community (archive-listed): In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper. found in paper text by Syntology: 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. Samples from a repository marked official are listed first. Licence labels name the repository's licence as recorded at harvest. “Pointer only” means Syntology does not serve that copy's text, for one of four reasons: no licence file was found; the licence was not identified; the licence is recorded as permissive but that copy's record is not marked cleared; or the licence is outside the permissive list Syntology serves text under (MIT, Apache-2.0, BSD and similar). Some licences outside that list permit redistribution, such as WTFPL, and GPL-3.0 under its conditions; they are simply not on the list. Hover a licence label for the reason. File links open the file on GitHub at the default branch, which may have changed since the harvest.

read_jsonl DJC-GO-SOLO/Latent-SFT/eval/eval_latent_model_hf_batch.py found in paper text by Syntology ran · our draft was wrong MIT (permissive) · 3d5343ae289698e8 · report
ChoicesDecision DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology ran MIT (permissive) · f2a92a4585b27cb4 · report
GlobalConfig DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology ran MIT (permissive) · f07a9b93098407c2 · report
SglConcateAndAppend DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology ran MIT (permissive) · a28a276fd0bbf4c8 · report
SglConstantText DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology ran MIT (permissive) · a0f4d08be2f1739a · report
SglExprList DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology ran MIT (permissive) · 6d89c4a7fc983fc4 · report
SglFork DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology ran MIT (permissive) · 1992c5d2f9475c9b · report
SglGetForkItem DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology ran MIT (permissive) · 4894ce4f6523a387 · report
SglImage DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology ran MIT (permissive) · 272ec36e18437412 · report
SglRoleBegin DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology ran MIT (permissive) · d934fb4b3debf847 · report
SglRoleEnd DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology ran MIT (permissive) · 141d77acae0e5e36 · report
SglSamplingParams DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology ran MIT (permissive) · 7cbba3b173e2cbc9 · report
SglSelect DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology ran MIT (permissive) · b6fe779807130708 · report
SglVarScopeBegin DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology ran MIT (permissive) · f9fcad6f82d96bee · report
SglVarScopeEnd DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology ran MIT (permissive) · 8d5b46295206213f · report
SglVariable DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology ran MIT (permissive) · df225de66b6b5bbc · report
SglVideo DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology ran MIT (permissive) · d2f68cf2d32ed644 · report
benchmark_sequential_vs_batch DJC-GO-SOLO/Latent-SFT/sglang_latent_reasoning_pkg/benchmark/benchmark_batch/benchmark_tokenizer.py found in paper text by Syntology ran MIT (permissive) · 64f004b9216b7322 · report
encode_frame DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology ran · fixture could not drive it MIT (permissive) · 101b39e9dfbda08e · report
encode_image_base64 DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology ran · our draft was wrong MIT (permissive) · 224998e193558d2a · report
encode_video_base64 DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology ran · fixture could not drive it MIT (permissive) · 7c51176540428d49 · report
generate_event_triple_prompt DJC-GO-SOLO/Latent-SFT/sglang_latent_reasoning_pkg/benchmark/generative_agents/agent_functions.py found in paper text by Syntology ran fingerprinted MIT (permissive) · 83900d0c3ab83065 · report
generate_pronunciatio_prompt DJC-GO-SOLO/Latent-SFT/sglang_latent_reasoning_pkg/benchmark/generative_agents/agent_functions.py found in paper text by Syntology ran fingerprinted MIT (permissive) · 577ff88cf5082d20 · report
generate_random_prompt DJC-GO-SOLO/Latent-SFT/sglang_latent_reasoning_pkg/benchmark/benchmark_batch/benchmark_batch.py found in paper text by Syntology ran MIT (permissive) · 9afb749e3f5b90cf · report
generate_random_prompts DJC-GO-SOLO/Latent-SFT/sglang_latent_reasoning_pkg/benchmark/benchmark_batch/benchmark_tokenizer.py found in paper text by Syntology ran MIT (permissive) · 5139455c0f07d032 · report
generate_unique_prefix DJC-GO-SOLO/Latent-SFT/sglang_latent_reasoning_pkg/benchmark/bench_in_batch_prefix/bench_in_batch_prefix.py found in paper text by Syntology ran fingerprinted MIT (permissive) · 19faa93c902e1c91 · report
get_exception_traceback DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology ran MIT (permissive) · 549dc523c7c8d8a0 · report
insert_special_token_every_k DJC-GO-SOLO/Latent-SFT/generate_latent_soft_label_hf_batch.py found in paper text by Syntology ran MIT (permissive) · e14968596cd466cc · report
poignancy_event_prompt DJC-GO-SOLO/Latent-SFT/sglang_latent_reasoning_pkg/benchmark/generative_agents/agent_functions.py found in paper text by Syntology ran fingerprinted MIT (permissive) · e4b32a865322152c · report
prepare_single_cot DJC-GO-SOLO/Latent-SFT/generate_latent_soft_label_hf_batch.py found in paper text by Syntology ran MIT (permissive) · 1170e3e35af4e8fb · report
prepare_single_cot DJC-GO-SOLO/Latent-SFT/generate_latent_soft_label_lora_batch.py found in paper text by Syntology ran MIT (permissive) · 1c8f3b56f98ad894 · report
prepare_single_example DJC-GO-SOLO/Latent-SFT/eval/eval_latent_model_hf_batch.py found in paper text by Syntology ran MIT (permissive) · e80ec2d3cc2af3b3 · report
right_pad_2d DJC-GO-SOLO/Latent-SFT/generate_latent_soft_label_hf_batch.py found in paper text by Syntology ran MIT (permissive) · 7647aa91afd57fde · report
send_batch_request DJC-GO-SOLO/Latent-SFT/sglang_latent_reasoning_pkg/benchmark/benchmark_batch/benchmark_batch.py found in paper text by Syntology ran MIT (permissive) · 5bc9a6f07218ab7b · report
ChoicesSamplingMethod DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology unverified MIT (permissive) · 18796f7fc88439fb · report
ProgramStateGroup DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology unverified MIT (permissive) · 045099058d45370d · report
SglCommitLazy DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology unverified MIT (permissive) · 57cdf370be26a475 · report
SglGen DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology unverified MIT (permissive) · 6fcfc0380ecb4e24 · report
StreamExecutor DJC-GO-SOLO/Latent-GRPO/sglang_latent_reasoning_pkg/python/sglang/lang/interpreter.py found in paper text by Syntology unverified MIT (permissive) · a018c3fd05666881 · report
generate_random_string DJC-GO-SOLO/Latent-SFT/sglang_latent_reasoning_pkg/benchmark/bench_in_batch_prefix/bench_in_batch_prefix.py found in paper text by Syntology unverified MIT (permissive) · 70f1d10961d52f6d · report
prepare_all_prompts DJC-GO-SOLO/Latent-SFT/sglang_latent_reasoning_pkg/benchmark/benchmark_batch/benchmark_batch.py found in paper text by Syntology unverified MIT (permissive) · 60d747ff8e6ab539 · report
prepare_prompts DJC-GO-SOLO/Latent-SFT/sglang_latent_reasoning_pkg/benchmark/bench_in_batch_prefix/bench_in_batch_prefix.py found in paper text by Syntology unverified MIT (permissive) · e5914c7114b177c6 · report

Results from the paper

The Papers with Code archive ends with its 2025-07-28 snapshot. This paper's arXiv identifier, 2604.27998, was issued in April 2026, after that date, so the archive has no leaderboard rows for it.

Report a problem or propose a change · a person checks every report against the paper or source before anything changes; decisions are listed on /corrections