Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Addestramento e Ottimizzazione | Costruzione e Addestramento di Modelli Generativi
Modelli Generativi Profondi con Python

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 la messa a punto 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)

Utilizzo della 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)

Minimizzazione della distanza Earth Mover (EM); sostituzione del discriminatore con un "critico" e utilizzo di weight clipping o 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)

Combinazione di ricostruzione e regolarizzazione. Il termine di divergenza KL incoraggia il posteriore latente a rimanere vicino al prior (di solito 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 previsione del rumore

I modelli apprendono a rimuovere il rumore gaussiano aggiunto attraverso una schedulazione di diffusione. Varianti utilizzano la previsione 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 adattivi del gradiente sono lo standard de facto. Utilizzare β1=0.5, β2=0.999\beta_1=0.5,\ \beta_2=0.999 per i GAN;
  • RMSprop: talvolta utilizzato in varianti di 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: evita l'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 tassi di apprendimento diversi per generatore e discriminatore per migliorare la convergenza;
  • Addestramento a precisione mista: utilizzo di 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

Monitoraggio separato delle perdite di generatore e discriminatore. Utilizzo periodico di metriche come FID o IS per valutare la qualità effettiva dell'output invece di affidarsi esclusivamente ai valori di perdita.

Ottimizzazione di modelli generativi pre-addestrati

I modelli generativi pre-addestrati (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, quindi sbloccare gradualmente quelli selezionati per una migliore ottimizzazione. Questo evita la perdita catastrofica delle conoscenze. Bloccare i layer iniziali aiuta a mantenere le caratteristiche generali apprese durante il pre-addestramento (come bordi o pattern di parole), mentre sbloccare quelli finali permette 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 / layer adapter: inserimento di layer 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 di stile: ottimizzazione su dataset di anime, fumetti o artistici;
  • Ottimizzazione specifica per settore: adattamento di 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

  • Utilizzo di funzioni di perdita specifiche per il modello che corrispondono agli obiettivi di addestramento e alla struttura del modello;
  • Ottimizzazione con metodi adattivi, tecniche di stabilizzazione e scheduling efficiente;
  • Fine-tuning di modelli pre-addestrati utilizzando strategie moderne di trasferimento low-rank o basate su prompt per ridurre i costi e aumentare l'adattabilità al dominio.

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

2. Quale dei seguenti ottimizzatori è comunemente utilizzato per l'addestramento di 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 delle tecniche di regolarizzazione durante l'addestramento?

Seleziona la risposta corretta

question mark

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

Seleziona la risposta corretta

question mark

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

Seleziona la risposta corretta

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 2

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 3. Capitolo 2
some-alt