ELAI S.r.l.

LoRA oltre il risparmio di memoria: rango, geometria dell’adattamento e limiti misurabili

Quando basta un aggiornamento a basso rango? Derivazioni, SVD, un controesempio e un esperimento riproducibile chiariscono capacità e limiti di LoRA.

LoRA oltre il risparmio di memoria: rango, geometria dell’adattamento e limiti misurabili

Approfondimento tecnico · 21 settembre 2026 · Algebra lineare, adattamento dei modelli, esperimenti riproducibili

Abstract

Quando un aggiornamento a basso rango è sufficiente per specializzare un modello? La risposta dipende da quali direzioni devono cambiare, da quali ingressi le rendono importanti e da come l’ottimizzatore riesce a raggiungerle. In questo articolo ricaviamo il conteggio dei parametri e i gradienti di LoRA, analizziamo il limite di rappresentazione attraverso la decomposizione ai valori singolari e lo misuriamo su due problemi controllati. Con matrici 64 × 64, lo stesso rango 8 lascia il 13,53% oppure l’87,50% dell’energia dell’aggiornamento da rappresentare. Un secondo esempio dimostra che minimizzare l’errore sui pesi può scegliere la direzione sbagliata per i dati. Ne deriva un criterio preciso: il rango è un’ipotesi sulla geometria del compito, da verificare insieme a distribuzione degli ingressi, ottimizzazione e generalizzazione.

Natura del contributo. Questa è un’analisi didattica con calcoli originali riproducibili, non una nuova ricerca sottoposta a revisione scientifica. L’esperimento usa matrici sintetiche e una soluzione analitica: non addestra un LLM e non misura la sua accuratezza. Sono richieste familiarità con matrici, derivate e apprendimento supervisionato.

1. La domanda che il numero di parametri non risolve

Specializzare un modello su documenti tecnici sembra porre una domanda economica: quanta memoria serve per aggiornarlo? Esiste però una domanda precedente: quali trasformazioni devono cambiare? Una matrice con milioni di coefficienti potrebbe richiedere una correzione concentrata in poche direzioni. Un’altra, della stessa dimensione, potrebbe richiedere correzioni indipendenti lungo molte direzioni. Il numero dei coefficienti del modello iniziale non distingue questi casi.

LoRA, introdotto da Hu e collaboratori nel 2021, congela una matrice preaddestrata e apprende una correzione fattorizzata. Il suo interesse scientifico è proprio il vincolo imposto alla correzione. Il lavoro originale documenta risultati su modelli e compiti specifici; non dimostra che ogni specializzazione ammetta un rango piccolo. Qui separiamo tre domande spesso confuse: l’aggiornamento necessario è rappresentabile? L’addestramento riesce a trovarlo? La soluzione mantiene qualità su dati nuovi? [1, sezioni 4 e 7]

Questa separazione evita un errore frequente nell’interpretazione delle prove: se aumentare il rango non migliora un punteggio, non abbiamo ancora dimostrato che il compito sia intrinsecamente semplice. Potrebbero essere insufficienti i dati, sbagliati i moduli adattati o inadeguata la scala degli aggiornamenti. Viceversa, un rango maggiore che riduce la perdita di addestramento non dimostra un miglioramento fuori campione.

2. Dalla matrice completa alla correzione fattorizzata

Consideriamo uno strato lineare senza bias, per tenere visibile il meccanismo. L’ingresso x ha k componenti, l’uscita h ne ha d e la matrice iniziale W₀ ha dimensione d × k. Il fine-tuning completo può modificare tutti i dk coefficienti. Nella parametrizzazione LoRA scriviamo:

Weff = W₀ + ΔW,   ΔW = sBA
A ∈ ℝr×k,   B ∈ ℝd×r,   h = W₀x + sB(Ax).   (1)

Il numero r è il rango massimo dell’aggiornamento; s è uno scalare non nullo che ne regola la scala. A comprime l’ingresso in r coordinate, B le riporta nello spazio di uscita. Tutte le colonne di BA appartengono allo spazio generato dalle colonne di B: perciò rank(BA) ≤ r. Il vincolo riguarda ΔW, non W₀ né Weff, che possono avere rango pieno. Congelare W₀ non significa renderlo piccolo o rimuoverlo dalla memoria.

