Grund Tensorflow 2.

(propagarea înapoi sau modul în care funcționează magia)

Laszlo Fazekas

10 noiembrie 2019 · 8 minute citite

În articolul meu anterior, am scris că o rețea neuronală este o cutie neagră care are o intrare, are o ieșire și are o mulțime de butoane pe ea. Aceste butoane pot fi utilizate pentru a seta ce ar trebui să facă rețeaua. De asemenea, am scris că magia este că butoanele nu trebuie să fie stabilite de noi. Este suficient să arătăm eșantioane unui algoritm de optimizare care reglează fin rețeaua pentru noi pe baza acestui lucru. În această lucrare, ne scufundăm puțin în cavitatea iepurelui și analizăm cum funcționează vraja, adică cum funcționează algoritmul de optimizare care reglează rețeaua. Oricine nu a citit prima parte poate compensa aici:

tensorflow

Grund TensorFlow

(rețele neuronale, tensori și recunoaștere a imaginii în practică)

medium.com

Am aflat din prima parte că, în timpul predării, calculăm ieșirea rețelei în fiecare etapă și apoi comparăm acest lucru cu ieșirea dorită pentru a calcula eroarea rețelei. Scopul este de a minimiza această eroare. Cum poți rula într-o astfel de sarcină? Ei bine, putem calcula această eroare ca o funcție. Parametrii funcției sunt greutățile (pozițiile curente ale potențiometrelor), iar intrarea și ieșirea curente sunt constantele funcției în etapa dată. Dacă ar fi să încercăm să reprezentăm acest lucru, am avea o suprafață deluroasă. Singura problemă cu acest lucru este că 122.571 spațiu dimensional ar fi necesar pentru a reprezenta funcția de eroare a rețelei neuronale din articolul precedent. Este destul de greu de imaginat. Nici nu încercați, pentru că vă va răni doar capul. În prima rundă, să începem cu două greutăți, deoarece poate fi totuși reprezentată în 3 dimensiuni.

Cu cât un punct de pe deal este mai înalt, cu atât este mai mare eroarea și cu atât mai mic, cu atât mai mic. Fiecare punct din spațiu aparține poziției date a butoanelor. Când optimizăm greutățile, este ca și cum am sta într-un anumit punct de pe un deal de unde dorim să coborâm în direcția unei erori minore. O complicație specială este că nu vedem întregul spațiu, avem doar informații despre mediul nostru cel mai apropiat. Deci ar trebui să urcăm pe munte cu ochii închiși între timp și nu putem decât să bâjbâi.

Ce se poate face atunci? În absența unuia mai bun, scanează unde se înclină muntele și începe în jos pe baza acestuia. Ei bine, de unde știm unde se află o pantă într-un punct dat într-o funcție de eroare multiparametru?

Dacă cineva este interesat de detalii cu privire la modul în care putem obține o funcție uriașă, cum ar fi o rețea neuronală și să avem fundamentele matematice corecte, consultați prezentarea lui Andrej Karpathy pe această temă.

Pentru a calcula derivatele, există o clasă în Tensorflow numită GradientTape. Este ca un reportofon. La pornire, înregistrează toate operațiile tensorflow și, după oprire, putem reda operațiile în ordine inversă pentru a obține derivatele. Să vedem și un exemplu de utilizare a acestuia.

La începutul codului, definim un model liniar foarte, foarte simplu, care constă în înmulțirea intrării cu o greutate W și adăugarea unui număr b. Oricine se teme încă de o oră de matematică poate sări în sensul că aceasta este exact ecuația unei linii drepte. Putem percepe, de asemenea, aceasta ca o rețea neuronală foarte simplă formată din 1 neuron care are o singură funcție de intrare și nu are ieșire. Vom învăța acest model, pentru care generăm o grămadă (1000 de bucăți) de probe. În model, ambele valori inițiale ale lui W și b sunt 16, în timp ce valorile care trebuie atinse (TRUE_W și TRUE_b) sunt 3 și respectiv 0,5. Cu următoarele câteva linii, trasăm și linia definită de modelul nostru, precum și setul de predare.

În cele din urmă, redistribuim setul de puncte din eșantion și linia definită de model, care aparent coincid acum.