LoRA (2021): adattare i modelli con matrici a basso rango

Riaddestrare per intero un modello da centinaia di miliardi di parametri per specializzarlo è proibitivo. Nel 2021 un gruppo di Microsoft mostra che l'aggiornamento necessario è quasi sempre molto più semplice del peso che modifica — e si può scrivere con due matrici magre.

Immaginate di dover ritoccare una singola frase in un libro già stampato in centomila copie. La via brutale è ristampare tutto da capo. La via intelligente è preparare un erratum, un foglietto trasparente da sovrapporre alla pagina, che corregge solo ciò che va corretto e lascia intatto il resto. Nel 2021 un gruppo di ricercatori di Microsoft applica questa idea al problema di specializzare i grandi modelli linguistici. Il fine-tuning classico è la ristampa: si riaddestrano tutti i parametri del modello, e quando i parametri sono centinaia di miliardi il costo diventa proibitivo. LoRA — Low-Rank Adaptation — è il foglietto trasparente: lascia il modello originale congelato e ci sovrappone una correzione minuscola.

Instruction tuning, LoRA, RLHF e DPO: tutto quello che succede dopo il pre-addestramento è nel libro.

Leggi «Dopo il pre-addestramento: istruzioni, preferenze, allineamento» nel libro →

Il problema: un fine-tuning che non scala

Un modello pre-addestrato è un’enorme collezione di matrici di pesi, il risultato di mesi di calcolo su quantità di testo colossali. Per specializzarlo su un compito — rispondere nel tono di un’azienda, tradurre un gergo tecnico, seguire un certo formato — la ricetta tradizionale è il fine-tuning: si riprende il modello e si aggiornano tutti i suoi pesi con altri dati. Funziona, ma ha un prezzo che cresce con la taglia. Ogni versione specializzata è una copia completa del modello, pesante quanto l’originale da conservare e servire. E l’addestramento richiede di tenere in memoria non solo i pesi, ma anche gli stati dell’ottimizzatore per ciascuno di essi: su un modello da 175 miliardi di parametri, il conto della memoria diventa insostenibile per chiunque non abbia un data center a disposizione.

La domanda che gli autori si pongono è semplice: quando specializziamo un modello, quanto davvero cambia? È necessario toccare tutti i miliardi di parametri, o l’aggiustamento è in realtà molto più contenuto di quanto sembri?

L’intuizione: l’aggiornamento è più semplice del peso

La risposta è la parte elegante del paper. L’aggiornamento che il fine-tuning applica a una matrice di pesi — chiamiamolo ΔW, la differenza tra il peso specializzato e quello di partenza — ha una struttura molto più povera del peso stesso. In termini tecnici, ha un rango intrinseco basso: pur essendo una matrice grande quanto l’originale, l’informazione che contiene si può comprimere in pochissime dimensioni senza perdere quasi nulla.

Un’analogia aiuta. Una fotografia ad alta risoluzione ha milioni di pixel, ma un filtro che la scalda di tono non è un intervento su milioni di valori indipendenti: è la combinazione di due o tre manopole — luminosità, contrasto, temperatura colore. L’effetto copre tutta l’immagine, eppure si descrive con pochi numeri. Gli autori ipotizzano — e poi verificano — che l’adattamento di un modello a un nuovo compito sia dello stesso tipo: un cambiamento diffuso su tutta la matrice, ma governato da pochissime «manopole». E se l’aggiornamento vive in poche dimensioni, non serve impararlo per intero: basta imparare quelle poche dimensioni.

Come funziona: due matrici magre

Qui entra l’algebra, ma è algebra amichevole. Una matrice di aggiornamento grande e di rango basso si può scrivere come il prodotto di due matrici molto più piccole: una alta e stretta, una bassa e larga. Chiamiamole B e A. Se il peso originale è una matrice quadrata di lato d, invece di imparare i suoi d×d valori, LoRA impara solo B (di dimensione d×r) e A (di dimensione r×d), dove r, il rango, è un numero piccolo scelto da noi. Il loro prodotto B·A ricostruisce un aggiornamento grande quanto serve, ma i parametri da addestrare sono soltanto quelli di due matrici sottili.