Memorizziamo rk coefficienti in A e dr in B. Per una singola matrice quadrata con d = k = 4096 otteniamo il seguente confronto. Sono conteggi di coefficienti addestrabili, senza bias o altri moduli:

ConfigurazioneCoefficienti addestrabiliQuota rispetto a 4096²
Aggiornamento completo16.777.216100%
LoRA, r = 865.5360,390625%
LoRA, r = 16131.0720,78125%
LoRA, r = 64524.2883,125%

A rango 8 addestriamo 256 volte meno coefficienti per questa matrice. Non segue una riduzione di 256 volte della memoria totale: restano pesi congelati, attivazioni, buffer e, a seconda dell’implementazione, copie dei pesi e stati dell’ottimizzatore. Anche la propagazione del gradiente attraverso il modello resta necessaria. Il risparmio dipende da precisione numerica, lunghezza delle sequenze, dimensione dei batch e moduli coinvolti.

Esiste inoltre una ridondanza nella fattorizzazione. Per qualsiasi matrice invertibile R di dimensione r × r, le coppie (B, A) e (BR, R⁻¹A) producono lo stesso aggiornamento. Sulla parte di rango esattamente r, la varietà delle matrici ha r(d + k − r) gradi di libertà, mentre i parametri memorizzati restano r(d + k). Questa differenza chiarisce perché contare i numeri in memoria non equivale a contare direzioni funzionali indipendenti.

Per un singolo vettore il ramo aggiuntivo richiede un lavoro proporzionale a r(k + d), oltre al prodotto con W₀. Dopo l’addestramento possiamo incorporare sBA in W₀ e usare una sola matrice, se formato numerico e infrastruttura lo consentono. La possibilità algebrica di questa fusione non garantisce automaticamente latenza invariata in ogni sistema, soprattutto quando si mantengono adattatori separati o pesi quantizzati.

3. Il gradiente spiega inizializzazione e scala

Indichiamo con L la perdita e con G = ∂L/∂Weff il gradiente rispetto alla matrice effettiva. G ha dimensione d × k. Dalla variazione dWeff = s(dB)A + sB(dA), usando il prodotto interno fra matrici ⟨P,Q⟩ = tr(PᵀQ), raccogliamo separatamente i termini in dA e dB. Otteniamo:

∂L/∂B = sGAᵀ ∈ ℝd×r
∂L/∂A = sBᵀG ∈ ℝr×k.   (2)

Se inizializziamo B a zero e A con valori casuali non nulli, l’aggiornamento iniziale è nullo: la funzione del modello parte da quella preaddestrata. Al primo passo il gradiente di A è zero, mentre quello di B può essere diverso da zero. Dopo che B è cambiata, anche A può apprendere. Inizializzare entrambe a zero bloccherebbe invece entrambi i gradienti di questa parametrizzazione. Non è una finezza cosmetica: l’asimmetria iniziale rende possibile partire dalla funzione originale senza fermare l’apprendimento.

Le formule permettono anche di vedere perché la fattorizzazione modifica l’ottimizzazione. Con discesa del gradiente simultanea, passo η e trascurando i termini di ordine η², la variazione dell’aggiornamento è:

δ(ΔW) ≈ −ηs²[G AᵀA + BBᵀG].   (3)

Il fine-tuning diretto della matrice avrebbe invece un passo −ηG. Le matrici AᵀA e BBᵀ filtrano il gradiente secondo la geometria corrente dei fattori. Anche a capacità rappresentativa sufficiente, le traiettorie possono essere diverse. L’equazione (3) riguarda la discesa del gradiente semplice; non descrive esattamente Adam, weight decay o clipping. Serve a isolare un meccanismo, non a sostituire la misura dell’addestramento reale.

La convenzione classica s = α/r lega scala e rango. Cambiare r mantenendo α fisso cambia quindi due cose insieme: capacità e dinamica. rsLoRA propone s = α/√r, motivandolo con un’analisi di stabilità rispetto al rango sotto ipotesi esplicite di inizializzazione e scala. Il punto pratico è confrontare rango, fattore di scala e learning rate con un protocollo coerente, senza assumere che un unico valore di α renda tutte le prove equivalenti. [2, sezioni 2–4]

4. Un limite misurabile: quanta energia resta fuori?

Supponiamo, per un momento, di conoscere una correzione obiettivo ΔW*. È un’ipotesi artificiale utile per studiare la capacità: nella specializzazione reale questa matrice non ci viene consegnata. Scriviamo la sua decomposizione ai valori singolari, ordinati dal maggiore al minore:

