Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Addestramento e Ottimizzazione | Sezione
Deep Learning Generativo

bookAddestramento 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 GG e discriminatore DD (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\beta_1=0.5,\ \beta_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()
Note
Nota

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.
Note
Nota

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)?

question mark

Qual è uno degli scopi principali dell'utilizzo di tecniche di regolarizzazione durante l'addestramento?

Select the correct answer

question mark

Quale dei seguenti ottimizzatori è comunemente utilizzato per addestrare modelli di deep learning e adatta il tasso di apprendimento durante l'addestramento?

Select the correct answer

question mark

Qual è la principale sfida nell'addestramento dei modelli generativi, in particolare nel contesto delle GAN (Generative Adversarial Networks)?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 1. Capitolo 12

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Sezione 1. Capitolo 12
some-alt