The useful part, up front

What you’ll take away

  • Low-rank updates can be dense: fewer factor parameters do not imply only a few changed matrix entries.
  • The rank bound applies to the update, while the combined base-plus-update matrix can retain higher rank.
  • Count every adapted matrix and any additional trainable parameters before reporting a whole-model saving.
  • An adapter checkpoint requires the intended base and configuration; matching shapes are insufficient.
  • Merging preserves the fixed linear map algebraically, while implementation support and task quality need their own checks.
01

Low rank does not mean changing only a few selected weights

A LoRA adapter can contain far fewer trainable numbers than the weight matrix it adjusts. That does not mean it chooses a few entries in that matrix and leaves all the others untouched. Its two factors combine to form an update. In the small example below, seven factor entries produce an update that changes all twelve entries of a four-by-three weight matrix. The update has rank one, while the combined weight matrix still has rank three. Those statements describe different properties and can all be true at once.

The original LoRA method keeps the base weight matrix frozen while training smaller factors whose product supplies an added update. [1] We will use a bias-free linear layer and explicit numbers to follow that product through one input. Dropout is absent and the initial scale is one. This is an analytical example, not a model-training result. Its purpose is to make three practical distinctions visible: how many factor entries are trainable, how many entries of the effective matrix change, and which base weights are still needed to use the adapter. Once those objects are kept separate, parameter counts, adapter files and merged models become much easier to compare without assigning them the same meaning.

All twelve entries change when the update is added. Original matrices in column-vector convention; each tuple is one matrix row.
Original matrices in column-vector convention; each tuple is one matrix row. · Ameer Journal — original explanatory diagramOriginal editorial illustration; no third-party artwork reused.
02

Put all the numbers on the page

Our input has three numbers: x=(1,2,−1). The base matrix W0 has four rows: (1,0,0), (0,1,0), (0,0,1), and (1,1,0). Each row takes a weighted sum of the input. The first row returns 1, the second 2, the third −1, and the fourth 1+2=3. Therefore the base output is (1,2,−1,3). Four output coordinates come from three input coordinates; that is why the matrix is four by three.

Now define the adapter factors. A is the single row (2,−1,1). B is the single column (1,2,3,−1). A first reduces the three-number input to one number, and B expands that number to four output adjustments. The size of this intermediate space is our chosen rank setting, one. We will add those adjustments to the base output, rather than feeding the base output through the adapter. That parallel use of the same input is part of the LoRA construction. [1] Keeping the matrix shapes visible prevents a common mental mix-up: the adapter's small intermediate dimension does not change the layer's final output size. It still returns four numbers, ready for the same downstream interface.

03

Follow the small branch and add its result

First multiply A by the input. The calculation is 2×1+(−1)×2+1×(−1)=−1. The adapter's intermediate result is one number, −1. Multiply it by B to obtain (−1,−2,−3,1). These are adjustments to the four base-output coordinates. Adding them to (1,2,−1,3) gives the final result (0,0,−4,4).

Notice what rank one allows here. All four output adjustments can be nonzero, but they must follow the same fixed direction B for this fixed adapter. Another input changes the scalar produced by A. It scales that direction instead of independently choosing four unrelated adjustments. For example, the input z=(1,2,0) gives Az=0, so its adapter adjustment is the zero vector even though the factors themselves are nonzero. This is a constraint on how the update responds across inputs, not a rule that one output coordinate changes. A low-rank update can therefore be broad in where it acts while restricted in the kinds of changes it can express. The two views become consistent once we follow the multiplication rather than interpreting “one” as a count of edited weights.

One intermediate number produces four output adjustments. Original input x = (1, 2, −1). Both the base and adapter branches receive this same input.
Original input x = (1, 2, −1). Both the base and adapter branches receive this same input. · Ameer Journal — original explanatory diagramOriginal editorial illustration; no third-party artwork reused.
04

The update is rank one; the combined matrix is not

Form the full update by multiplying the column B by the row A. Its rows are (2,−1,1), (4,−2,2), (6,−3,3), and (−2,1,−1). All twelve entries are nonzero. Yet every row is a multiple of the first row, so the update has rank one. It can be dense and low rank at the same time. Dense means its entries are nonzero in this example; low rank describes the dependence between its rows or columns.

