Rank Measures of Fine-Tuning Updates Need a Noise Baseline
Organizations: Independent Researcher
Abstract
Studies of what fine-tuning does to a language model often summarise the weight update by its rank. We compare the rank measures used for this against the same measures on a random matrix of the same shape, and against two harder references: the pretrained weights, and matched fine-tunes without alignment content. Measures that count directions put our fine-tuning updates only a little below noise; stable rank, computed from the same singular values, puts them far below. Both are right: an update has a few strong directions on top of a long tail. The pattern holds for thirteen released pairs up to 8B parameters, and it is not a mark of alignment: with training held fixed, instruction data does not stand out from Wikipedia or code, DPO gives the same update whether its preference labels are real or half swapped at random (one model, modest preference strength), and scrambled text gives the most concentrated update of all. Applied to a recent claim that post-training is superficial because the effective rank of the weights barely changes, the baselines show that a random update of the same size leaves that rank almost unchanged while wrecking the model, and that an edit built on the effective rank of the update has no measurable effect in our tests. Rank measures of weight updates need a noise baseline, and claims about alignment need a control without alignment content.
Figures & tables
| model | matrix | threshold | eRank | 90% energy | particip. | stable | top-1 energy |
|---|---|---|---|---|---|---|---|
| Qwen2.5-0.5B | SFT update | 0.973 | 0.816 | 0.541 | 0.381 | 0.097 | 4.2% |
| wikitext update | 0.972 | 0.810 | 0.531 | 0.365 | 0.093 | 4.0% | |
| code update | 0.975 | 0.817 | 0.543 | 0.374 | 0.094 | 3.8% | |
| shuffled-words update | 0.941 | 0.745 | 0.440 | 0.202 | 0.042 | 9.0% | |
| DPO update | 0.966 | 0.810 | 0.536 | 0.295 | 0.053 | 5.8% | |
| swapped-DPO update | 0.967 | 0.811 | 0.537 | 0.304 | 0.055 | 5.7% |
| difference | Qwen2.5-0.5B | SmolLM2-360M |
|---|---|---|
| SFT wikitext | ( , ) | ( , ) |
| SFT code | ( , ) | ( , ) |
| code wikitext | ( , ) | ( , ) |
| shuffled words SFT | ( , ) | ( , ) |
| code, steps matched code | ( , ) | ( , ) |
| swapped DPO DPO | ( , ) | – |
| update | threshold | noise | above floor | stable rank | noise | stable w/o top |
|---|---|---|---|---|---|---|
| SmolLM2-135M instruct | 0.971 | 0.996 | 96% | 0.086 | 0.354 | 0.119 |
| SmolLM2-360M instruct | 0.964 | 0.996 | 95% | 0.039 | 0.356 | 0.059 |
| Qwen2.5-0.5B instruct | 0.990 | 0.996 | 97% | 0.280 | 0.434 | 0.314 |
| Qwen3-0.6B | 0.989 | 0.996 | 99% | 0.124 | 0.342 | 0.145 |
| Qwen2.5-1.5B instruct | 0.969 | 0.996 | 78% | 0.051 | 0.432 | 0.073 |
| SmolLM2-1.7B instruct | 0.959 | 0.993 | 91% | 0.075 | 0.336 | 0.090 |
| model | accuracy | difference | change in eRank( ) |
|---|---|---|---|
| base | 59.5 | – | – |
| base + Gaussian update, draw 1 | 4.1 | ( , ) | 0.50% |
| base + Gaussian update, draw 2 | 4.8 | ( , ) | – |
| base + real singular values, random directions | 5.8 | ( , ) | 0.48% |
| instruct (= base + real update) | 64.5 | – | 0.13% |
| instruct + Gaussian update | 11.9 | ( , ) | – |
| edit | unscaled | pass@1 | pass@8 | answered | pass@1 | pass@8 |
|---|---|---|---|---|---|---|
| none | 100% | 62.3 | 85.1 | 97.4% | – | – |
| tail , eRank cutoff (Timber) | 98.9% | 62.3 | 85.3 | 97.1% | ( , ) | ( , ) |
| tail , eRank cutoff (Timber) | 98.9% | 63.1 | 85.9 | 97.1% | ( , ) | ( , ) |
| tail , stable-rank cutoff | 41.4% | 62.9 | 86.9 | 96.0% | ( , ) | ( , ) |
| whole update (same size) | 0% | 65.8 | 87.8 | 96.4% | ( , ) | ( , ) |
| edit | accuracy | accuracy | pass@4 | pass@4 |
|---|---|---|---|---|
| none | 25.9 | – | 46.6 | – |
| tail , eRank cutoff (Timber) | 26.9 | ( , ) | 46.0 | ( , ) |
| tail , eRank cutoff (Timber) | 26.4 | ( , ) | 47.5 | ( , ) |
| tail , eRank cutoff (Timber) | 26.9 | ( , ) | 47.0 | ( , ) |
| tail , stable-rank cutoff | 21.3 | ( , ) | 48.0 | ( , ) |
| whole update, scaled to the stable-rank edit’s size | 22.9 | ( , ) | 54.0 | ( , ) |
Appendix figures & tables10 assets
Supplementary material from the paper’s appendix.
Appendix
| setting | value |
|---|---|
| weights / compute precision | fp32 master weights, bf16 autocast |
| optimizer | 8-bit AdamW, learning rate , no weight decay |
| schedule | cosine, 3% warmup, 3 epochs, gradient clipping at 1.0 |
| batch | 1 sequence 16 accumulation steps |
| sequence length | 512 tokens |
| embeddings | frozen (tied with the output head; not analysed) |
| model | run | steps | loss | stable rank | stable w/o top | hours | |
|---|---|---|---|---|---|---|---|
| Qwen2.5-0.5B | SFT | 1,840 | 1.00 | 10.4 | 0.097 | 0.126 | 2.8 |
| SFT, seed 2 | 1,840 | – | 10.5 | 0.096 | 0.126 | – | |
| wikitext | 1,910 | 2.23 | 12.1 | 0.093 | 0.122 | 2.8 | |
| wikitext, seed 2 | 1,910 | 2.24 | 12.0 | 0.092 | 0.121 | 2.7 | |
| code | 680 | 1.11 | 6.3 | 0.094 | 0.123 | 1.3 | |
| code, seed 2 | 670 | 1.12 | 6.3 | 0.094 | 0.122 | 1.3 |
| model | matrix | |||
|---|---|---|---|---|
| Qwen2.5-0.5B | SFT update | 0.973 | 0.889 | 0.787 |
| wikitext update | 0.972 | 0.886 | 0.775 | |
| code update | 0.975 | 0.895 | 0.799 | |
| shuffled-words update | 0.941 | 0.752 | 0.530 | |
| noise | 0.996 | 0.982 | 0.964 | |
| pretrained | 0.976 | 0.913 | 0.851 |
| matrix | shape | predicted | random-init pair |
|---|---|---|---|
| q , o | 0.250 | 0.252, 0.251 | |
| k , v | 0.527 | 0.536, 0.535 | |
| gate , up | 0.490 | 0.492, 0.492 | |
| down | 0.490 | 0.493 |
| model | matrix | q | k | v | o | gate | up | down |
|---|---|---|---|---|---|---|---|---|
| Qwen2.5-0.5B | SFT update | 0.032 | 0.064 | 0.251 | 0.057 | 0.064 | 0.072 | 0.139 |
| wikitext update | 0.031 | 0.072 | 0.227 | 0.057 | 0.065 | 0.085 | 0.112 | |
| code update | 0.031 | 0.070 | 0.243 | 0.058 | 0.057 | 0.073 | 0.127 | |
| shuffled-words update | 0.011 | 0.043 | 0.124 | 0.021 | 0.023 | 0.026 | 0.048 | |
| noise | 0.252 | 0.536 | 0.535 | 0.251 | 0.492 | 0.492 | 0.493 | |
| pretrained | 0.058 | 0.212 | 0.453 | 0.078 | 0.071 | 0.242 | 0.135 |
| model | update | first quarter | second | third | last quarter |
|---|---|---|---|---|---|
| Qwen2.5-0.5B | SFT | 0.094 | 0.099 | 0.103 | 0.091 |
| wikitext | 0.086 | 0.100 | 0.104 | 0.080 | |
| code | 0.091 | 0.097 | 0.104 | 0.084 | |
| shuffled words | 0.055 | 0.039 | 0.034 | 0.041 | |
| SmolLM2-360M | SFT | 0.023 | 0.027 | 0.029 | 0.021 |
| wikitext | 0.019 | 0.024 | 0.023 | 0.015 |
| update | particip. ratio | noise | above edge | rounding share | zero entries | |
|---|---|---|---|---|---|---|
| SmolLM2-135M instruct | 0.321 | 0.667 | 30 | 28% | 8.1% | 2.5% |
| SmolLM2-360M instruct | 0.239 | 0.668 | 46 | 10% | 7.6% | 2.7% |
| Qwen2.5-0.5B instruct | 0.657 | 0.755 | 22 | 76% | 7.8% | 2.2% |
| Qwen3-0.6B | 0.442 | 0.654 | 72 | 15% | 12.7% | 1.5% |
| Qwen2.5-1.5B instruct | 0.299 | 0.753 | 100 | 94% | 1.2% | 14.0% |
| SmolLM2-1.7B instruct | 0.375 | 0.629 | 140 | 45% | 6.2% | 3.1% |
| pair | Qwen2.5-0.5B | SmolLM2-360M |
|---|---|---|
| SFT vs SFT, seed 2 | 0.32 (0.30, 0.33) | 0.51 (0.50, 0.52) |
| wikitext vs wikitext, seed 2 | 0.30 (0.29, 0.31) | 0.49 (0.47, 0.52) |
| code vs code, seed 2 | 0.26 (0.25, 0.27) | 0.34 (0.33, 0.36) |
| code vs code, steps matched | 0.37 (0.36, 0.39) | 0.54 (0.53, 0.55) |
| SFT vs wikitext | 0.22 (0.21, 0.23) | 0.13 (0.13, 0.14) |
| SFT vs code | 0.20 (0.19, 0.21) | 0.12 (0.12, 0.12) |
| edit | pass@1 | pass@8 | answered | pass@1 | pass@8 |
|---|---|---|---|---|---|
| none | 63.4 | 84.7 | 96.5% | – | – |
| tail , eRank cutoff | 63.9 | 87.7 | 96.7% | ( , ) | ( , ) |
| tail , eRank cutoff | 64.0 | 85.7 | 96.8% | ( , ) | ( , ) |
| tail , eRank cutoff | 64.7 | 88.0 | 96.8% | ( , ) | ( , ) |
| tail , stable-rank cutoff | 59.3 | 83.0 | 90.6% | ( , ) | ( , ) |
| tail , stable-rank cutoff | 64.5 | 87.3 | 95.1% | ( , ) | ( , ) |