Optimizatori: AdamW, SGD și Importanța zero_grad() în PyTorch & Deep Learning Practic

Antrenare, Optimizare & Stare Nivel: intermediar

Cum actualizează optimizatorul greutățile rețelei pe baza gradienților calculați: de ce AdamW este standardul în LLM-uri, rolul weight decay și pașii step() / zero_grad().

Sintaxă & invocare Python
import torch.optim as optim

# Optimizatorul standard în Deep Learning modern:
optimizator = optim.AdamW(model.parameters(), lr=1e-4, weight_decay=0.01)

# Triada obligatorie la fiecare pas de antrenare:
optimizator.zero_grad()   # 1. Șterge gradienții vechi
pierdere.backward()       # 2. Calculează gradienții noi
optimizator.step()        # 3. Actualizează greutățile: w = w - lr * grad

Descriere & Utilizare

Odată ce loss.backward() a calculat derivatele fiecărui parametru, intervine Optimizatorul (Optimizer): algoritmul care decide cu cât și în ce direcție să ajusteze milioanele de greutăți pentru ca la următorul pas pierderea să fie mai mică.

În timp ce SGD (Stochastic Gradient Descent) cu momentum este încă utilizat în Computer Vision clasic, torch.optim.AdamW este campionul absolut în procesarea limbajului natural și modelele Transformer. AdamW adaptează rata de învățare independent pentru fiecare parametru și decuplează corect regularizarea de tip Weight Decay (care penalizează greutățile exagerat de mari pentru a preveni supra-învățarea).

La fiecare pas al buclei de antrenare, este obligatoriu să respecți succesiunea: zero_grad() -> backward() -> step().

Cum să o reții ușor

💡 Dacă Autograd este busola care îți spune în ce direcție este panta muntelui, optimizatorul este ghidul montan cu experiență care decide cât de mare să fie pasul pe care îl faci (learning rate) și cum să prinzi inerție pe coborâre.

Opțiuni și parametri tehnici

  • params: lista parametrilor optimizați (model.parameters()).
  • lr (Learning Rate): mărimea pasului de actualizare (valori tipice: 1e-3 pentru rețele mici, 1e-4 până la 2e-5 pentru fine-tuning LLM).
  • weight_decay: coeficientul de penalizare L2 a mărimii greutăților (valoare standard în AdamW: 0.01).
  • set_to_none=True: în optimizer.zero_grad(set_to_none=True) eliberează memoria gradientului în loc să scrie zerouri, economisind timp de CPU/GPU!

Exemple practice și cazuri de utilizare

  • Trunchierea gradienților (Gradient Clipping) pentru a preveni exploziile numerice: adaugă torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0) înainte de optimizer.step().
  • Rată de învățare diferită pe straturi: pasează grupuri de parametri optim.AdamW([{"params": model.baza.parameters(), "lr": 1e-5}, {"params": model.cap.parameters(), "lr": 1e-3}]).
  • Optimizatorul clasic SGD cu momentum: optim.SGD(model.parameters(), lr=0.01, momentum=0.9).

Sfaturi de configurare & capcane

Folosește întotdeauna optimizer.zero_grad(set_to_none=True) — setarea gradienților la None în loc de tensor plin de zerouri oferă o creștere vizibilă de viteză și reduce fragmentarea VRAM.

Comenzi și ghiduri înrudite