Adding this update to W0 gives rows (3,−1,1), (4,−1,2), (6,−3,4), and (−1,2,−1). These rows are no longer all multiples of one row. The first three form a three-by-three matrix with determinant 4, which is nonzero, so the combined matrix has rank three. Three is its maximum possible rank because it has only three columns. You do not need to calculate determinants to use an adapter, but this check makes the distinction exact. LoRA restricts the form of the added change in this setup. It has not compressed the entire original transformation into a one-dimensional map. The base matrix continues to contribute its own structure after the update is added.

05

Count factor entries before claiming a saving

Our four-by-three base matrix contains twelve entries. A rank-one A contains three and B contains four, so the adapter contains seven trainable factor entries. Those seven values describe the twelve-entry update through multiplication. If the base stays frozen, twelve base entries still exist, but they are not the entries being adjusted by the adapter optimizer. Microsoft’s reference workflow explicitly marks LoRA parameters as trainable and saves those parameters separately. [4]

The general count for a d-by-k matrix and rank setting r is r×k+d×r, or r(d+k). A full matrix has d×k entries. This does not guarantee a saving for every chosen shape and rank. In our tiny example, rank two would require 2×3+4×2=14 factor entries, more than the twelve entries of the full matrix. For a larger illustrative case, a 4096-by-4096 matrix has 16,777,216 entries. Rank eight requires 8×4096+4096×8=65,536 factor entries: one 256th of the base count, or 0.390625%. That is a count for one specified matrix, not for an entire model. To produce a whole-model count, identify every adapted layer and include any other parameters that the configuration also trains.

06

A small adapter still needs its base

Keep the larger example and assume every stored value occupies exactly two bytes. The 4096-by-4096 base then needs 33,554,432 bytes, or 32 MiB. The rank-eight factors need 131,072 bytes, or 128 KiB. Storing both takes 32.125 MiB for these weight values. The adapter is small beside the base, but using the two together has not reduced this matrix’s stored values to 128 KiB. The original transformation remains part of the computation.

That distinction explains an adapter download that looks surprisingly tiny. PEFT’s checkpoint documentation says its adapter state does not contain the base model, and loading the adapted model requires the original model as well. [3] Our byte arithmetic excludes file headers, configuration, activations, gradients, optimizer state and runtime buffers. Those exclusions matter when estimating memory needed to train or serve a complete model. A count of trainable factor values cannot by itself predict peak device memory. It does, however, answer a precise storage question: how many numerical values must be kept for this particular change? If several compatible adapters share one retained base, their separate change files may be much smaller than several complete adapted checkpoints. The shared base and the configuration needed to connect each change to it still belong in the deployment record.

The adapter is small while the base remains stored. Separate 4096×4096 matrix, rank 8. Exactly two bytes per value; excludes metadata and all runtime/training buffers.
Separate 4096×4096 matrix, rank 8. Exactly two bytes per value; excludes metadata and all runtime/training buffers. · Ameer Journal — original explanatory diagramOriginal editorial illustration; no third-party artwork reused.
07

Rank, scale and initialization control different things

The worked example used scale one. Keep A, B and x fixed, but multiply the adapter contribution by two. The base output remains (1,2,−1,3), while the adjustment becomes (−2,−4,−6,2). The new total is (−1,−2,−7,5). The update still has rank one; changing this nonzero scale changes its magnitude, not the number of independent directions it can express. This is a useful distinction when two adapters have the same rank setting but produce different adjustments.

For ordinary LoRA scaling, the referenced PEFT configuration uses alpha divided by r. It also offers a rank-stabilized option using alpha divided by the square root of r. [2] Record the actual convention instead of inferring scale from the rank alone. Initialization is another separate choice. The documented default sets B to zero, making the initial added update zero before training. [2] Our nonzero factors were chosen for arithmetic, not obtained from that initialization by a training run. A rank setting of one is an upper bound on the product’s rank; if one factor is zero, the product has rank zero. Therefore the configuration’s rank value, the current product’s actual rank and the update’s scale are related but distinct pieces of information.

08

Merge the fixed update without changing the linear map

