Learn the Directions, Normalize the Gains: Post-Training Normalization for LoRA
Organizations: Singapore Management University · National University of Singapore · Peking University
Abstract
While Low-Rank Adaptation (LoRA) enables efficient task specialization, its learned updates can compromise capabilities beyond the target task. We identify \textbf{adaptation imbalance}: a few singular directions dominate the trained update, leaving its performance sensitive to how gains are allocated. We argue that \textbf{learning where to adapt does not ensure that adaptation gains are well balanced}. This motivates \textbf{LoRA-Norm}, a post-training normalization method that retains learned directions while rebalancing their gains. LoRA-Norm combines spectral rebalancing, a fixed nonlinear transformation of singular values, with nuclear-norm restoration, which preserves the original total spectral mass. It requires no calibration data or additional training and introduces no inference overhead. Across two backbones and three adaptation tasks, LoRA-Norm improves average specialization and capability retention, outperforming the evaluated post-hoc spectral pruning and gradient-guided editing configurations on both measures. Stronger functional equalization brings no consistent additional gains, revealing that balancing adapter gains and equalizing their responses are distinct objectives.
Figures & tables
| Target (%) | Off (%) | FG (pp) | ||||
| Task | LoRA | LoRA-Norm | LoRA | LoRA-Norm | LoRA | LoRA-Norm |
| Qwen3-8B | ||||||
| Magicoder | 64.23 1.27 | 74.59 0.35 | 78.04 0.45 | 81.26 0.07 | 1.67 0.48 | 0.00 0.00 |
| MetaMath | 84.05 0.09 | 87.47 0.68 | 68.16 4.10 | 75.28 1.23 | 4.95 4.05 | 0.00 0.00 |
| Tulu | 66.97 0.83 | 71.41 0.91 | 85.63 0.46 | 84.93 0.44 | 0.00 0.00 | 0.00 0.00 |
| Llama-3.1-8B-Instruct | ||||||
| Method | Params retained (%) | Target (%) | Off (%) | FG (pp) |
| Base | — | 66.47 | 69.99 | 0.00 |
| LoRA | 100 | 68.00 | 69.55 | 2.71 |
| PARA ( ) | 38.16 | 68.78 | 70.01 | 2.37 |
| PARA ( ) | 54.28 | 68.58 | 69.64 | 2.70 |
| PARA ( ) | 80.16 | 68.44 | 69.78 | 2.56 |
| Spectral Surgery | — | 68.76 | 68.28 | 3.72 |
Appendix figures & tables38 assets
Supplementary material from the paper’s appendix.
Appendix
| Training task | Target category | Examples | Metric | Tokens |
| Magicoder | HumanEval | 164 | Greedy pass@1 | 512 |
| MetaMath | GSM8K | 1,319 | Strict accuracy | 512 |
| Tulu | IFEval | 541 | Prompt strict | 2,048 |
| — | Commonsense-8 | 22,419 | Macro accuracy | 8 |
| Method | Target | vs. LoRA | W/T/L |
| LoRA | 68.040 | 0.000 | 0/18/0 |
| Flat-Fro | 71.731 | 3.691 | 16/0/2 |
| Flat-Nuclear | 72.014 | 3.974 | 16/1/1 |
| DG-Hard | 68.040 | 0.000 | 0/18/0 |
| LoRA-Norm | 72.165 | 4.125 | 17/1/0 |
| Base | Task | Epochs | Length | Batch | LR | Schedule | |
|---|---|---|---|---|---|---|---|
| Qwen | Code | 1 | 4096 | .999 | Cosine | ||
| Qwen | Math | 3 | 4096 | .999 | Cosine | ||
| Qwen | Instr. | 2 | 4096 | .999 | Cosine | ||
| Llama | Code | 1 | 4096 | .999 | Cosine | ||
| Llama | Math | 3 | 1024 | .95 | CosMin | ||
| Llama | Instr. | 2 | 1024 | .95 | CosMin |
| Source | Recorded settings and differences |
|---|---|
| Qwen / Code | Model card: 50K examples, 1 epoch, length 4096, global batch 32, LR 2e-5, rank 16, seed 42. Micro-batch and complete optimizer/Trainer settings are unverified. |
| Qwen / Math | Run arguments: 3 epochs, length 4096, global batch 32, LR 1e-4, requested warmup .05, batch . Runs 43/44 use and zero actual warmup; subset identity across JSON/parquet records is unverified. |
| Qwen / Instr. | Run arguments: 29,980 examples, 2 epochs, length 4096, global batch 128, LR 4e-4, requested warmup .03, batch . Runs 43/44 use , padding to a multiple of eight, and zero actual warmup; subset identity is unverified. |
| Llama / Code | Source documentation: 50K examples, 1 epoch, length 4096, global batch 32, LR 2e-5, rank/alpha 16/32. Training seed and complete Trainer settings are unverified. |
| Llama / Math | Model card: MetaMath 50K, rank 16. Training seed and complete recipe are unverified. |
| Llama / Instr. | Model card: length 1024, global batch 128, rank 16, seed 42. Complete optimizer and schedule settings are unverified. |
| Method | Target | Off | FG | FPR | |
|---|---|---|---|---|---|
| LoRA | 67.998 | 69.551 | 2.708 | 2.023 | 1.0000 |
| HNS | 72.083 | 72.792 | 0.344 | 7.345 | 0.0972 |
| F-HNS 0.5 | 72.108 | 72.586 | 0.254 | 12.728 | 0.0636 |
| F-HNS 1 | 71.596 | 72.284 | 0.289 | 15.982 | 0.0536 |
| PF | 71.322 | 72.340 | 0.313 | 16.000 | 0.0535 |
| Base | Task | LoRA | HNS | F-HNS 0.5 | F-HNS 1 | PF |
|---|---|---|---|---|---|---|
| Qwen | Code | |||||
| Qwen | Math | |||||
| Qwen | Instr. | |||||
| Llama | Code | |||||
| Llama | Math | |||||
| Llama | Instr. |
| Base | Task | LoRA | HNS | F-HNS 0.5 | F-HNS 1 | PF |
|---|---|---|---|---|---|---|
| Qwen | Code | |||||
| Qwen | Math | |||||
| Qwen | Instr. | |||||
| Llama | Code | |||||
| Llama | Math | |||||
| Llama | Instr. |
| Base | Task | LoRA | HNS | F-HNS 0.5 | F-HNS 1 | PF |
|---|---|---|---|---|---|---|
| Qwen | Code | |||||
| Qwen | Math | |||||
| Qwen | Instr. | |||||
| Llama | Code | |||||
| Llama | Math | |||||
| Llama | Instr. |
| Method | Target | W/T/L | Off | W/T/L | FG | W/T/L |
|---|---|---|---|---|---|---|
| F-HNS 0.5 | 0.025 | 10/0/8 | -0.205 | 7/0/11 | -0.091 | 4/11/3 |
| F-HNS 1 | -0.488 | 9/3/6 | -0.507 | 5/0/13 | -0.055 | 4/9/5 |
| PF | -0.762 | 9/1/8 | -0.451 | 5/0/13 | -0.032 | 3/9/6 |
| Base | Task | Run | LoRA | HNS | F-HNS 0.5 | F-HNS 1 | PF |
|---|---|---|---|---|---|---|---|
| Qwen | Code | 42 | 65.244 | 75.000 | 70.732 | 68.293 | 67.683 |
| Qwen | Code | 43 | 62.805 | 74.390 | 73.780 | 68.902 | 68.902 |
| Qwen | Code | 44 | 64.634 | 74.390 | 72.561 | 67.683 | 68.293 |
| Qwen | Math | 42 | 84.155 | 88.173 | 88.249 | 87.945 | 87.566 |
| Qwen | Math | 43 | 84.003 | 86.808 | 86.732 | 86.732 | 86.884 |
| Qwen | Math | 44 | 84.003 | 87.415 | 87.870 | 87.642 | 87.718 |
| Base | Task | Run | LoRA | HNS | F-HNS 0.5 | F-HNS 1 | PF |
|---|---|---|---|---|---|---|---|
| Qwen | Code | 42 | 1.900 | 0.000 | 0.000 | 0.000 | 0.000 |
| Qwen | Code | 43 | 1.986 | 0.000 | 0.000 | 0.000 | 0.000 |
| Qwen | Code | 44 | 1.111 | 0.000 | 0.000 | 0.000 | 0.000 |
| Qwen | Math | 42 | 1.799 | 0.000 | 0.000 | 0.000 | 0.000 |
| Qwen | Math | 43 | 3.523 | 0.000 | 0.000 | 0.000 | 0.000 |
| Qwen | Math | 44 | 9.522 | 0.000 | 0.000 | 0.000 | 0.000 |
| Base | Task | Run | LoRA | HNS | F-HNS 0.5 | F-HNS 1 | PF |
|---|---|---|---|---|---|---|---|
| Qwen | Code | 42 | 77.798 | 81.333 | 80.407 | 80.018 | 79.967 |
| Qwen | Code | 43 | 77.759 | 81.191 | 80.825 | 80.184 | 80.209 |
| Qwen | Code | 44 | 78.553 | 81.257 | 80.231 | 80.373 | 80.314 |
| Qwen | Math | 42 | 71.293 | 74.920 | 75.249 | 75.925 | 75.703 |
| Qwen | Math | 43 | 69.666 | 76.650 | 77.195 | 77.689 | 77.517 |
| Qwen | Math | 44 | 63.515 | 74.259 | 73.947 | 74.417 | 74.787 |
| Method | Raw FPR | Full PR | Energy ratio | RMS ratio |
|---|---|---|---|---|
| LoRA | 2.023 | 1.844 | 1.000 | 1.000 |
| HNS | 7.345 | 5.392 | 0.097 | 0.288 |
| F-HNS 0.5 | 12.728 | 8.831 | 0.064 | 0.219 |
| F-HNS 1 | 15.982 | 12.113 | 0.054 | 0.198 |
| PF | 16.000 | 12.130 | 0.053 | 0.197 |
| Audit | Module rows | Maximum relative error |
|---|---|---|
| Scalar-E / Flat-E: analytic energy | 8568 | |
| Scalar-E / Flat-E: saved energy | 8568 | |
| Scalar-F: saved Frobenius norm | 4284 |
| Method | Calibration | Target | Off | FG |
|---|---|---|---|---|
| LoRA | — | 67.998 | 69.551 | 2.708 |
| HNS | No | 72.083 | 72.792 | 0.344 |
| Scalar-F | No | 70.643 | 71.558 | 1.111 |
| Scalar-E | Yes | 72.700 | 72.470 | 0.525 |
| Flat-E | Yes | 72.273 | 72.566 | 0.396 |
| Base | Task | Run | HNS | Scalar-F | Scalar-E | Flat-E |
|---|---|---|---|---|---|---|
| Qwen | Code | 42 | 75.000 | 75.000 | 75.610 | 75.610 |
| Qwen | Code | 43 | 74.390 | 68.902 | 76.829 | 75.000 |
| Qwen | Code | 44 | 74.390 | 69.512 | 77.439 | 75.000 |
| Qwen | Math | 42 | 88.173 | 84.913 | 86.960 | 88.249 |
| Qwen | Math | 43 | 86.808 | 85.064 | 86.126 | 87.339 |
| Qwen | Math | 44 | 87.415 | 85.823 | 85.444 | 87.642 |
| Base | Task | Run | HNS | Scalar-F | Scalar-E | Flat-E |
|---|---|---|---|---|---|---|
| Qwen | Code | 42 | 81.333 | 79.632 | 81.648 | 81.405 |
| Qwen | Code | 43 | 81.191 | 80.063 | 80.831 | 80.835 |
| Qwen | Code | 44 | 81.257 | 80.051 | 81.613 | 81.292 |
| Qwen | Math | 42 | 74.920 | 73.778 | 73.380 | 74.172 |
| Qwen | Math | 43 | 76.650 | 73.019 | 74.389 | 76.533 |
| Qwen | Math | 44 | 74.259 | 70.264 | 72.868 | 74.477 |
| Base | Task | Run | HNS | Scalar-F | Scalar-E | Flat-E |
|---|---|---|---|---|---|---|
| Qwen | Code | 42 | 0.000 | 0.253 | 0.000 | 0.000 |
| Qwen | Code | 43 | 0.000 | 0.101 | 0.000 | 0.000 |
| Qwen | Code | 44 | 0.000 | 0.000 | 0.000 | 0.000 |
| Qwen | Math | 42 | 0.000 | 0.000 | 0.407 | 0.000 |
| Qwen | Math | 43 | 0.000 | 0.493 | 0.000 | 0.000 |
| Qwen | Math | 44 | 0.000 | 3.160 | 1.016 | 0.000 |
| Base | Task | Method | Target | Off | FG |
|---|---|---|---|---|---|
| Qwen | Code | HNS | |||
| Qwen | Code | Scalar-F | |||
| Qwen | Code | Scalar-E | |||
| Qwen | Code | Flat-E | |||
| Qwen | Math | HNS | |||
| Qwen | Math | Scalar-F |
| Comparison | Outcome | Mean | CI low | CI high |
|---|---|---|---|---|
| HNS Scalar-E | Target | -0.616 | -1.640 | 0.249 |
| HNS Scalar-E | Off | 0.322 | -0.125 | 0.828 |
| HNS Scalar-E | FG | -0.181 | -0.346 | -0.037 |
| HNS Flat-E | Target | -0.190 | -0.616 | 0.259 |
| HNS Flat-E | Off | 0.225 | 0.104 | 0.356 |
| HNS Flat-E | FG | -0.052 | -0.138 | 0.025 |
| Group | Comparison | Outcome | Mean | CI low | CI high |
|---|---|---|---|---|---|
| Qwen/Code | HNS Scalar-E | Target | -2.033 | -3.049 | -0.610 |
| Qwen/Code | HNS Scalar-E | Off | -0.104 | -0.356 | 0.360 |
| Qwen/Code | HNS Scalar-E | FG | 0.000 | 0.000 | 0.000 |
| Qwen/Code | HNS Flat-E | Target | -0.610 | -0.610 | -0.610 |
| Qwen/Code | HNS Flat-E | Off | 0.083 | -0.072 | 0.356 |
| Qwen/Code | HNS Flat-E | FG | 0.000 | 0.000 | 0.000 |
| Cohort | PR | Outcome | Model | Rank | ||
|---|---|---|---|---|---|---|
| A | Raw | Target gain | Energy | 0.2120 | 0.1927 | 1 |
| A | Raw | Target gain | FPR | 0.0148 | -0.0206 | 1 |
| A | Raw | Target gain | Energy+FPR | 0.3004 | 0.2127 | 2 |
| A | Full | Target gain | Energy | 0.2120 | 0.1927 | 1 |
| A | Full | Target gain | FPR | 0.0077 | -0.0276 | 1 |
| A | Full | Target gain | Energy+FPR | 0.3235 | 0.2404 | 2 |
| Cohort | PR | Outcome | CI low | CI high | ||
|---|---|---|---|---|---|---|
| A | Raw | Target gain | 0.0884 | 0.0201 | -0.2344 | 0.1290 |
| A | Full | Target gain | 0.1115 | 0.0477 | -0.2156 | 0.1657 |
| A | Raw | Off gain | 0.0480 | 0.0327 | -0.0446 | 0.1432 |
| A | Full | Off gain | 0.0692 | 0.0559 | -0.0387 | 0.1976 |
| A | Raw | FG reduction | 0.0201 | 0.0131 | -0.0289 | 0.0563 |
| A | Full | FG reduction | 0.0268 | 0.0179 | -0.0475 | 0.0656 |
| Cohort | Feature | Outcome | CI low | CI high | Defined | |
|---|---|---|---|---|---|---|
| A | Energy | Target gain | -0.3879 | -0.5921 | -0.1573 | 18/18 |
| A | Raw | Target gain | 0.2983 | 0.0477 | 0.5098 | 18/18 |
| A | Full | Target gain | 0.3103 | 0.0727 | 0.5265 | 18/18 |
| A | Energy | Off gain | -0.0082 | -0.2677 | 0.2595 | 18/18 |
| A | Raw | Off gain | -0.0270 | -0.2603 | 0.2243 | 18/18 |
| A | Full | Off gain | -0.0270 | -0.2673 | 0.2103 | 18/18 |
| State | Interpretation |
|---|---|
| 000 | All three models are incorrect. |
| 001 | New success: both Base and LoRA are incorrect; the edit is correct. |
| 010 | A LoRA-only success is lost after editing. |
| 011 | A LoRA-only success is retained after editing. |
| 100 | A base success lost by LoRA remains incorrect after editing. |
| 101 | A base success lost by LoRA is recovered after editing. |
| Role | Method | Recovery | Retention | New success | New damage | R/T |
|---|---|---|---|---|---|---|
| Overall | HNS | 62.351 | 62.288 | 4553 | 3163 | 18/18 |
| Overall | Scalar-E | 62.876 | 63.220 | 3893 | 3462 | 18/18 |
| Overall | Flat-E | 62.430 | 62.464 | 4487 | 3200 | 18/18 |
| Target | HNS | 58.059 | 72.368 | 306 | 232 | 18/18 |
| Target | Scalar-E | 65.414 | 70.811 | 286 | 265 | 18/18 |
| Target | Flat-E | 59.439 | 72.833 | 308 | 235 | 18/18 |
| Method | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
|---|---|---|---|---|---|---|---|---|
| HNS | 81930 | 4553 | 10078 | 12267 | 11080 | 16893 | 3163 | 300010 |
| Scalar-E | 82590 | 3893 | 9928 | 12417 | 11883 | 16090 | 3462 | 299711 |
| Flat-E | 81996 | 4487 | 10026 | 12319 | 11105 | 16868 | 3200 | 299973 |
| Benchmark | Method | Recovery | Retention | New success | New damage | R/T |
|---|---|---|---|---|---|---|
| HumanEval | HNS | 57.949 | 68.271 | 70 | 44 | 18/18 |
| HumanEval | Scalar-E | 58.140 | 69.631 | 67 | 40 | 18/18 |
| HumanEval | Flat-E | 58.476 | 67.168 | 71 | 46 | 18/18 |
| GSM8K | HNS | 62.983 | 70.737 | 693 | 487 | 18/18 |
| GSM8K | Scalar-E | 64.978 | 71.324 | 691 | 529 | 18/18 |
| GSM8K | Flat-E | 62.229 | 71.750 | 653 | 478 | 18/18 |
| Role | Comparison | Metric | Mean | CI low | CI high |
|---|---|---|---|---|---|
| Overall | HNS Scalar-E | Recovery | -0.524 | -2.587 | 1.770 |
| Overall | HNS Scalar-E | Retention | -0.932 | -2.657 | 0.969 |
| Overall | HNS Flat-E | Recovery | -0.079 | -0.627 | 0.508 |
| Overall | HNS Flat-E | Retention | -0.176 | -0.821 | 0.479 |
| Overall | Scalar-E Flat-E | Recovery | 0.446 | -1.810 | 2.332 |
| Overall | Scalar-E Flat-E | Retention | 0.756 | -1.063 | 2.292 |
| Record | Purpose |
|---|---|
| provenance.json | Source paths, code provenance, reuse and audit records. |
| source_checkpoints.json | The 18 retained source identities and configurations. |
| evaluation_sources.tsv | Evaluation reference/cache lineage and input-identity checks. |
| four_method_checkpoint_results.tsv | Four edited methods, checkpoint scores and eight commonsense components. |
| four_method_paired_ci.tsv | All method-pair performance intervals for overall and fixed groups. |
| module_energy_audit.tsv | Per-module analytic/saved energy matching. |
| Comparator | Metric | Difference | CI low | CI high |
| PARA | Target | +3.306 | +1.496 | +5.348 |
| PARA | Off | +2.779 | +1.506 | +4.116 |
| PARA | FG | -2.027 | -3.129 | -1.080 |
| PARA | Target | +3.501 | +2.114 | +5.063 |
| PARA | Off | +3.156 | +1.757 | +4.547 |
| PARA | FG | -2.351 | -3.502 | -1.401 |
| Base | Task | Run | Method | Target | Off | FG |
|---|---|---|---|---|---|---|
| Llama | Code | 42 | PARA | 56.707 | 61.146 | 4.152 |
| Llama | Code | 42 | PARA | 54.878 | 61.489 | 3.809 |
| Llama | Code | 42 | PARA | 53.659 | 60.559 | 4.740 |
| Llama | Code | 42 | Spectral Surgery | 54.268 | 59.375 | 5.924 |
| Llama | Code | 43 | PARA | 56.098 | 61.743 | 4.439 |
| Llama | Code | 43 | PARA | 54.878 | 61.690 | 4.315 |
| Qwen3-8B | Llama-3.1-8B-Instruct | |||||
| Setting | HE | GSM | IF | HE | GSM | IF |
| Base | 66.46 | 85.67 | 70.61 | 52.44 | 62.40 | 62.11 |
| LoRA | 66.46 | 84.15 | 67.65 | 53.66 | 77.10 | 63.22 |
| (rebuild) | 67.68 | 84.53 | 67.65 | 54.27 | 77.33 | 63.59 |
| 75.61 | 88.25 | 70.06 | 53.66 | 80.89 | 65.06 | |
| 74.39 | 88.25 | 70.79 | 54.27 | 80.82 | 65.06 | |
| Setting | Mean gain | Median gain | Win / tie / loss |
| (rebuild) | +0.47 | +0.37 | 5 / 1 / 0 |
| +3.55 | +3.10 | 5 / 1 / 0 | |
| +3.56 | +3.43 | 6 / 0 / 0 | |
| +3.46 | +2.79 | 5 / 1 / 0 | |
| +3.62 | +3.74 | 5 / 1 / 0 | |
| 4+1 | +3.57 | +3.08 | 6 / 0 / 0 |
| Base | Target | Gain | 95% interval | |
| Qwen | HumanEval | +8.54 | 0.213 | |
| Qwen | GSM8K | +3.87 | ||
| Qwen | IFEval | +2.59 | 0.448 | |
| Llama | HumanEval | +1.22 | 1.000 | |
| Llama | GSM8K | +3.56 | ||
| Llama | IFEval | +1.66 | 1.000 |
| Strict | Numeric | |
| 1.00 | 84.77 | 85.16 |
| 0.85 | 85.55 | 86.72 |
| 0.70 | 85.94 | 87.50 |
| 0.60 | 85.16 | 86.72 |
| 0.50 | 86.72 | 88.67 |
| 0.40 | 88.67 | 91.02 |
| Variant | Strict | Numeric |
| Original LoRA | 83.40 | 84.57 |
| Common-basis zero rebuild | 82.81 | 83.98 |
| Common-basis global scalar ( ) | 85.74 | 88.87 |
| Common-basis per-module norm-matched scalar | 84.77 | 86.72 |
| Common-basis archived HNS | 86.13 | 88.67 |
| Archived HNS in its existing representation | 86.72 | 89.45 |