Gradient

[grèidient]

Vettore delle derivate parziali della loss rispetto ai parametri. Indica direzione e intensità con cui correggere il modello.

Il gradiente è il vettore di tutte le derivate parziali della loss rispetto ai parametri del modello. Per ogni parametro, il gradiente dice: "se sposti questo parametro nella direzione X, la loss aumenta/diminuisce di Y".

Il gradient descent usa il gradiente per aggiornare i parametri nella direzione che riduce la loss. Senza gradiente, niente training delle reti neurali.

Come si calcola: con la backpropagation, sfruttando la regola della catena del calcolo differenziale. Modernamente, framework come PyTorch e TensorFlow lo fanno automaticamente con autograd.

Problemi tipici dei gradienti:

  • Vanishing gradient: in reti profonde, il gradiente "muore" andando indietro. I primi strati non imparano. Soluzioni: ReLU, residual connection, layer norm.
  • Exploding gradient: il contrario. Gradienti enormi, parametri saltano via, training diverge. Soluzione: gradient clipping (tagli i gradienti sopra una soglia).
  • Gradiente rumoroso: con batch piccoli, alta varianza. Soluzioni: batch più grandi, momentum nell'ottimizzatore.
  • Gradiente sparso: in modelli con embedding grossi, solo pochi gradienti sono non-zero per step. Ottimizzatori speciali (sparse Adam) gestiscono meglio.

Concetto avanzato: gradiente naturale (Amari, 1998), che tiene conto della "geometria" dello spazio dei parametri. Più costoso, talvolta più efficiente. Approssimazioni come K-FAC, Shampoo cercano di portarlo nel pratico.

Tecnica importante: gradient checkpointing. Per risparmiare memoria, non salvi tutte le attivazioni intermedie nel forward pass; le ricalcoli quando ti servono nel backward. Tempo in più, memoria in meno. Standard per addestrare LLM grossi.

Visualizzare gradienti durante il training (usando TensorBoard, Weights & Biases) è uno dei modi migliori per debug del training. Se vedi gradienti che esplodono o vanno a zero, sai dove c'è il problema.