Recent, un coleg mi-a pus câteva întrebări de genul „de ce avem atât de multe funcții de activare?”, „de ce una funcționează mai bine decât cealaltă?”, „cum știm pe care să o folosim?”, „este o matematică dură?” și așa mai departe. Așa că m-am gândit, de ce să nu scriu un articol pe această temă pentru cei care sunt familiarizați cu rețelele neuronale doar la un nivel de bază și care, prin urmare, se întreabă despre funcțiile de activare și despre „de ce-cum-matematica lor!”.
NOTA: Acest articol presupune că aveți cunoștințe de bază despre un „neuron” artificial. V-aș recomanda să citiți elementele de bază ale rețelelor neuronale înainte de a citi acest articol, pentru o mai bună înțelegere.
Funcții de activare
Atunci ce face un neuron artificial? Pur și simplu, calculează o „sumă ponderată” a intrărilor sale, adaugă o polarizare și apoi decide dacă ar trebui să fie „concediat” sau nu ( da, corect, o funcție de activare face acest lucru, dar haideți să mergem pe firul curentului pentru un moment ).
Considerăm deci un neuron.
Acum, valoarea lui Y poate fi orice variind de la -inf la +inf. Neuronul nu cunoaște cu adevărat limitele valorii. Deci, cum decidem dacă neuronul ar trebui să tragă sau nu ( de ce acest model de tragere? Pentru că am învățat din biologie că așa funcționează creierul, iar creierul este o mărturie funcțională a unui sistem minunat și inteligent).
Am decis să adăugăm „funcții de activare” în acest scop. Pentru a verifica valoarea Y produsă de un neuron și a decide dacă conexiunile exterioare ar trebui să considere acest neuron ca fiind „tras” sau nu. Sau mai degrabă să spunem – „activat” sau nu.
Funcție de activare
Primul lucru care ne vine în minte este ce zici de o funcție de activare bazată pe prag? Dacă valoarea lui Y este peste o anumită valoare, să o declarăm activată. Dacă este mai mică decât pragul, atunci declarăm că nu este activată. Hmm grozav. Acest lucru ar putea funcționa!
Funcția de activare A = „activată” dacă Y > prag altfel nu
Alternativ, A = 1 dacă y> prag, 0 altfel
Bine, ceea ce tocmai am făcut este o „funcție în trepte”, vezi figura de mai jos.
Să iasă 1 ( activat) când valoarea > 0 (prag) și iese un 0 ( neactivat) în caz contrar.
Genial. Deci, aceasta face o funcție de activare pentru un neuron. Fără confuzii. Cu toate acestea, există totuși anumite dezavantaje cu acest lucru. Pentru a înțelege mai bine, gândiți-vă la următoarele.
Să presupunem că creați un clasificator binar. Ceva care ar trebui să spună un „da” sau „nu” ( activați sau nu activați ). O funcție Step ar putea face asta pentru dumneavoastră! Asta este exact ceea ce face, spune un 1 sau 0. Acum, gândiți-vă la cazul de utilizare în care ați dori ca mai mulți astfel de neuroni să fie conectați pentru a aduce mai multe clase. Clasa1, clasa2, clasa3 etc. Ce se va întâmpla dacă mai mult de 1 neuron este „activat”. Toți neuronii vor emite un 1 ( din funcția de pas). Acum ce ați decide? Care este clasa? Hmm greu, complicat.
Ați dori ca rețeaua să activeze doar 1 neuron, iar ceilalți să fie 0 ( numai atunci ați putea spune că a clasificat corect/identificat clasa ). Ah!!! Este mai greu de antrenat și de convergent în acest fel. Ar fi fost mai bine dacă activarea nu ar fi fost binară și ar fi spus în schimb „50% activat” sau „20% activat” și așa mai departe. Și apoi, dacă mai mult de 1 neuron se activează, ați putea găsi care neuron are „cea mai mare activare” și așa mai departe ( mai bine decât max, un softmax, dar să lăsăm asta deocamdată ).
În acest caz, de asemenea, dacă mai mult de 1 neuron spune „100% activat”, problema persistă în continuare.știu! Dar..din moment ce există valori intermediare de activare pentru ieșire, învățarea poate fi mai lină și mai ușoară ( mai puțin agitată ) și șansele ca mai mult de 1 neuron să fie 100% activat sunt mai mici în comparație cu funcția în trepte în timpul antrenamentului ( de asemenea, în funcție de ceea ce se antrenează și de date ).
Ok, deci vrem ceva care să ne dea valori intermediare ( analogice ) de activare în loc să spună „activat” sau nu ( binar ).
Primul lucru care ne vine în minte ar fi funcția liniară.
Funcție liniară
A = cx
O funcție de linie dreaptă în care activarea este proporțională cu intrarea ( care este suma ponderată de la neuron ).
În acest fel, oferă o gamă de activări, deci nu este o activare binară. Putem conecta cu siguranță câțiva neuroni împreună și dacă se activează mai mult de 1, am putea lua maximul ( sau softmax) și să decidem pe baza acestuia. Deci și acest lucru este în regulă. Atunci care este problema?
Dacă sunteți familiarizați cu coborârea gradientului pentru instruire, veți observa că pentru această funcție, derivata este o constantă.
A = cx, derivata în raport cu x este c. Asta înseamnă că gradientul nu are nicio relație cu X. Este un gradient constant și coborârea se va face pe gradient constant. În cazul în care există o eroare de predicție, modificările efectuate prin propagare inversă sunt constante și nu depind de modificarea intrării delta(x) !!!
Aceasta nu este atât de bună! ( nu întotdeauna, dar aveți răbdare cu mine ). Mai există și o altă problemă. Gândiți-vă la straturile conectate. Fiecare strat este activat de o funcție liniară. Această activare, la rândul ei, intră în nivelul următor ca intrare, iar al doilea strat calculează suma ponderată pe această intrare și, la rândul său, se declanșează pe baza unei alte funcții de activare liniare.
Nu contează câte straturi avem, dacă toate sunt de natură liniară, funcția de activare finală a ultimului strat nu este altceva decât o funcție liniară a intrării primului strat! Faceți o mică pauză și gândiți-vă la asta.
Aceasta înseamnă că aceste două straturi ( sau N straturi ) pot fi înlocuite cu un singur strat. Ah! Tocmai am pierdut capacitatea de suprapunere a straturilor în acest fel. Indiferent de modul în care suprapunem, întreaga rețea este în continuare echivalentă cu un singur strat cu activare liniară ( o combinație de funcții liniare într-o manieră liniară este tot o altă funcție liniară ).
Să mergem mai departe, da?
Funcția Sigmoid
Bine, aceasta pare netedă și „asemănătoare unei funcții în trepte”. Care sunt avantajele acestui lucru? Gândiți-vă puțin la asta. Mai întâi de toate, este de natură neliniară. Combinațiile acestei funcții sunt, de asemenea, neliniare! Minunat. Acum putem suprapune straturi. Cum rămâne cu activările non-binare? Da, și asta!. Aceasta va da o activare analogică, spre deosebire de funcția în trepte. Are și un gradient neted.
Și dacă observați, între valorile X de la -2 la 2, valorile Y sunt foarte abrupte. Ceea ce înseamnă că orice schimbare mică a valorilor lui X în acea regiune va determina ca valorile lui Y să se schimbe semnificativ. Ah, asta înseamnă că această funcție are tendința de a aduce valorile Y la ambele capete ale curbei.
Se pare că este bună pentru un clasificator având în vedere proprietatea sa? Da !!! Într-adevăr, așa este. Ea are tendința de a aduce activările la ambele părți ale curbei ( peste x = 2 și sub x = -2, de exemplu). Făcând distincții clare la predicție.
Un alt avantaj al acestei funcții de activare este că, spre deosebire de funcția liniară, ieșirea funcției de activare va fi întotdeauna în intervalul (0,1) în comparație cu (-inf, inf) a funcției liniare. Așadar, avem activările noastre delimitate într-un interval. Frumos, nu va arunca în aer activările atunci.
Este grozav. Funcțiile Sigmoid sunt una dintre cele mai utilizate funcții de activare în prezent. Atunci care sunt problemele cu aceasta?
Dacă observați, spre oricare dintre capetele funcției sigmoide, valorile Y tind să răspundă foarte puțin la schimbările în X. Ce înseamnă asta? Gradientul în acea regiune va fi mic. Aceasta dă naștere la o problemă de „gradienți care dispar”. Hmm. Deci, ce se întâmplă atunci când activările ajung aproape de partea „aproape orizontală” a curbei de o parte și de alta?
Gradientul este mic sau a dispărut ( nu poate face schimbări semnificative din cauza valorii extrem de mici ). Rețeaua refuză să învețe mai departe sau este drastic de lentă ( în funcție de cazul de utilizare și până când gradientul /calculul se lovește de limitele valorilor în virgulă mobilă ). Există modalități de a ocoli această problemă, iar sigmoidul este încă foarte popular în problemele de clasificare.
Funcția Tanh
O altă funcție de activare care este utilizată este funcția tanh.
Hm. Aceasta arată foarte asemănător cu sigmoidul. De fapt, este o funcție sigmoidă scalată!