A pretrained model arrives as billions of knobs, nudged downhill across a vast landscape until they settle into a capable configuration. It is rarely the configuration anyone wants. A model may need to answer in a house style, to reason about legal contracts, to write to a particular register, or to cover a speciality the general model knows only vaguely. The obvious fix is to keep training it on more specific data — a step called fine-tuning — and fine-tuning works. The trouble is that fine-tuning a giant model the ordinary way means adjusting all of its billions of knobs, which demands the same crushing hardware, memory and expense as the original training run, and produces a second full copy of an enormous model for every task. LoRA — short for Low-Rank Adaptation — sidesteps both costs by training a small set of new knobs and leaving the original untouched. This piece is about how that small set can be enough, what it saves, and what it cannot change.
The problem with fine-tuning the whole thing
Picture the situation concretely. A large model’s knowledge lives in great grids of numbers — the weight matrices that sit inside every block of the tower. Each grid can hold millions of numbers, and there are hundreds of them. Ordinary fine-tuning reaches into every one of those grids, adjusts every number, and saves the whole altered set as a new model. Ten specialized tasks, ten full copies. Each may run to hundreds of gigabytes. Every one of those runs also needed enough memory to hold not just the model but all the bookkeeping training demands — the momentum and per-knob step sizes the optimizer keeps — several times over.
This is wasteful, and there is a reason to suspect it is wasteful by a large factor. Adapting a model to a new task is not teaching it language from scratch; it already knows language. The adjustment is small — a nudge in a particular direction. The suspicion, which turns out to be correct, is that this adjustment is far simpler than the giant grids it is applied to. A simple change should be cheap to describe.
The key idea: the change is smaller than it looks
Here is the observation at the heart of LoRA. When a weight grid is fine-tuned, the difference between the original grid and the fine-tuned one — call it $\Delta W$, the change made — has a hidden simplicity. Though it is a huge grid of numbers, that grid of changes can be reconstructed almost perfectly from far fewer numbers than it appears to contain. In the language of linear algebra, $\Delta W$ has low rank: it carries much less independent information than its size suggests.
Consider a large printed grid in which every row is a multiple of one single pattern — the second row twice the first, the third five times the first, and so on. The grid looks as though it holds hundreds of independent values. It holds one pattern and a list of multipliers. Nothing else is stored. That is what low rank means: a big grid that is the product of two much narrower ones. LoRA’s bet is that the change a fine-tune wants to make has this character.
Building the change from two narrow grids
So instead of learning the full change $\Delta W$ directly, LoRA learns two small grids whose product is the change. Suppose the original weight grid is $d$ rows by $d$ columns — a thousand by a thousand, a million numbers. LoRA introduces two new grids: a tall narrow one, $A$, of size $d \times r$, and a short wide one, $B$, of size $r \times d$, where $r$ — the rank — is a small number like 8 or 16. Their product $B A$ has the same shape as the original grid, $d \times d$, so it can stand in for the change:
$$W_{\text{adapted}} = W_0 + \Delta W = W_0 + B A$$Here $W_0$ is the original, frozen weight grid. It never changes. All the learning happens inside $A$ and $B$, and the arithmetic settles the case. The full grid holds $d \times d$ numbers — a million if $d$ is a thousand. $A$ and $B$ together hold $2 \times d \times r$ — with $r = 8$, about sixteen thousand, roughly one-sixtieth. Across a whole model the trainable share is often well under one percent, and it recovers most of the benefit of a full fine-tune.
Figure 1. A million numbers rebuilt from sixteen thousand.
What actually happens during training
The picture during fine-tuning is now simple. The original model is frozen, so none of its knobs move and none of the heavy training bookkeeping has to be stored for them. Alongside each weight grid sits an $A$ and $B$ pair, and only these are trained by the ordinary downhill walk. The trainable part is small, so the memory and compute demands collapse to what one modest machine can hold. The alternative was a cluster.
One detail carries more weight than its size suggests. At the start of training the adapted model should behave exactly like the original, so that adaptation begins from a clean slate. LoRA arranges this by initializing $B$ to all zeros, so $BA$ starts at zero and adds nothing. At the first step the model is untouched; from there $A$ and $B$ take up the adjustment the task calls for. A scaling factor, often written $\alpha / r$, sets how strongly the learned change is applied.
Two payoffs: cheap to train, and cheap to keep
The first payoff is the one the argument has been driving at: training becomes affordable, because the optimizer works on a small set of knobs instead of billions. The second is as valuable and more often overlooked. Since the original model is never modified, there is no new copy per task. What gets stored is the $A$ and $B$ grids — often a few megabytes — as an adapter attached to the shared, frozen base. One base model sits in memory while dozens of adapters take turns: one for legal writing, one for a house register, one for medical questions. Swapping tasks costs a few megabytes of transfer rather than a second model.
The adapter can also be merged permanently into the base: because $W_0 + BA$ is another grid of the same shape, that sum can be computed once and baked in, producing a fine-tuned model with no extra run-time cost. The two properties do not survive together. Merging is what buys the zero-cost forward pass, and it is also what discards the interchangeability the adapter existed for.
Figure 2. A copy per task against one base and many adapters.
Why it works so well, and where it stops
It would be reasonable to expect that training a thousandth of the knobs buys a thousandth of the quality. It does not. On a great many tasks LoRA comes close to full fine-tuning, and sometimes matches it. The reason returns to the opening observation: adapting a model that already knows language is a small, structured intervention rather than a rebuild. The base has done the work of learning how words relate, and the task-specific adjustment is simple enough to live in two narrow grids. The tool is matched to the size of the job. That is the whole of it.
Which is also where it stops. The rank $r$ is fixed before the run, and an adaptation whose true change is not low-rank will underfit however long it trains. The diagnosis is a sweep: raise $r$ and see whether quality follows. That costs the runs the method was meant to save.
The deeper point is that LoRA changes the price of fine-tuning and not what fine-tuning is. It is a parameterisation, not an objective, so it carries whatever ceiling the objective it serves already had — trained on demonstrations it inherits the ceiling the article on supervised fine-tuning describes, and that article is also clear that preference methods and verifiable rewards are what break it. LoRA can parameterise those too. What the frozen base does constrain is the kind of change on offer: a few thousand numbers per matrix reshape behaviour and format far more readily than they install knowledge the weights never held.
Figure 3. The rank is fixed before the evidence arrives.
What to carry forward
LoRA adapts a giant model to a new task without touching the model itself. It freezes the original weights and learns only the change, exploiting the fact that this change has low rank — it can be rebuilt from two small grids, $A$ and $B$, whose product $BA$ stands in for a full weight adjustment, roughly one-sixtieth of the numbers at $r = 8$. Training only those two grids brings the memory and cost of fine-tuning down to a single machine, and because the base is never altered, each task is saved as a small attachable adapter rather than a duplicate model; merging trades that interchangeability back for a free forward pass. It is what turned fine-tuning from a capital expense into a routine one. The trade underneath is that the rank is fixed before any evidence arrives, and a change that is not low-rank plateaus quietly, diagnosable only by spending the runs the method saved. And the saving is in the price of the stage rather than its reach: a few thousand numbers per matrix move behaviour and format much more readily than knowledge, which is why QLoRA went after the size of the frozen base and not the ceiling above it.
The figures in this article follow the shared figure key , which explains what every shape, line style and colour means.