For our fixed layer, there are two equivalent ways to calculate the output. One keeps W0, A and B separate, calculates the base and adapter branches, and adds their results. The other first creates W1=W0+BA, then multiplies W1 by the input. The rows of W1 were listed earlier. Applying them to (1,2,−1) gives (0,0,−4,4), exactly the same result as the separate branches. The equality holds for every input in this real-number linear construction, not only for the example we chose.

This is the algebra behind merging a LoRA update into base weights. The original paper discusses that operation, and PEFT documents a merge_and_unload method. [1][2] A merged weight matrix has the original matrix shape; it is not an adapter-only checkpoint. Our calculation assumes a fixed scale and no active dropout. Real implementations also have numerical precision, supported layer types and configuration restrictions. PEFT warns that some settings, including certain quantization techniques, do not support merging. [3] Therefore use the actual method’s contract and compare outputs in the intended configuration. The algebra explains what merging should preserve; it does not promise identical floating-point bits or a particular speedup on every system.

Separate and merged calculations preserve the fixed linear map. Original 4×3 example at scale 1. Equality is in exact real arithmetic with no active dropout.
Original 4×3 example at scale 1. Equality is in exact real arithmetic with no active dropout. · Ameer Journal — original explanatory diagramOriginal editorial illustration; no third-party artwork reused.
09

Shape compatibility does not identify the correct base

Suppose someone keeps our same adapter but changes the first entry of W0 from 1 to 2. The base matrix still has four rows and three columns, so all the multiplications still fit. For x=(1,2,−1), however, the final output becomes (1,0,−4,4) instead of (0,0,−4,4). The adapter file did not change. The difference came from the base to which it was applied. Matching shapes alone cannot establish that the intended combined transformation has been reconstructed.

PEFT’s checkpoint format separates adapter weights from adapter configuration and includes information about the base model. Microsoft’s reference instructions likewise load the pretrained checkpoint and then the LoRA checkpoint. [3][4] Preserve the actual base version, factor weights, target layers and scaling configuration together. A model name without the relevant revision may be less precise than the experiment record needs. If you merge and unload, retain the original components separately when you need them for later comparisons or switching. The PEFT documentation explains that the returned merged model no longer has its adapter-specific methods, such as disabling or unmerging an adapter. [3] A small change file and a full merged model serve different storage and workflow purposes, even when they represent the same intended adaptation.

10

Choose rank using a task result, not only a parameter count

The arithmetic has established several useful facts about one declared layer. Seven trainable factor entries can create twelve nonzero update entries. The added matrix has rank one, while the combined matrix has rank three. Separate and merged calculations produce the same linear function under the stated assumptions. The larger storage example shows why a small adapter can be convenient to keep while its base remains necessary. None of those calculations tells us which rank will produce the best answers on a real task.

For that decision, record what was adapted, what was trained and how the result was evaluated. Keep the dataset and target definitions clear, compare useful task behavior, and measure memory or speed with the actual workload if those are selection criteria. The LoRA reference implementation notes that the best configuration can depend on architecture and task. [4] A larger factor count provides a different update family, but quality also depends on the data and training process. Our worked example gives a precise vocabulary for discussing the choice: update rank, combined matrix, trainable entries, base dependency and merge state. Use those labels in experiment records so a smaller file or a larger rank setting does not silently become a claim about model quality.

Keep the representation and the task result in the same record. Proposed experiment fields. Rank and parameter counts describe the update; task evaluation assesses the resulting model.
Proposed experiment fields. Rank and parameter counts describe the update; task evaluation assesses the resulting model. · Ameer Journal — original explanatory diagramOriginal editorial illustration; no third-party artwork reused.
Follow the evidence

Sources & further reading

Explore the references behind this guide. External pages may change after our review.

  1. LoRA: Low-Rank Adaptation of Large Language Models
    Hu et al. / arXiv · Accessed 6 Nov 2026
  2. LoRA · Hugging Face
    Hugging Face PEFT · Accessed 6 Nov 2026
  3. PEFT checkpoint format · Hugging Face
    Hugging Face PEFT · Accessed 6 Nov 2026
  4. Microsoft LoRA reference implementation README
    Microsoft LoRA · Accessed 6 Nov 2026

Article updated 6 Nov 2026.

Found something we should revisit?

Good explanations get better with thoughtful feedback.

Suggest a correction