Dacă ai petrecut puțin timp pe internet în ultimul deceniu, ai absorbit impresia că „neural network” înseamnă „magie”. Nu este. O rețea neuronală este o funcție. Intrările intră pe o parte, ieșirile ies pe cealaltă, iar o grămadă mare de numere reglabile la mijloc decid cum se transformă intrările în ieșiri. Asta e toată premisa. Tot restul, backpropagation, gradient descent, întreg canonul deep learning, e doar instalație în jurul acestei singure idei.
Lecția asta e deliberat săracă în cod. Modulul 10 va avea destul PyTorch, destui training loop-uri, destulă anxietate pentru memoria GPU. Înainte să aterizeze toate astea, vreau ca modelul mental să se așeze. Dacă înțelegi ce este o rețea neuronală, matematica din miezul ei, de ce contează nonliniaritatea, ce face de fapt backpropagation, fiecare decizie de framework din următoarele două lecții va părea evidentă, nu misterioasă.
O retea neuronala este o functie
Gândește-te la cel mai simplu clasificator posibil. Intrare: un vector x cu două numere. Ieșire: o probabilitate, un singur număr între 0 și 1. Funcția pe care o vrem este f(x) → p. Dacă o scriem ca un lanț de operații, ar putea arăta așa:
z1 = W1 @ x + b1 # linear: matrix times vector, plus bias
a1 = relu(z1) # nonlinearity
z2 = W2 @ a1 + b2 # another linear
p = sigmoid(z2) # squash to [0, 1]
W1, W2, b1, b2 sunt parametrii. Tot restul e fix. A antrena o rețea neuronală înseamnă: găsește valori pentru acei parametri astfel încât, în medie, f(x) să fie aproape de răspunsul corect pentru fiecare exemplu de antrenament pe care îl avem.
Ăsta e tot jocul. Loss function, gradient descent, totul, există ca să găsească valori bune pentru acele matrice W și b.
Neuronul, demistificat
Un „neuron” e cea mai mică unitate a întregii construcții. Ia un vector de intrări x = [x1, x2, ..., xn], înmulțește fiecare cu un weight, adaugă un bias și trece rezultatul printr-o funcție neliniară:
output = activation(w1*x1 + w2*x2 + ... + wn*xn + b)
Suma ponderată e doar un dot product. Bias-ul e doar un număr. Nonliniaritatea e una dintre:
- ReLU:
max(0, z). Ieftină, calul de povară al deep learning-ului. Dacă intrarea e negativă, ieșirea e zero. Altfel, lasă să treacă. - GELU: curbă netedă în formă de ReLU. Standard în transformere de prin 2018.
- Sigmoid:
1 / (1 + exp(-z)). Strânge la (0, 1). Folosit la ieșirea clasificatoarelor binare; rar folosit în interiorul rețelei azi, fiindcă omoară gradienții. - Tanh: ca sigmoid, dar strânge la (-1, 1). Aceeași problemă.
Un „layer” e doar mai mulți neuroni care împart același vector de intrare, dar cu weights diferite. Dacă intrarea e un vector de 100 de dimensiuni și un layer are 64 de neuroni, matricea de weights a layer-ului e (64, 100). Un layer este o înmulțire de matrice urmată de o nonliniaritate. O rețea e mai multe layere stivuite.
De ce nonliniaritatea este intregul scop
Iată chestia care mereu sună a tehnicalitate, dar e de fapt de încărcare. Să zicem că stivuiești două layere liniare fără nonliniaritate între ele:
y = W2 @ (W1 @ x + b1) + b2
= W2 @ W1 @ x + W2 @ b1 + b2
= W' @ x + b'
Unde W' = W2 @ W1 și b' = W2 @ b1 + b2. Ăsta e doar un singur layer liniar. Poți stivui o mie de layere liniare și întreaga stivă colapsează într-o singură funcție liniară. N-ai învățat nimic mergând în adâncime. Modelul poate trasa doar linii drepte prin spațiul de intrare, iar majoritatea problemelor reale nu au granițe de decizie sub formă de linii drepte.
Nonliniaritatea dintre layere este ce previne colapsul. ReLU e suficient. „Universal approximation theorem” spune, în mare: o rețea neuronală cu cel puțin un layer ascuns și o nonliniaritate poate aproxima orice funcție continuă, dată fiind suficientă neuroni. În practică, mai multe layere sunt dramatic mai eficiente decât layere singulare mai late, asta e observația empirică care a născut deep learning-ul.
Backpropagation, in cuvinte simple
Ai o rețea. Produce predicții. Compari predicțiile cu adevărul și calculezi un loss, un singur număr care spune cât de greșită a fost rețeaua. Pentru clasificare, de obicei e cross-entropy. Pentru regresie, mean squared error.
Vrei să împingi fiecare parametru într-o direcție care reduce loss-ul. Gradientul loss-ului față de un parametru îți spune în ce direcție să-l împingi: dacă gradientul e pozitiv, scăderea parametrului scade loss-ul. Dacă e negativ, creșterea lui scade loss-ul. Fă un mic pas în direcția gradientului negativ. Ăsta e gradient descent.
Backpropagation este doar algoritmul pentru calcularea acelor gradienți eficient folosind regula lanțului din calcul. Observația ingenioasă din spatele backprop, făcută de oameni în anii ‘70 și ‘80, este că nu trebuie să calculezi gradientul fiecărui parametru independent. Calculezi gradientul la ieșire, apoi îl propagi înapoi prin rețea câte un layer pe rând, refolosind rezultate intermediare. Costul calculării tuturor gradienților e aproximativ costul unui singur forward pass. Fără acest truc, deep learning-ul e fără speranță computațional. Cu el, poți antrena rețele cu sute de miliarde de parametri.
În esență nu vei scrie niciodată backprop manual. Fiecare framework modern, PyTorch, JAX, TensorFlow, ți-l face prin automatic differentiation. Tu definești forward pass-ul; framework-ul înregistrează operațiile și le parcurge invers. Lecția 56 arată cum arată asta în PyTorch.
Ce iti aduce „adancimea”
De ce să te chinui să stivuiești multe layere în loc de un singur layer lat? Fiindcă adâncimea permite rețelei să învețe trăsături ierarhice. Exemplul clasic e recunoașterea imaginilor: primul layer învață să detecteze muchii. Al doilea layer învață să combine muchiile în colțuri și texturi. Al treilea layer le combină pe acelea în ochi, roți, frunze. Cu cât layer-ul e mai adânc, cu atât mai abstractă e trăsătura.
Tu nu inginerești acele trăsături. Rețeaua le descoperă singură din semnalul de antrenament. Asta e magia, dacă există vreuna: deep learning-ul înlocuiește feature engineering-ul dureros, specific domeniului din ML clasic, cu compute brut și mult data. Modulul 9 a petrecut o întreagă lecție (50) pe feature engineering pentru date tabulare. Pentru imagini, întregul pas dispare, rețelele convoluționale învață trăsăturile potrivite din pixeli.
Cand deep learning castiga cu adevarat
Deep learning-ul e unealta potrivită când:
- Intrarea e high-dimensional și structurată. Imagini (milioane de pixeli, structură spațială). Audio (forme de undă, structură de frecvență). Text (secvențe, structură sintactică). Video (spațial + temporal). Acestea sunt domenii unde nu există o cale bună de a inginera trăsături manual și unde arhitectura potrivită (CNN pentru imagini, transformer pentru secvențe) poate exploata structura direct.
- Ai mult data. Rețelele profunde au milioane până la miliarde de parametri. Fac overfitting instant pe dataset-uri mici. Regulă empirică: sub ~10.000 de exemple, probabil vrei un model bazat pe arbori din lecția 51. Peste ~1 milion, deep learning-ul de obicei merită încercat.
- Performanța contează mai mult decât interpretabilitatea. Un CNN antrenat care clasifică imagini medicale la acuratețe de radiolog uman e valoros chiar dacă nimeni nu poate explica complet de ce ia o anumită decizie. În alte contexte, decizii de credit, decizii medicale unde sunt implicați reglementatori, întrebări științifice cauzale, opacitatea e descalificatoare.
Cand deep learning pierde
Lecția 51 a avut o referință pe care o voi repeta: pentru date tabulare, gradient-boosted trees încă bat. XGBoost, LightGBM, CatBoost bat rețelele neuronale pe genul de date structurate pe care le găsești în spreadsheet-uri, baze de date și majoritatea problemelor de business, chiar și în 2026. A fost un flux constant de articole care încearcă să inverseze asta, iar rezumatul onest e că pe majoritatea benchmark-urilor tabulare, arborii sunt încă în față sau la egalitate. Se antrenează în secunde pe un CPU și nu necesită clustere de GPU-uri. Folosește-i.
Alte locuri unde deep learning-ul e alegerea greșită:
- Dataset-uri mici (sub câteva mii de exemple). Arbori, modele liniare sau transfer learning de la o rețea preantrenată.
- Cerințe stricte de interpretabilitate. Poți interpreta coeficienții unei regresii logistice. Nu poți interpreta semnificativ o rețea de 100 de milioane de parametri.
- Bugete de latență strânse pe hardware mic. Un microcontroller care face inferență la 1ms, vrei un arbore mic sau un model liniar reglat manual, nu un transformer.
- Probleme unde costul de a greși e uriaș și costul de a fi lent e mic. O bancă ce ia o decizie de credit de 50M$ poate petrece o oră și avea un om în buclă. Nu are nevoie de inferență în 5ms.
Realitatea computationala
A antrena un model serios de deep learning înseamnă să folosești un GPU sau un TPU. Nu opțional. O rulare modernă de antrenare a unui transformer e în esență imposibilă pe un CPU în orice timp rezonabil. Piața de hardware în 2026 e dominată de NVIDIA H100 și mai noile B200, cu AMD MI300 încercând să recupereze și Apple Silicon (chip-uri din seria M cu backend-ul MPS) tot mai viabile pentru dezvoltare și antrenare la scară mică.
Dacă înveți, folosește tier-ul gratuit Google Colab, notebook-urile Kaggle sau Lightning Studios. Nu cumpăra un GPU înainte să știi că ai nevoie de unul.
Lectia „scara este aproape totul”
Cea mai importantă și cea mai puțin măgulitoare descoperire a ultimului deceniu de cercetare deep learning: arhitectura contează mai puțin decât scara. Aceeași arhitectură transformer din 2017 e cea care alimentează modelele de frontieră în 2026. Ce s-a schimbat e cantitatea de date, cantitatea de compute și cantitatea de antrenare. Inteligența în designul arhitecturii a produs câștiguri modeste. Aruncând de 10x mai multe date și de 10x mai mult compute pe aceeași arhitectură a produs aproape tot ce s-a întâmplat dramatic în AI din 2018.
Implicația practică pentru tine, construind sisteme de deep learning în 2026: nu inova pe arhitectură înainte să fi maximizat lucrurile plictisitoare. Mai mult data, date mai curate, antrenare mai lungă, model mai mare, optimizer mai bun, learning rate schedule mai bun. Răsucirea arhitecturală deșteaptă care îți aduce 0.5% mai multă acuratețe rar merită costul de inginerie comparat cu hrănirea aceluiași model cu mai multe date.
Planul de aici incolo
Lecția 56 introduce PyTorch, tensori, autograd, API-ul nn.Module. Vom defini o mică rețea de clasificare în mod corect și vom inspecta ce face fiecare bucată. Lecția 57 leagă totul cu training loop-ul: cele cinci linii care transformă o rețea inițializată aleatoriu într-un model antrenat, plus contabilitatea de producție (checkpointing, mixed precision, distributed training) care transformă un prototip de notebook într-un sistem real. Până la sfârșitul Modulului 10, vei fi scris un sistem de deep learning funcțional de la zero și vei ști exact pentru ce e fiecare linie.
Înainte.