ΔW* = U diag(σ₁, …, σm) Vᵀ,   m = min(d,k).
ΔW*r = Σi=1…r σi uiviᵀ.   (4)

I vettori ui e vi formano basi ortonormali nei rispettivi spazi. Troncando la somma conserviamo r trasformazioni elementari. La proprietà di migliore approssimazione della SVD nella norma di Frobenius dice che nessuna matrice di rango al massimo r può fare meglio della somma troncata per questo criterio. La norma di Frobenius al quadrato è la somma dei quadrati di tutti i coefficienti.

minrank(M)≤r ‖ΔW* − M‖²F = Σi=r+1…m σ²i
εr = (Σi>r σ²i) / (Σi≥1 σ²i).   (5) [4]

L’identità del residuo si vede anche direttamente: i termini uiviᵀ sono ortogonali fra loro nel prodotto interno di Frobenius, quindi le energie dei termini scartati si sommano. L’ottimalità del troncamento aggiunge il passaggio decisivo: non stiamo mostrando soltanto un’approssimazione possibile, ma il limite migliore per quel rango e quella metrica.

Questo limite è rappresentabile da LoRA: per s positivo possiamo prendere B = Urdiag(√σi/√s) e A = diag(√σi/√s)Vrᵀ. Otteniamo sBA = ΔW*r. È una costruzione di esistenza, non un algoritmo di addestramento su testi. Non dimostra che un ottimizzatore trovi questi fattori, né che ricostruire una matrice sia l’obiettivo giusto per un LLM.

5. Esperimento eseguito: stesso rango, due problemi diversi

Costruiamo due matrici 64 × 64 con le stesse basi ortogonali U e V, ottenute tramite decomposizione QR di matrici gaussiane. Nel primo caso σi = exp(−(i−1)/8): poche direzioni concentrano molta energia. Nel secondo tutti i valori singolari valgono 1: nessuna direzione è privilegiata. Per ogni rango calcoliamo la SVD troncata e misuriamo εr. Non c’è rumore, non c’è una fase di training e non c’è selezione di iperparametri su un test set.

Il seme casuale è 20260921. Il calcolo è stato eseguito in float64 con Python 3.14.0 e NumPy 2.5.3; i grafici derivano dagli stessi risultati mediante Matplotlib 3.11.2. Per controllare l’interpretazione funzionale valutiamo anche 20.000 ingressi gaussiani indipendenti x ∼ N(0,I), confrontando l’energia media dell’errore in uscita con quella dell’uscita obiettivo.

Spettri sintetici e percentuale di energia residua al variare del rango; a rango 8 i residui sono 13,53% e 87,50%.
Figura 1. A sinistra, i due spettri imposti; a destra, il residuo ottimale calcolato con la SVD. L’asse verticale dello spettro è logaritmico, quello del residuo è lineare. Fonte: esperimento sintetico allegato, non benchmark di un modello linguistico.
Rango rResiduo: decadimentoResiduo: spettro piatto
177,8801%98,4375%
260,6531%96,8750%
436,7879%93,7500%
813,5335%87,5000%
161,8316%75,0000%
320,0335%50,0000%
640%0%

Nel caso piatto la formula si riduce a εr = (64−r)/64. Perdere l’87,5% a rango 8 è inevitabile per questo obiettivo, anche con un ottimizzatore perfetto. Nel caso a decadimento, rango 16 conserva invece circa il 98,17% dell’energia. Dire che «rango 16 basta» senza precisare per quale spettro e quale metrica elimina proprio l’informazione che rende utile il risultato.

Il controllo sui 20.000 ingressi restituisce a rango 8 un residuo empirico del 13,4516% nel primo caso e dell’87,5061% nel secondo, vicino ai valori attesi. Si tratta di una verifica Monte Carlo, non di un intervallo di confidenza né di un risultato su un corpus. Con valori singolari uguali, la base scelta dalla SVD non è unica: piccole differenze numeriche fra ambienti possono cambiare il residuo campionario, mentre quello teorico resta identico.

Il conteggio dei parametri rivela un altro limite: per matrici 64 × 64 la fattorizzazione memorizza 128r coefficienti. A rango 32 ne memorizza 4096, quanto una matrice completa; a rango 64 ne memorizza il doppio. Questi ranghi servono qui a mostrare l’intera curva di capacità. Non sarebbero scelte motivate dal risparmio parametrico. I rapporti economici dell’esempio 4096 × 4096 non vanno trasferiti al problema sintetico più piccolo.

