A small fraction is enough
Configurations around 10% or higher track the convergence and final loss of full RoPE in the tested settings.
How much of an attention head actually needs rotary position encoding? Our large-scale study finds that a small fraction can be enough.
1 Max Planck Institute for Software Systems 2 Microsoft, Hyderabad
Select a dimension pair to inspect its frequency and rotation.
Notice how the first few dimensions on the left (high frequency) spin rapidly with each step in position. In contrast, the dimensions on the right (low frequency) barely move.
This allows the model to learn both short-range and long-range relationships simultaneously.
Rotary Positional Embeddings encode token order by rotating query and key dimensions. Model families disagree on how many dimensions to rotate, from a quarter to all of them, yet the choice has rarely been studied directly.
We isolate that choice and test RoPE fractions from NoPE to full RoPE across architectures, scales, datasets, and sequence lengths.
Open model families span a wide range, from rotating one quarter of each head to rotating every dimension. Formal ablations or detailed explanations for the fraction are rare.
| Model family | RoPE fraction | Rationale in the literature |
|---|---|---|
| GPT-J · GPT-NeoX · Pythia Early partial-RoPE lineage |
25%
|
Limited evidence
GPT-NeoX reported a small-scale 25% trade-off; later adopters largely inherited the setting. |
| Phi-2 Microsoft |
40%
|
Not detailed
No systematic fraction ablation is reported alongside the configuration. |
| Nemotron-4-340B NVIDIA |
50%
|
Not detailed
The configuration exposes the choice, but not a systematic justification for the fraction. |
| GLM-4.5 Partial RoPE configuration |
50%
|
Not detailed
The model also uses 50% Partial RoPE, without a detailed rationale for selecting that fraction. |
| LLaMA family · most Qwen models Full-RoPE convention |
100%
|
Default convention
Full rotation is standard, while fraction-specific justification is rarely stated. |
| Qwen3-Next A recent shift back to partial RoPE |
25%
|
Explicit claim
The team links the choice to improved extrapolation at longer sequence lengths. |
Representative open-weight models. Configuration names differ across training frameworks.
Across the study, a surprisingly small amount of positional rotation carried most of the benefit.
Configurations around 10% or higher track the convergence and final loss of full RoPE in the tested settings.
Rotating fewer dimensions shrinks the sine/cosine cache proportionally, up to an order of magnitude at 10% RoPE.
NoPE can produce unrecoverable loss spikes at scale. Even minimal RoPE or QK-Norm mitigates that instability.
We pretrained decoder-only models from scratch and varied only the fraction of hidden dimensions receiving RoPE. The pattern held across the axes below.
At short and moderately long sequence lengths, the RoPE cache is usually not a prominent memory constraint. At million-token scales and beyond, its linear growth turns partial RoPE into a practical design lever, especially when caches are replicated across accelerators.
Scache = Lmax × (Dhead × fRoPE) × Pbytes
The plot defaults to a head dimension of 256 and uses FP32 storage. It shows raw sine/cosine cache storage and excludes memory fragmentation.
At 100M tokens, reducing RoPE from 100% to 10% saves about 85.8 GiB for every replicated cache copy.
Use it as a strong empirical baseline, not a universal constant.
Check the interaction with head dimension, context length, and block design.
At scale, retain a minimal positional signal or add QK-Norm for stability.
Read the full methodology, inspect the training runs, explore released models, or reproduce the training and evaluation pipeline.
@misc{khan2026fractionalrotationpotentialinvestigating,
title = {Fractional Rotation, Full Potential?
Investigating Performance and Convergence
of Partial RoPE},
author = {Mohammad Aflah Khan and Krishna P. Gummadi
and Manish Gupta and Abhilasha Ravichander},
year = {2026},
eprint = {2603.11611},
archivePrefix = {arXiv},
primaryClass = {cs.LG}
}