Il peso originale W resta congelato: non lo si tocca mai. Durante l’addestramento fluiscono i gradienti solo attraverso A e B; durante l’uso, l’output è la somma del contributo del peso congelato e di quello della coppia a basso rango. La cosa sorprendente, mostrata sperimentalmente nel paper, è quanto piccolo possa essere r: valori nell’ordine di poche unità — anche uno o due, in certi casi — bastano a catturare l’adattamento su modelli molto grandi. Nel loro studio gli autori applicano LoRA soprattutto alle matrici di proiezione del meccanismo di attenzione, il cuore dell’architettura Transformer.

Il peso addestrato con miliardi di parametri resta intatto. Quello che impariamo, per specializzarlo, sta in due matrici così magre da entrare in una manciata di megabyte.

Lo schema: due matrici che affiancano un peso congelato

Vale la pena vederlo. L’ingresso attraversa in parallelo due strade: il peso originale, congelato, e la coppia a basso rango, che lo riduce a poche dimensioni e poi lo riporta su. Le due uscite si sommano.

x W peso congelato ❄ d × d A r × d rango r B d × r + h Wx + BAx

L’ingresso x passa in parallelo per il peso congelato W (in alto, che nessuno addestra) e per la coppia a basso rango: A lo comprime a poche dimensioni, B lo riporta alla dimensione piena. Le due uscite si sommano nell’output h. Solo A e B contengono parametri da addestrare.

Cosa ha misurato il paper

Gli autori — Edward J. Hu, Yelong Shen, Phillip Wallis, Zeyuan Allen-Zhu, Yuanzhi Li, Shean Wang, Lu Wang e Weizhu Chen — quantificano il risparmio su GPT-3 da 175 miliardi di parametri. Rispetto al fine-tuning completo con l’ottimizzatore Adam, LoRA riduce il numero di parametri da addestrare di diecimila volte e il fabbisogno di memoria GPU di tre volte. E il taglio non arriva a scapito della qualità: sui modelli testati — RoBERTa, DeBERTa, GPT-2 e GPT-3 — LoRA raggiunge prestazioni pari o superiori a quelle del fine-tuning completo.

C’è un secondo vantaggio, forse più sottile ma altrettanto pratico: nessuna latenza aggiuntiva quando il modello è in produzione. Poiché il contributo a basso rango è additivo, una volta finito l’addestramento si può sommare B·A dentro il peso W una volta per tutte, tornando a una singola matrice esattamente della forma originale. Al momento dell’uso, un modello adattato con LoRA gira alla stessa velocità di quello di partenza — a differenza di altre tecniche di adattamento che aggiungono strati e quindi rallentano l’inferenza. Il foglietto trasparente, se serve, si può stampare definitivamente nella pagina.

Perché vi riguarda

LoRA ha cambiato l’economia della specializzazione. Poiché l’adattatore addestrato pesa pochissimo — due matrici sottili, spesso pochi megabyte contro le decine o centinaia di gigabyte del modello intero — diventa possibile tenere un solo modello base congelato e affiancargli una libreria di adattatori intercambiabili, uno per compito, caricando quello giusto al volo come si sceglie una lente. È esattamente il meccanismo che regge buona parte dell’ecosistema di modelli aperti che chiunque può scaricare e personalizzare oggi: la maggioranza delle versioni «fine-tuned» che trovate in giro sono, sotto il cofano, adattatori LoRA su un modello base comune. Ne sono nate estensioni — su tutte QLoRA, che combina LoRA con la quantizzazione per addestrare modelli molto grandi su una singola GPU da gaming.

Il punto che vale la pena portarsi a casa va oltre la tecnica. LoRA è la dimostrazione di un’idea che ricorre in tutto il machine learning: quello che sembra un problema enorme — riaddestrare miliardi di numeri — spesso nasconde una struttura semplice, e trovarla non è un dettaglio ingegneristico ma la differenza tra qualcosa che solo pochi grandi laboratori possono permettersi e qualcosa che un singolo sviluppatore può fare sul proprio portatile. Adattare l’intelligenza artificiale, dopo questo paper, ha smesso di essere un privilegio di chi possiede il data center.

Il paper originale

Hu, E. J., Shen, Y., Wallis, P., Allen-Zhu, Z., Li, Y., Wang, S., Wang, L., Chen, W. (2021). LoRA: Low-Rank Adaptation of Large Language Models. arXiv:2106.09685. Disponibile su arxiv.org/abs/2106.09685.

I commenti sono riservati agli iscritti.

Accedi per commentare