6. Il controesempio: i dati possono ribaltare la scelta

La norma di Frobenius attribuisce lo stesso peso a tutte le coordinate. Un sistema reale non riceve necessariamente ingressi isotropi. Per ingressi a media zero con covarianza Σ = E[xxᵀ] e errore di matrice E = ΔW* − M, l’errore quadratico medio sull’uscita è:

Ex[‖Ex‖²₂] = tr(EΣEᵀ) = ‖EΣ1/2‖²F.   (6)

Usiamo E come simbolo della matrice d’errore ed Ex[·] come aspettativa statistica. Se Σ = I ritroviamo il criterio precedente. Altrimenti conta il prodotto fra errore e distribuzione degli ingressi. Prendiamo ΔW* = diag(4,1) e Σ = diag(1,100). La migliore approssimazione di rango 1 in Frobenius è MF = diag(4,0): conserva il valore singolare più grande e lascia errore quadratico sui coefficienti pari a 1.

Ma la seconda coordinata dell’ingresso ha varianza 100. Scartarla genera errore atteso sull’uscita pari a 100. Scegliendo MΣ = diag(0,1), invece, l’errore sui coefficienti sale a 16, ma l’errore atteso sull’uscita scende a 16. Con nessuna correzione sarebbe 116. Un criterio che considera soltanto i pesi preferisce quindi la soluzione peggiore per questa distribuzione.

CorrezioneErrore sui coefficienti, ‖E‖²FErrore atteso in uscita
Nessuna: diag(0,0)17116
MF = diag(4,0)1100
MΣ = diag(0,1)1616

Se Σ è definita positiva, il problema pesato si risolve troncando la SVD di ΔW*Σ1/2 e moltiplicando poi a destra per Σ−1/2. Il rango è preservato dalle trasformazioni invertibili. Se Σ è singolare occorre invece trattare separatamente il suo supporto: non si può usare un’inversa ordinaria. Già in un problema lineare la distribuzione modifica quali direzioni meritano il budget.

In un Transformer il contesto è più complesso: gli ingressi agli strati dipendono dagli strati precedenti, la perdita finale non è una semplice distanza fra uscite lineari e adattare più moduli può modificare le rappresentazioni interne. La SVD di un singolo aggiornamento è dunque uno strumento diagnostico, non una regola automatica per assegnare il rango a tutta la rete.

7. Dalla capacità al protocollo per un modello verticale

Per specializzare un modello su un dominio, il primo passo è definire cosa conta come miglioramento: estrarre campi da documenti, usare correttamente terminologia tecnica o eseguire istruzioni vincolate sono obiettivi diversi. Un punteggio medio può nascondere il peggioramento dei casi rari. Anche il confine fra training e test deve seguire l’unità informativa reale: suddividere casualmente pagine quasi identiche dello stesso documento produce una prova troppo facile.

Un protocollo proposto, non eseguito in questo articolo, confronta il modello base con ranghi 4, 8, 16 e 32, fissando inizialmente i moduli adattati. Per ogni configurazione assegna un budget comparabile di ricerca su learning rate e scala, usa più semi casuali e sceglie gli iperparametri sulla validazione. Il test finale rimane separato fino alla decisione. Poi confronta, a parità di budget parametrico quando possibile, l’adattamento di pochi moduli con quello distribuito su più moduli.

Vanno registrati qualità sul dominio, prestazioni su compiti generali di controllo, memoria di picco, tempo, numero di token e variabilità fra esecuzioni. Il confronto con un fine-tuning completo, quando sostenibile, aiuta a distinguere limiti del vincolo da limiti del modello base. Un maggior numero di epoche o di tentativi di tuning non deve diventare un vantaggio nascosto assegnato a una sola configurazione.

Le curve di training e validazione offrono indicazioni, non diagnosi infallibili. Se entrambe restano scarse, capacità, ottimizzazione e qualità dei dati restano ipotesi aperte. Se migliora soltanto il training, l’aumento di rango potrebbe favorire adattamento a peculiarità del campione. Se il risultato medio migliora ma peggiora un sottoinsieme critico, la decisione va presa sulla funzione d’uso, non sull’attrattiva del numero aggregato.

