Addestramento e Ottimizzazione
Scorri per mostrare il menu
L'addestramento dei modelli generativi implica l'ottimizzazione di paesaggi di perdita spesso instabili e complessi. Questa sezione introduce funzioni di perdita specifiche per ciascun tipo di modello, strategie di ottimizzazione per stabilizzare l'addestramento e metodi per il fine-tuning di modelli pre-addestrati per casi d'uso personalizzati.
Funzioni di perdita principali
Le diverse famiglie di modelli generativi utilizzano formulazioni di perdita distinte a seconda di come modellano le distribuzioni dei dati.
Perdite GAN
Perdita minimax (GAN originale)
Impostazione avversaria tra generatore G e discriminatore D (esempio con la libreria pythorch):
loss_D = -torch.mean(torch.log(D(real_data)) + torch.log(1. - D(fake_data)))
loss_G = -torch.mean(torch.log(D(fake_data)))
Least squares GAN (LSGAN)
Utilizza la perdita L2 invece della log loss per migliorare la stabilità e il flusso del gradiente:
loss_D = 0.5 * torch.mean((D(real_data) - 1) ** 2 + D(fake_data) ** 2)
loss_G = 0.5 * torch.mean((D(fake_data) - 1) ** 2)
Wasserstein GAN (WGAN)
Minimizza la distanza Earth Mover (EM); sostituisce il discriminatore con un "critico" e utilizza il weight clipping o la penalità sul gradiente per la continuità di Lipschitz:
loss = torch.mean(D(fake_data)) - torch.mean(D(real_data)) + gradient_penalty
Perdita VAE
Evidence Lower Bound (ELBO)
Combina ricostruzione e regolarizzazione. Il termine di divergenza KL incoraggia il posteriore latente a rimanere vicino al prior (solitamente normale standard):
recon_loss = F.binary_cross_entropy(recon_x, x, reduction='sum')
kl_div = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())
loss = recon_loss + kl_div
Perdite nei Modelli di Diffusione
Perdita di Predizione del Rumore
I modelli apprendono a rimuovere il rumore gaussiano aggiunto attraverso una schedulazione di diffusione. Alcune varianti utilizzano la predizione della velocità (ad esempio, v-prediction in Stable Diffusion v2) o obiettivi ibridi:
noise = torch.randn_like(x)
x_t = q_sample(x, t, noise)
pred_noise = model(x_t, t)
loss = F.mse_loss(pred_noise, noise)
Tecniche di Ottimizzazione
L'addestramento dei modelli generativi è spesso instabile e sensibile agli iperparametri. Diverse tecniche vengono impiegate per garantire la convergenza e la qualità.
Ottimizzatori e Scheduler
- Adam / AdamW: ottimizzatori a gradiente adattivo sono lo standard de facto. Utilizzare β1=0.5, β2=0.999 per GAN;
- RMSprop: talvolta utilizzato in varianti WGAN;
- Schedulazione del tasso di apprendimento:
- Fasi di warm-up per transformer e modelli di diffusione;
- Decadimento coseno o ReduceLROnPlateau per una convergenza stabile.
optimizer = torch.optim.Adam(model.parameters(), lr=2e-4, betas=(0.5, 0.999))
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=100)
Metodi di Stabilizzazione
- Clipping del gradiente: prevenzione dell'esplosione dei gradienti in RNN o UNet profondi;
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
- Normalizzazione spettrale: applicata ai layer del discriminatore nei GAN per imporre vincoli di Lipschitz;
from torch.nn.utils import spectral_norm
layer = spectral_norm(nn.Linear(100, 100))
- Label smoothing: ammorbidisce le etichette rigide (ad esempio, reale = 0.9 invece di 1.0) per ridurre l'eccessiva sicurezza;
- Regola di aggiornamento a due scale temporali (TTUR): utilizzo di diversi tassi di apprendimento per generatore e discriminatore per migliorare la convergenza;
- Addestramento a precisione mista: sfrutta FP16 (tramite NVIDIA Apex o PyTorch AMP) per un addestramento più veloce su GPU moderne.
scaler = torch.cuda.amp.GradScaler()
with torch.cuda.amp.autocast():
output = model(input)
loss = loss_fn(output, target)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
Monitorare separatamente le perdite di generatore e discriminatore. Utilizzare periodicamente metriche come FID o IS per valutare la qualità effettiva dell'output invece di affidarsi esclusivamente ai valori di perdita.
Ottimizzazione di Modelli Generativi Preaddestrati
I modelli generativi preaddestrati (ad esempio, Stable Diffusion, LLaMA, StyleGAN2) possono essere ottimizzati per compiti specifici di dominio utilizzando strategie di addestramento più leggere.
Tecniche di Transfer Learning
- Ottimizzazione completa: riaddestramento di tutti i pesi del modello. Richiede elevate risorse computazionali ma offre la massima flessibilità;
model = AutoModel.from_pretrained('model-name')
model.train()
optimizer = torch.optim.Adam(model.parameters(), lr=5e-5)
- Riblocco dei layer / sblocco graduale: iniziare bloccando la maggior parte dei layer, poi sbloccare gradualmente quelli selezionati per un'ottimizzazione più efficace. Questo evita la dimenticanza catastrofica. Bloccare i layer iniziali aiuta a mantenere le caratteristiche generali apprese durante il preaddestramento (come bordi o pattern di parole), mentre sbloccare quelli finali consente al modello di apprendere caratteristiche specifiche del compito;
for param in model.parameters():
param.requires_grad = False
# Unfreeze final transformer block or decoder
for param in model.transformer.block[-1].parameters():
param.requires_grad = True
- LoRA / livelli adattatori: inserimento di livelli addestrabili a bassa dimensionalità senza aggiornare i parametri del modello di base;
from peft import get_peft_model, LoraConfig, TaskType
config = LoraConfig(task_type=TaskType.SEQ_2_SEQ_LM, r=8, lora_alpha=16, lora_dropout=0.1)
model = get_peft_model(base_model, config)
- DreamBooth / inversione testuale (modelli di diffusione):
- Ottimizzazione fine su un numero limitato di immagini specifiche del soggetto.
- Utilizzo della pipeline
diffusers:
from diffusers import StableDiffusionPipeline
pipeline = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4")
pipeline.train(texts, images) # pseudo-call: use DreamBooth training scripts in practice
- Prompt tuning / p-tuning:
from peft import PromptTuningConfig, get_peft_model
config = PromptTuningConfig(task_type=TaskType.CAUSAL_LM, num_virtual_tokens=20)
model = get_peft_model(base_model, config)
Casi d'Uso Comuni
- Adattamento dello stile: fine-tuning su dataset di anime, fumetti o artistici;
- Ottimizzazione specifica per settore: adattamento degli LLM a domini legali, medici o aziendali;
- Personalizzazione: condizionamento di identità o voce personalizzata utilizzando piccoli set di riferimento.
Utilizzare Hugging Face PEFT per metodi basati su LoRA/adapter e la libreria Diffusers per pipeline di fine-tuning leggere con supporto integrato per DreamBooth e classifier-free guidance.
Riepilogo
- Utilizzare funzioni di perdita specifiche per il modello che corrispondano agli obiettivi di training e alla struttura del modello;
- Ottimizzare con metodi adattivi, tecniche di stabilizzazione e scheduling efficiente;
- Eseguire il fine-tuning di modelli pre-addestrati utilizzando strategie moderne di trasferimento a bassa dimensionalità o basate su prompt per ridurre i costi e aumentare l'adattabilità al dominio.
1. Qual è uno degli scopi principali dell'utilizzo di tecniche di regolarizzazione durante l'addestramento?
2. Quale dei seguenti ottimizzatori è comunemente utilizzato per addestrare modelli di deep learning e adatta il tasso di apprendimento durante l'addestramento?
3. Qual è la principale sfida nell'addestramento dei modelli generativi, in particolare nel contesto delle GAN (Generative Adversarial Networks)?
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione