TailSFT: Filtered Fine-Tuning Improves Post-Training Performance
Organizations: University of California San Diego · Microsoft Research NYC
Abstract
Reinforcement learning post-training drives reasoning and agentic capabilities in modern AI systems, yet a growing body of work shows that it is most effective when used to fine-tune an already capable base model. We question whether existing pipelines yield models that are most suitable for reinforcement learning. Building on prior work highlighting the role of coverage and pass@K as predictors of post-RL performance, we design a simple modification to supervised fine-tuning, TailSFT, which filters out already fit sequences during training, thereby focusing learning on under-modeled regions, or the tail, of the data distribution. We justify and validate the design choices in TailSFT, particularly the specific filtering criteria, through a combination of controlled experiments and theoretical analysis. On OLMo-3 7B, TailSFT often improves pass@16 performance on math and coding evaluations, with gains up to 17% absolute, while incurring minimal computational overhead. These higher-coverage checkpoints consistently translate to up to 4% absolute pass@1 gains in subsequent GRPO runs, demonstrating that TailSFT checkpoints serve as better initializations for RL. We further introduce a lightweight diagnostic for identifying settings where TailSFT is most likely to help. More broadly, our results motivate a principled, stage-aware approach to model development, in which intermediate checkpoints are judged by how effectively they support subsequent training.
Figures & tables
| pass@1 | pass@16 | ||||||
| SFT data | Benchmark | Standard | TailSFT | Standard | TailSFT | ||
| OMI | AIME 2022–2025 ( ) | ||||||
| MATH-500 Level 5 ( ) | |||||||
| OMEGA-500 ( ) | |||||||
| BigCode | MBPP+ ( ) | ||||||
| HumanEval+ ( ) | |||||||
| pass@1 | pass@16 | ||||||
| SFT data | Benchmark | Standard | TailSFT | Standard | TailSFT | ||
| GRPO on MATH | |||||||
| OMI | MATH-500 Level 5 ( ) | ||||||
| AIME 2022–2025 ( ) | |||||||
| GRPO on MBPP+ | |||||||
| BigCode | MBPP+ ( ) | ||||||
Appendix figures & tables31 assets
Supplementary material from the paper’s appendix.
Appendix
| SFT data | Benchmark | Base | Standard SFT | TailSFT | ||
| OMI | AIME | |||||
| MATH-500 L5 | — | — | — | |||
| OMEGA-500 | ||||||
| BigCode | MBPP+ | |||||
| HumanEval+ | ||||||
| CruxEval-I |
| SFT data | Benchmark | Base | Standard SFT | TailSFT | ||
| OMI | AIME | |||||
| MATH-500 L5 | — | — | — | |||
| OMEGA-500 | ||||||
| BigCode | MBPP+ | |||||
| HumanEval+ | ||||||
| CruxEval-I |
| SFT data | Benchmark | #gained | #lost | #unchanged | median (pp) | mean (pp) | 95% CI |
| OMI | AIME | 31 | 14 | 75 | +0.00 | +3.07 | [+0.77, +5.59] |
| OMI | MATH-500 L5 | 25 | 15 | 94 | +0.00 | +2.74 | [-1.24, +6.47] |
| OMI | OMEGA-500 | 75 | 77 | 348 | +0.00 | -0.20 | [-2.33, +1.80] |
| BigCode | MBPP+ | 39 | 19 | 320 | +0.00 | +4.14 | [+2.12, +6.35] |
| BigCode | HumanEval+ | 21 | 11 | 132 | +0.00 | +3.46 | [+0.00, +6.91] |
| BigCode | CruxEval-I | 157 | 89 | 554 | +0.00 | +4.08 | [+2.12, +6.12] |
| SFT data | Source | Train / val |
| Magicoder | ise-uiuc/Magicoder-OSS-Instruct-75K | 33,817 / 342 |
| BigCode | bigcode/self-oss-instruct-sc2-exec-filter-50k | 49,260 / 498 |
| OCI | nvidia/OpenCodeInstruct | 72,635 / 365 |
| Hyperparameter | Values |
| Base model | OLMo-3 7B base |
| Learning rate | |
| Filter schedule | none; static; ramp |
| Filter fraction | (none); static ; ramp |
| Epochs | fixed per dataset ( / / for BigCode / Magicoder / OCI) |
| Sequence length |
| Filter | LR | pass@1 | pass@16 | ||
| base (no SFT) | — | — | — | ||
| no filter | — | — | |||
| static | |||||
| ramp | |||||
| no filter | — | — | |||
| static |
| Filter | LR | pass@1 | pass@16 | ||
| base (no SFT) | — | — | — | ||
| no filter | — | — | |||
| static | |||||
| static | |||||
| static | |||||
| no filter | — | — |
| Benchmark | Filter | pass@1 | pass@16 | ||
| MBPP+ ( ) | base (no SFT) | — | — | ||
| MBPP+ ( ) | no filter | — | — | ||
| MBPP+ ( ) | ramp | ||||
| HumanEval+ ( ) | base (no SFT) | — | — | ||
| HumanEval+ ( ) | no filter | — | — | ||
| HumanEval+ ( ) | ramp |
| Filter | LR | pass@1 | pass@16 | ||
| base (no SFT) | — | — | — | ||
| BigCode | |||||
| no filter | — | — | |||
| static | |||||
| static | |||||
| static | |||||
| Filter | LR | pass@1 | pass@16 | ||
| base (no SFT) | — | — | — | ||
| BigCode | |||||
| no filter | — | — | |||
| static | |||||
| static | |||||
| static | |||||
| Filter | LR | pass@1 | pass@16 | ||
| base (no SFT) | — | — | — | ||
| BigCode | |||||
| no filter | — | — | |||
| static | |||||
| static | |||||
| static | |||||
| Filter | LR | pass@1 | pass@16 | ||
| base (no SFT) | — | — | — | ||
| BigCode | |||||
| no filter | — | — | |||
| static | |||||
| static | |||||
| static | |||||
| SFT data | Benchmark | Standard p@1 | TailSFT p@1 | Standard p@16 | TailSFT p@16 |
| BigCode | MBPP+ ( ) | ||||
| BigCode | HumanEval+ ( ) | ||||
| BigCode | CruxEval-I ( ) | ||||
| BigCode | CruxEval-O ( ) | ||||
| BigCode | LiveCodeBench ( ) | ||||
| Magicoder | MBPP+ ( ) |
| SFT data | Benchmark | p@1 | p@2 | p@4 | p@8 | p@16 |
| BigCode | MBPP+ ( ) | |||||
| HumanEval+ ( ) | ||||||
| CruxEval-I ( ) | ||||||
| CruxEval-O ( ) | ||||||
| LiveCodeBench ( ) | ||||||
| Magicoder | MBPP+ ( ) |
| Dataset | Source/filter | Train rows | Validation rows |
| OMI math subset | OpenMathInstruct-2 math / augmented_math , MATH-500 decontaminated | 332,500 | 17,500 |
| Hyperparameter | Values |
| Base model | OLMo-3 7B base |
| Learning rate | fixed at |
| Filter schedule | none; static; ramp |
| Filter fraction | (none); static ; ramp |
| Epochs | |
| Sequence length |
| Filter | pass@1 | pass@16 | ||
| no filter | — | — | ||
| static | ||||
| static | ||||
| static | ||||
| static | ||||
| static |
| Filter | Level 1 ( ) | Level 2 ( ) | Level 3 ( ) | Level 4 ( ) | Level 5 ( ) |
| no filter | |||||
| static | |||||
| static | |||||
| static | |||||
| static | |||||
| static |
| Filter | Level 1 ( ) | Level 2 ( ) | Level 3 ( ) | Level 4 ( ) | Level 5 ( ) |
| no filter | |||||
| static | |||||
| static | |||||
| static | |||||
| static | |||||
| static |
| Eval family | Filter | pass@1 | pass@16 | ||
| base (no SFT) † | — | — | |||
| ramp sweep | no filter | — | — | ||
| ramp sweep | ramp | ||||
| ramp sweep | ramp | ||||
| ramp sweep | ramp | ||||
| static | no filter | — | — | ||
| SFT data | Benchmark | Standard p@1 | TailSFT p@1 | Standard p@16 | TailSFT p@16 |
| OMI | AIME 2022–2025 ( ) | ||||
| OMI | MATH-500 Level 5 ( ) | ||||
| OMI | OMEGA-500 ( ) |
| Benchmark | p@1 | p@2 | p@4 | p@8 | p@16 |
| AIME 2022–2025 ( ) | |||||
| MATH-500 Level 5 ( ) | |||||
| OMEGA-500 ( ) |
| Setting | Value |
| Initialization | matched Standard / TailSFT OMI SFT checkpoints ( Table 1 ) |
| Algorithm | GRPO, group-relative advantage, no KL |
| Training prompts | MATH-lighteval train, MATH-500 removed ( train / val) |
| Reward | verifiable boxed-answer exact match ( / ) |
| Rollout group size | |
| Actor learning rate | searched ; reported |
| pass@1 | pass@16 | |||||
| Benchmark | Standard | TailSFT | Standard | TailSFT | ||
| MATH-500 Level 5 ( ) | ||||||
| AIME 2022–2025 ( ) | ||||||
| Setting | Value |
| Initialization | matched Standard / TailSFT SFT checkpoints per dataset ( Table 1 ) |
| Algorithm | GRPO, group-relative advantage, no KL |
| Training prompts | MBPP+ train ( -problem held-out validation) |
| Reward | full MBPP+ unit-test pass ( / ) |
| Rollout group size | searched ; reported |
| Actor learning rate | searched ; reported |
| pass@1 | pass@16 | |||||||
| SFT data ( TailSFT filter) | LR | Standard | TailSFT | Standard | TailSFT | |||
| BigCode (static ) | ||||||||
| Magicoder (static ) | ||||||||
| Magicoder (static ) | ||||||||
| OCI (ramp ) | ||||||||
| SFT dataset | Benchmark | (pp) | ||
| OMI | AIME | 16 | ||
| MATH-500 L5 | 31 | |||
| OMEGA-500 | 140 | |||
| BigCode | CruxEval-I | 199 | ||
| CruxEval-O | 237 | |||
| HumanEval+ | 29 |