Apprendimento Auto-Supervisionato
Il Self-Supervised Learning è un paradigma di apprendimento automatico in cui il modello impara da coppie di input-output generate automaticamente dai dati stessi, senza necessità di etichettatura manuale. La chiave di questo approccio sta nel fatto che il sistema di training crea automaticamente dei "compiti" di supervisione estraendo e manipolando parti dei dati grezzi.
Questo approccio è particolarmente potente perché:
- Elimina la necessità di etichettatura manuale costosa
- Permette l'utilizzo di vasti dataset non etichettati
- Consente al modello di apprendere rappresentazioni ricche e generalizzabili
Causal Language Modeling
Il Causal Language Modeling (CLM) è uno degli esempi più significativi di apprendimento auto-supervisionato nel campo del Natural Language Processing, in particolare per i modelli generativi - Transformer Decoder-Only: è infatti la tecnica utilizzata per addestrare modelli come GPT.
Processo di Addestramento
Prendiamo come esempio l'addestramento di un modello decoder transformer per il causal language modeling. Il processo si svolge nel seguente modo:
1. Preparazione dei Dati
testo = "Il gatto dorme sul divano" # Il testo viene tokenizzato tokens = ["Il", "gatto", "dorme", "sul", "divano"] # Viene creata una sequenza di input e output sfalsati inputs = ["<start>", "Il", "gatto", "dorme", "sul"] targets = ["Il", "gatto", "dorme", "sul", "divano"]
2. Creazione della Supervisione Per ogni posizione nella sequenza, il modello deve prevedere il token successivo:
- Dato "Il", prevedere "gatto"
- Dato "Il gatto", prevedere "dorme"
- Dato "Il gatto dorme", prevedere "sul"
- E così via...
3. Funzione di Loss
La loss viene calcolata confrontando la distribuzione di probabilità predetta dal modello con il token effettivo successivo, spesso viene utilizzata l'Entropia Incrociata (Cross-Entropy Loss)
Attenzione Causale
Un aspetto fondamentale del causal language modeling è l'utilizzo dell'attenzione causale (o mascherata), che impedisce al modello di "vedere il futuro":
# Esempio di maschera di attenzione per una sequenza di 4 token attention_mask = [ [1, 0, 0, 0], # Il primo token vede solo se stesso [1, 1, 0, 0], # Il secondo token vede i primi due [1, 1, 1, 0], # Il terzo token vede i primi tre [1, 1, 1, 1] # L'ultimo token vede tutta la sequenza ]