Una direzione distinta è modificare la parametrizzazione. DoRA separa magnitudine e direzione dei pesi e usa un aggiornamento a basso rango per la componente direzionale. Il lavoro del 2024 propone questa scelta per cambiare la dinamica dell’adattamento e la valuta su compiti specifici. Non è semplicemente «LoRA con rango maggiore», né una garanzia universale di superiorità. In questa analisi non abbiamo riprodotto né DoRA né rsLoRA: sono confronti metodologici documentati, non risultati del nostro esperimento. [3, sezioni 3–5]

8. Riprodurre, controllare, delimitare

Il nucleo seguente mostra come viene calcolato il residuo. Il file scaricabile contiene anche la costruzione delle matrici, il controllo Monte Carlo, il controesempio con covarianza e una verifica dei gradienti mediante differenze finite. Quest’ultima ha prodotto un errore assoluto massimo di circa 2,71 × 10⁻⁹.

u, singular, vh = np.linalg.svd(target, full_matrices=False)
approx = (u[:, :r] * singular[:r]) @ vh[:r, :]
residual = target - approx
epsilon = np.sum(singular[r:]**2) / np.sum(singular**2)
direct = np.sum(residual**2) / np.sum(target**2)
assert abs(epsilon - direct) < 1e-12

Per rieseguire tutto: installare NumPy e avviare python experiment.py --out results.json. Il JSON riporta versioni, seme, dimensioni e risultati. Lo script non richiede modelli, credenziali o dataset esterni. La riproducibilità numerica va intesa entro le tolleranze dichiarate nel codice, non come identità di ogni cifra su qualsiasi libreria BLAS.

Scarica codice, risultati, script dei grafici e istruzioni · Scarica i risultati in JSON.

Il limite principale è deliberato: usiamo un oracolo che conosce ΔW*, non un processo che lo apprende. Non misuriamo convergenza, rumore nelle etichette, generalizzazione linguistica, memoria GPU o latenza. Il caso isotropo e il controesempio anisotropo dimostrano proprietà matematiche dei problemi costruiti; non stimano la distribuzione degli aggiornamenti di un particolare modello commerciale. Anche i lavori citati hanno date e protocolli propri: questa non è una rassegna esaustiva dello stato dell’arte del 2026.

9. La conclusione tecnica

LoRA rende economica una famiglia vincolata di aggiornamenti. La sua adeguatezza dipende dall’energia e dalla rilevanza funzionale delle direzioni che quella famiglia può esprimere. Il nostro calcolo mostra due fallimenti di ragionamento: stesso rango non significa stessa capacità di ricostruzione relativa; migliore ricostruzione dei pesi non significa minore errore sui dati. Le equazioni dei gradienti aggiungono un terzo livello: una soluzione rappresentabile potrebbe essere difficile da apprendere con la parametrizzazione scelta.

Per il lavoro sui modelli verticali che EL-AI intende approfondire, questo stabilisce una domanda di progetto concreta: quali direzioni di adattamento richiede il compito, e con quali misure possiamo dimostrare di averle apprese? L’esperimento qui allegato è materiale didattico di questa pubblicazione, non evidenza di un prodotto già validato o di un progetto cliente. Il passo successivo scientificamente utile sarebbe verificare queste ipotesi con dati di dominio separati, un budget dichiarato e un confronto ripetibile.

Riferimenti primari

  1. Hu, E. J. e collaboratori. LoRA: Low-Rank Adaptation of Large Language Models. arXiv:2106.09685, versione 2, 2021. Metodi e analisi del rango: sezioni 4 e 7.
  2. Kalajdzievski, D. A Rank Stabilization Scaling Factor for Fine-Tuning with LoRA. arXiv:2312.03732, versione 1, 2023. Ipotesi e analisi della scala: sezioni 2–4.
  3. Liu, S.-Y. e collaboratori. DoRA: Weight-Decomposed Low-Rank Adaptation. arXiv:2402.09353, versione 3, 2024. Decomposizione, metodo e valutazione: sezioni 3–5.
  4. James, D., Solomon, J. Singular Value Decomposition. Stanford CS 205A, 2016. Diapositive 25–26: teorema di Eckart–Young e norme matriciali. [4]

Copertina illustrativa generata con AI: non rappresenta sedi o installazioni reali di EL-AI. Figura scientifica prodotta dai dati del calcolo allegato.