From Wikipedia, the free encyclopedia
În învățarea automată, backpropagation este o metodă de estimare a gradientului utilizată pentru a antrena modele de rețele neurale. Estimarea gradientului este utilizată de algoritmul de optimizare pentru a calcula actualizările parametrilor rețelei.
Este o aplicare eficientă la astfel de rețele a regulii lanțului(d) enunțată de Leibniz (1673) pentru calculul derivatelor funcțiilor compuse.[1] Este cunoscut și ca modul invers al diferențierii automate(d) sau acumularea inversă(d), datorită lui Seppo Linnainmaa(d) (1970).[2][3][4][5][6][7] Termenul de „corectare a erorilor cu propagare inversă” a fost introdus în 1962 de Frank Rosenblatt(d),[8][9] dar el nu știa cum să implementeze acest lucru, chiar dacă Henry J. Kelley(d) avea un precursor continuu al lui backpropagation[10] deja în 1960 în contextul teoriei controlului(d).[9]
Backpropagation calculează gradientul unei funcții de cost(d) în raport cu ponderile rețelei pentru un singur exemplu de intrare-ieșire și face acest lucru eficient, calculând gradientul strat cu strat, iterând(d) înapoi de la ultimul strat pentru a evita calculele redundante ale termenilor intermediari din regula lanțului; aceasta se poate calcula prin programare dinamică(d).[10][11][12] În mod obișnuit, se utilizează metoda de descreștere a gradientului(d) sau variante ale ei, cum ar fi cea stochastică(d).[13]
În sens strict, termenul backpropagation se referă doar la algoritmul de calcul al gradientului, nu la modul în care este utilizat gradientul; dar termenul este adesea folosit în mod liber pentru a se referi la întregul algoritm de învățare – inclusiv la modul în care este utilizat gradientul, cum ar fi descreșterea stochastică.[14] În 1986 David E. Rumelhart(d) et al. au publicat o analiză experimentală a tehnicii.[15] Aceasta a contribuit la popularizarea tehnicii și a ajutat la inițierea unei perioade active de cercetare în domeniul perceptronilor multistrat(d).
Backpropagation calculează gradientul în spațiul ponderilor(d) unei rețele neuronale feedforward, în raport cu o funcție de cost(d). Se notează cu:
În calculul lui backpropagation, se folosesc alte cantități intermediare introducându-le după cum este necesar mai jos. Termenii de bias nu sunt tratați în mod special, deoarece corespund unei ponderi cu o intrare fixă de 1. Pentru backpropagation, funcția de cost și funcțiile de activare specifice nu contează atâta timp cât ele și derivatele lor pot fi evaluate eficient. Printre funcțiile tradiționale de activare se numără sigmoidele, tanh și ReLU. Au mai fost propuse și swish,[16] mish,[17] și alte funcții de activare.
Rețeaua de ansamblu este o combinație de compuneri de funcții(d) și înmulțiri de matrici:
Ca mulțime de antrenare se ia o mulțime de perechi intrare-ieșire, . Pentru fiecare pereche intrare-ieșire din mulțimea de antrenare, costul modelului pe acea pereche este costul diferenței dintre rezultatul prezis și rezultatul așteptat :
În timpul evaluării modelului, ponderile sunt fixe, în timp ce intrările variază (și ieșirea așteptată poate fi necunoscută), iar rețeaua se termină cu stratul de ieșire (nu include funcția de cost). În timpul antrenării modelului, perechea intrare-ieșire este fixă în timp ce ponderile variază, iar rețeaua se termină cu funcția de cost.
Backpropagation calculează gradientul pentru o pereche de intrare-ieșire fixă , unde ponderile pot varia. Fiecare componentă individuală a gradientului, poate fi calculată prin regula lanțului; dar a face acest lucru separat pentru fiecare pondere este ineficient. Backpropagation calculează eficient gradientul, evitând calculele duplicate și nu calculează valori intermediare inutile, calculând gradientul fiecărui strat — în special gradientul intrării ponderate a fiecărui strat, notat cu – din spate către față.
Cu alte cuvinte, punctul cheie este că, din moment ce singurul mod în care o pondere din afectează costul este prin efectul său asupra stratului următor și face acest lucru liniar, rezultă că sunt singurele date de care este nevoie pentru a calcula gradienții ponderilor stratului , iar apoi stratul anterior poate fi calculat cu și repetat recursiv. Aceasta evită ineficiența în două moduri. În primul rând, evită duplicarea, deoarece atunci când se calculează gradientul la stratul – nu mai este nevoie să se recalculeze toate derivatele pe straturile ulterioare de fiecare dată. În al doilea rând, evită calculele intermediare inutile, deoarece în fiecare etapă calculează direct gradientul ponderilor în raport cu rezultatul final (costul), și nu calculează inutil derivatele valorilor straturilor ascunse în raport cu modificările ponderilor .
Backpropagation poate fi exprimat pentru rețelele simple feedforward în termeni de înmulțire de matrici sau, mai general, în termeni de graf adjunct.
Pentru cazul de bază al unei rețele feedforward, în care nodurile din fiecare strat sunt conectate numai la nodurile din stratul imediat următor (fără a sări peste niciun strat) și există o funcție de cost care calculează costul scalar pentru ieșirea finală, backpropagation poate fi înțeles pur și simplu prin înmulțiri de matrici.[lower-alpha 2] În esență, backpropagation evaluează expresia derivatei funcției de cost ca un produs al derivatelor între fiecare strat de la dreapta la stânga – „înapoi” – iar gradientul ponderilor dintre fiecare strat este o simplă modificare a produsele parțiale („eroarea propagată înapoi”).
Dacă se dă o pereche intrare-ieșire , costul este:
Pentru a-l calcula, se începe cu intrarea și se merge înainte; se notează intrarea ponderată a fiecărui strat ascuns cu și rezultatul stratului ascuns ca activarea . Pentru backpropagation, activarea precum și derivatele (evaluat la ) trebuie să fie memorate pentru utilizare în timpul trecerii înapoi.
Derivata costului în termeni de intrări este dată de regula lanțului; fiecare termen este o derivată totală(d), evaluată la valoarea rețelei (în fiecare nod) pe intrarea :
Unde este o matrice diagonală.
Acești termeni sunt: derivata funcției de cost;[lower-alpha 3] derivatele funcțiilor de activare;[lower-alpha 4] și matricile ponderilor:[lower-alpha 5]
Gradientul este transpusa derivatei ieșirii în termeni de intrare, deci matricile sunt transpuse și ordinea înmulțirii se inversează, dar intrările sunt aceleași:
Backpropagation constă apoi, în esență, în evaluarea acestei expresii de la dreapta la stânga (echivalent, înmulțirea expresiei anterioare pentru derivată de la stânga la dreapta), calculând gradientul la fiecare strat pe parcurs; se mai adaugă un pas, deoarece gradientul ponderilor nu este doar o subexpresie: există o înmulțire suplimentară.
Introducerea mărimii auxiliare pentru produsele parțiale (înmulțirea de la dreapta la stânga), interpretată ca „eroare la nivelul ” și definită ca gradientul valorilor de intrare la nivelul :
Cum este un vector, de lungime egală cu numărul de noduri din nivelul , fiecare componentă este interpretată drept „costul atribuibil (valorii) nodului respectiv”.
Gradientul ponderilor din stratul este atunci:
Factorul este pentru că greutățile între nivelele și afectează proporțional cu intrările (activările): intrările sunt fixe, ponderile variază.
poate fi ușor calculat recursiv, mergând de la dreapta la stânga, după cum urmează:
Gradienții ponderilor pot fi astfel calculați folosind câteva înmulțiri de matrici pentru fiecare nivel; aceasta este backpropagation.
Se compară cu calculul naiv înainte (folosind pentru ilustrare):
În backpropagation există două diferențe esențiale:
Pentru grafuri mai generale și alte variații avansate, backpropagation poate fi înțeles în termeni de diferențiere automată(d), unde backpropagation este un caz particular al acumulării inverse (sau „modului invers”).
Obiectivul oricărui algoritm de învățare supravegheată(d) este de a găsi o funcție care mapează cel mai bine un set de intrări la ieșirea lor corectă. Motivația pentru backpropagation este de a antrena o rețea neurală cu mai multe straturi, astfel încât să poată învăța reprezentările interne adecvate pentru a-i permite să învețe orice mapare arbitrară a intrării la ieșire.[18]
Pentru a înțelege calculul matematic al algoritmului de backpropagation, este nevoie mai întâi de dezvoltarea unei intuiții despre relația dintre produsul real al unui neuron și rezultatul corect pentru un anumit exemplu de antrenament. Fie o rețea neurală simplă cu două unități de intrare, o unitate de ieșire și fără unități ascunse și în care fiecare neuron utilizează o ieșire liniară (spre deosebire de majoritatea lucrărilor pe rețelele neurale, în care maparea de la intrări la ieșiri este neliniară)[lower-alpha 6] care este suma ponderată a intrărilor sale.
Inițial, înainte de antrenare, ponderile pot fi stabilite aleatoriu. Apoi neuronul învață din exemplele de antrenare(d), care în acest caz constau dintr-o mulțime de tupluri(d) unde și sunt intrările rețelei și t este ieșirea corectă (ieșirea pe care rețeaua ar trebui să o producă când primește acele intrări, la momentul antrenării). Când primește la intrare și , rețeaua inițială va calcula o ieșire y care probabil diferă de t (dat fiind că ponderile sunt aleatorii). O funcție de cost este utilizată pentru măsurarea discrepanței dintre ieșirea așteptată t și ieșirea calculată y. Pentru problemele de analiză de regresie, eroarea pătrată poate fi folosită ca funcție de cost, dar pentru clasificare(d) se poate folosi entropia încrucișată categorială(d).
De exemplu, fie o problemă de regresie folosind eroarea pătrată ca funcție de cost:
unde E este discrepanța sau eroarea.
Fie rețeaua pe un singur caz de antrenare: . Astfel, intrările și sunt 1 și, respectiv, 1, iar ieșirea corectă t este 0. Acum, dacă este reprezentată relația dintre ieșirea rețelei y pe axa orizontală și eroarea E pe axa verticală, rezultatul este o parabolă. Minimul parabolei corespunde ieșirii y care minimizează eroarea E. Pentru un singur caz de antrenament, minimul atinge și axa orizontală, ceea ce înseamnă că eroarea va fi zero și rețeaua poate produce o ieșire y care se potrivește exact cu ieșirea țintă t. Prin urmare, problema mapării intrărilor la ieșiri poate fi redusă la o problemă de optimizare(d) a găsirii unei funcții care va produce eroarea minimă.
Ieșirea unui neuron depinde însă de suma ponderată a tuturor intrărilor sale:
Unde și sunt ponderile conexiunii de la unitățile de intrare la unitatea de ieșire. Prin urmare, eroarea depinde și de ponderile de intrare ale neuronului, care este în cele din urmă ceea ce trebuie schimbat în rețea pentru a permite învățarea.
În acest exemplu, la injectarea datelor de antrenare , funcția de cost devine
Atunci, funcția de cost ia forma unui cilindru parabolic cu baza îndreptată de-a lungul dreptei . Deoarece toate mulțimile de ponderi care satisfac minimizează funcția de cost, în acest caz sunt necesare constrângeri suplimentare pentru a converge către o soluție unică. Constrângerile suplimentare ar putea fi generate fie prin stabilirea unor condiții specifice pentru ponderi, fie prin injectarea de date suplimentare de antrenare.
Un algoritm utilizat în mod obișnuit pentru a găsi mulțimea de ponderi care minimizează eroarea este descreșterea gradientului(d). Prin backpropagation, se calculează cea mai abruptă direcție de descreștere a funcției de cost față de ponderile sinaptice actuale. Ponderile pot fi apoi modificate pe cea mai abruptă direcție de descreștere, iar eroarea este redusă la minimum într-un mod eficient.
cu
unde
Pentru fiecare neuron , ieșirea sa este definită ca
unde funcția de activare(d) este neliniară(d) și diferențiabilă în regiunea de activare (ReLU nu este diferențiabilă într-un punct). O funcție de activare folosită istoric este funcția logistică(d):
care are o derivată convenabilă:
Prin urmare, derivata în raport cu poate fi calculată dacă se cunosc toate derivatele în raport cu ieșirile ale stratului următor – cele mai apropiate de neuronul de ieșire. Dacă vreunul dintre neuroni din mulțimea nu este conectat la neuronul , atunci ar fi independent de , iar derivata parțială corespunzătoare sub însumare s-ar reduce la 0.
Calculul derivatei parțiale a erorii în raport cu o pondere se face folosind regula lanțului(d) de două ori:
|
(Eq. 4) |
În ultimul factor din partea dreaptă a celor de mai sus, un singur termen din sumă, , depinde de , astfel încât
|
(Eq. 5) |
Dacă neuronul se află în primul strat după stratul de intrare, este doar .
Intrarea a unui neuron este suma ponderată a ieșirilor a neuronilor anteriori. Dacă neuronul se află în primul strat după stratul de intrare, atunci ale stratului de intrare sunt pur și simplu intrările la rețea. Numărul de unități de intrare către neuron este . Variabila denotă ponderea dintre neuronul din stratului anterior și neuronul din stratului curent. care pentru funcția de activare logistică(d)
Acesta este motivul pentru care backpropagation necesită ca funcția de activare să fie diferențiabilă. (Cu toate acestea, funcția de activare ReLU(d), care este nediferențiabilă în 0, a devenit destul de populară, de exemplu în AlexNet(d))
Primul factor este simplu de evaluat dacă neuronul se află în stratul de ieșire, pentru că atunci și Dacă jumătate din pătratul erorii este folosit ca funcție de cost, o putem rescrie ca
Dacă însă se află într-un strat interior arbitrar al rețelei, metoda de găsire a derivatei în raport cu este mai puțin evidentă.
Considerând o funcție, intrările fiind toți neuronii care primesc intrare de la neuronul ,
și luând derivata totală(d) în raport cu , se obține o expresie recursivă pentru derivată:
Înlocuind Eq. 2, Eq. 3 Eq.4 și Eq. 5 în Eq. 1 se obține:
Metoda descreșterii de gradient implică calculul derivatei funcției de cost în raport cu ponderile rețelei. Aceasta se face în mod normal utilizând backpropagation. Presupunând un neuron de ieșire,[lower-alpha 7] funcția de eroare pătrată este
dacă este funcția logistică, iar eroarea este pătratul erorii:
Pentru a actualiza ponderea folosind descreșterea gradientului, trebuie aleasă o rată de învățare, . Modificarea ponderii trebuie să reflecte impactul asupra lui al unei creșteri sau scăderi a lui . Dacă , atunci o creștere a lui va face să crească ; invers, dacă , o creștere a lui va face să scadă . Noul se adaugă la ponderea veche, iar produsul dintre rata de învățare și gradient, înmulțit cu garantează că se schimbă într-un mod care scade întotdeauna . Cu alte cuvinte, în ecuația imediat de mai jos, îl schimbă întotdeauna pe în așa fel încât să se reducă:
Folosind o matrice Hessiană(d) de derivate de ordinul doi ale funcției de eroare, algoritmul Levenberg-Marquardt(d) converge adesea mai rapid decât descreșterea gradientului de ordinul întâi, mai ales când topologia funcției de eroare este complicată.[19][20] De asemenea, el poate găsi soluții cu un număr mai mic de noduri, cu care alte metode ar putea să nu conveargă.[20] Hessiana poate fi aproximată prin matricea de informații Fisher(d).[21]
Funcția de cost este o funcție care mapează valorile uneia sau mai multor variabile pe un număr real reprezentând intuitiv un „cost” asociat cu acele valori. Pentru backpropagation, funcția de cost calculează diferența dintre ieșirea rețelei și rezultatul așteptat, după ce un exemplu de antrenare s-a propagat prin rețea.
Expresia matematică a funcției de cost trebuie să îndeplinească două condiții pentru ca ea să poată fi utilizată în backpropagation. Prima este că poate fi scrisă ca o medie a funcțiilor de eroare , pentru exemple individuale de antrenare, . Motivul pentru această ipoteză este că algoritmul backpropagation calculează gradientul funcției de eroare pentru un singur exemplu de antrenare, care trebuie generalizat la funcția de eroare generală. A doua presupunere este că poate fi scrisă în funcție de ieșirile din rețeaua neurală.
Fie vectori în .
Se alege o funcție de eroare care măsoară diferența dintre două ieșiri. Alegerea standard este pătratul distanței euclidiene dintre vectori și :
Backpropagation a fost derivată în mod repetat, deoarece este în esență o aplicare eficientă a regulii lanțului(d) (enunțată în premieră de Gottfried Wilhelm Leibniz în 1676[1][24]) asupra rețelelor neurale.
Terminologia „corectare a erorilor prin backpropagation” a fost introdusă în 1962 de Frank Rosenblatt(d), dar el nu știa cum să implementeze acest lucru.[25] În orice caz, el a studiat doar neuronii ale căror ieșiri erau niveluri discrete, care aveau doar derivate zero, făcând backpropagation imposibil.
Precursorii lui backpropagation au apărut în teoria controlului optim(d) încă din anii 1950. Yann LeCun(d) et al. creditează lucrările din anii 1950 a lui Pontreaghin(d) și alții, în teoria controlului optim, în special metoda stării adjuncte(d), ca fiind o versiune în timp continuu a lui backpropagation.[26] Hecht-Nielsen(d)[27] creditează algoritmul Robbins–Monro(d) (1951) și Applied Optimal Control (1969) a lui Arthur Bryson(d) și Yu-Chi Ho(d) ca ceva ce anticipa backpropagation. Alți precursori au fost Henry J. Kelley(d) 1960, [10] și Arthur E. Bryson(d) (1961).[11] În 1962, Stuart Dreyfus(d) a publicat un calcul mai simplu bazată doar pe regula lanțului(d).[28][29][30] În 1973, el adapta parametrii controllerelor proporțional cu gradienții de eroare.[31] Spre deosebire de backpropagation modern, acești precursori foloseau calcule standard cu matricea jacobiană de la o etapă la cea anterioară, fără a aborda legăturile directe în mai multe etape și nici potențialele câștiguri suplimentare de eficiență datorate dispersității rețelei.
Algoritmul de învățare ADALINE(d) (1960) a fost o descreștere de gradient cu funcția de cost pătratul erorii pentru un singur strat. Primul perceptron multistrat(d) (MLP) cu mai mult de un strat antrenat prin descreșterea de gradient stochastică(d)[13] a fost publicat în 1967 de Shun'ichi Amari(d).[32][9] MLP avea 5 straturi, din care 2 straturi puteau fi învățate, și a învățat să clasifice modele care nu sunt separabile liniar.[9]
Backpropagation modern a fost publicat pentru prima dată de Seppo Linnainmaa(d) ca „mod invers de diferențiere automată(d)” (1970)[2] pentru rețele discrete conectate de funcții diferențiabile imbricate.[3][4]
În 1982, Paul Werbos(d) a aplicat backpropagation la MLP-uri în modul care a devenit standard.[33][34] Werbos descria într-un interviu cum a dezvoltat backpropagation. În 1971, în timpul lucrării sale de doctorat, el a dezvoltat backpropagation pentru a matematiciza „fluxul de energie psihică” al lui Freud. S-a confruntat cu dificultăți repetate în publicarea lucrării, reușind abia în 1981.[35]
Prin preajma lui 1982,[35]:376 David E. Rumelhart(d) a dezvoltat independent[36]:252 backpropagation și a predat algoritmul celor din cercul său de cercetare. El nu cita lucrări anterioare, deoarece nu le cunoștea. A publicat algoritmul mai întâi într-o lucrare din 1985, apoi, într-un articol din Nature din 1986, a descris o analiză experimentală a tehnicii.[15] Aceste lucrări au devenit foarte citate, au contribuit la popularizarea lui backpropagation și au coincis cu renașterea interesului de cercetare în rețelele neurale în anii 1980.[18][37][38]
În 1985, metoda a fost descrisă și de David Parker.[39] Yann LeCun(d) a propus o formă alternativă de backpropagation pentru rețelele neurale în teza sa de doctorat din 1987.[40]
Descreșterea gradientului a avut nevoie de o perioadă considerabilă de timp pentru a ajunge la acceptare. Unele dintre obiecțiile inițiale au fost: că nu existau garanții că descreșterea gradientului poate atinge un minim global, ci doar un minim local; că neuronii erau „cunoscuți” de fiziologi ca producând semnale discrete (0/1), nu continue, iar cu semnale discrete, nu există nici un gradient de luat. Vezi interviul cu Geoffrey Hinton.[35]
La acceptare au contribuit mai multe aplicații de antrenare a rețelelor neurale prin backpropagation, uneori atingând popularitate în afara cercurilor de cercetare.
În 1987, NETtalk(d) a învățat să convertească textul în limba engleză în pronunție. Sejnowski a încercat să-l antreneze atât cu backpropagation, cât și cu mașina Boltzmann, dar a constatat că backpropagation funcționează mult mai rapid, așa că l-a folosit pentru varianta finală de NETtalk.[35](p324) Programul NETtalk a avut un mare succes și a apărut în emisiunea Today(d).[41]
În 1989, Dean A. Pomerleau a publicat ALVINN, o rețea neurală antrenată să conducă autonom vehicule(d) folosind backpropagation.[42]
LeNet(d), publicat în 1989, recunoștea codurile poștale scrise de mână.
În 1992, TD-Gammon(d) a atins nivelul unui jucător uman de table. Era un agent de învățare cu întârire, cu o rețea neurală cu două straturi, antrenată prin backpropagation.[43]
În 1993, Eric Wan a câștigat un concurs internațional de recunoaștere a șabloanelor cu backpropagation.[6][44]
În anii 2000 a pierdut din popularitate, dar a revenit în anii 2010, beneficiind de sisteme de calcul ieftine și puternice bazate pe GPU-uri. A fost mai ales cazul în domeniul recunoașterii vocale, vederii automate(d), prelucrării limbajului natural și cercetării învățării structurii limbajului (în care a fost folosită pentru a explica o varietate de fenomene legate de învățarea primei[45] și celei de-a doua limbi[46]).[47]
Backpropagation a fost sugerat pentru a explica componentele ERP(d) ale creierului uman, cum ar fi N400(d) și P600(d).[48]
În 2023, un algoritm de backpropagation a fost implementat pe un procesor fotonic de către o echipă de la Universitatea Stanford.[49]
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.