Problema XOR în rețelele neuronale.
Introducere
Aceasta este prima dintr-o serie de postări care explorează implementări de rețele neuronale artificiale (RNA). Scopul articolului este de a ajuta cititorul să dobândească o intuiție a conceptelor de bază înainte de a trece la implementările algoritmice care vor urma.
Nu se presupun cunoștințe prealabile, deși, în interesul conciziei, nu toată terminologia este explicată în articol. În schimb, sunt furnizate hyperlink-uri către Wikipedia și alte surse în cazul în care ar putea fi necesară o lectură suplimentară.
Acesta este un subiect mare. RNA-urile au o mare varietate de aplicații și pot fi utilizate pentru învățare supravegheată, nesupravegheată, semisupravegheată și de întărire. Asta înainte de a intra în arhitecturi specifice problemelor din cadrul acestor categorii. Dar trebuie să începem de undeva, așa că, pentru a restrânge domeniul de aplicare, vom începe cu aplicarea RNA la o problemă simplă.
Problema XOr
Problema XOr, sau „exclusiv sau”, este o problemă clasică în cercetarea RNA. Este vorba de problema utilizării unei rețele neuronale pentru a prezice ieșirile porților logice XOr, având în vedere două intrări binare. O funcție XOr ar trebui să returneze o valoare adevărată dacă cele două intrări nu sunt egale și o valoare falsă dacă sunt egale. Toate intrările posibile și ieșirile prezise sunt prezentate în figura 1.
XOr este o problemă de clasificare și una pentru care ieșirile așteptate sunt cunoscute dinainte. Prin urmare, este adecvat să se utilizeze o abordare de învățare supravegheată.
La suprafață, XOr pare a fi o problemă foarte simplă, cu toate acestea, Minksy și Papert (1969) au arătat că aceasta a fost o mare problemă pentru arhitecturile rețelelor neuronale din anii 1960, cunoscute sub numele de perceptroni.
Perceptroni
Ca toate RNA, perceptronul este compus dintr-o rețea de unități, care sunt analoage cu neuronii biologici. O unitate poate primi o intrare de la alte unități. În acest sens, ia suma tuturor valorilor primite și decide dacă va transmite un semnal mai departe către alte unități la care este conectată. Acest lucru se numește activare. Funcția de activare utilizează un mijloc sau altul pentru a reduce suma valorilor de intrare la 1 sau 0 (sau la o valoare foarte apropiată de 1 sau 0) pentru a reprezenta activarea sau lipsa acesteia. O altă formă de unitate, cunoscută sub numele de unitate de polarizare, se activează întotdeauna, trimițând, de obicei, un 1 codificat la toate unitățile la care este conectată.
Perceptronii includ un singur strat de unități de intrare – inclusiv o unitate de polarizare – și o singură unitate de ieșire (a se vedea figura 2). Aici o unitate de polarizare este reprezentată de un cerc punctat, în timp ce celelalte unități sunt reprezentate de cercuri albastre. Există două unități de intrare fără polarizare care reprezintă cele două valori binare de intrare pentru XOr. Poate fi inclus orice număr de unități de intrare.
Perceptronul este un tip de rețea de tip feed-forward, ceea ce înseamnă că procesul de generare a unei ieșiri – cunoscut sub numele de propagare înainte – curge într-o singură direcție de la stratul de intrare la stratul de ieșire. Nu există conexiuni între unitățile din stratul de intrare. În schimb, toate unitățile din stratul de intrare sunt conectate direct la unitatea de ieșire.
O explicație simplificată a procesului de propagare înainte este că valorile de intrare X1 și X2, împreună cu valoarea de polarizare de 1, sunt înmulțite cu ponderile lor respective W0..W2 și analizate în unitatea de ieșire. Unitatea de ieșire preia suma acestor valori și utilizează o funcție de activare – de obicei, funcția în trepte Heavside – pentru a converti valoarea rezultată în 0 sau 1, clasificând astfel valorile de intrare ca fiind 0 sau 1.
Setarea variabilelor de pondere este cea care oferă autorului rețelei controlul asupra procesului de conversie a valorilor de intrare într-o valoare de ieșire. Ponderile sunt cele care determină unde este trasată linia de clasificare, linia care separă punctele de date în grupuri de clasificare. Dacă tuturor punctelor de date de pe o parte a liniei de clasificare li se atribuie clasa 0, toate celelalte sunt clasificate ca fiind 1.
O limitare a acestei arhitecturi este că este capabilă să separe punctele de date doar cu o singură linie. Acest lucru este nefericit deoarece intrările XOr nu sunt separabile liniar. Acest lucru este vizibil în special dacă se trasează valorile intrărilor XOr pe un grafic. După cum se arată în figura 3, nu există nicio modalitate de a separa predicțiile 1 și 0 cu o singură linie de clasificare.
Perceptroni multistrat
Soluția la această problemă este de a extinde dincolo de arhitectura cu un singur strat prin adăugarea unui strat suplimentar de unități fără acces direct la lumea exterioară, cunoscut sub numele de strat ascuns. Acest tip de arhitectură – prezentată în figura 4 – este o altă rețea de tip feed-forward cunoscută sub numele de perceptron multistrat (MLP).
Este demn de remarcat faptul că o MLP poate avea orice număr de unități în straturile de intrare, ascuns și de ieșire. De asemenea, poate exista orice număr de straturi ascunse. Arhitectura utilizată aici este concepută special pentru problema XOr.
Similar cu perceptronul clasic, propagarea înainte începe cu valorile de intrare și unitatea de polarizare din stratul de intrare care sunt înmulțite cu ponderile lor respective, însă, în acest caz, există o pondere pentru fiecare combinație de intrare (inclusiv unitatea de polarizare a stratului de intrare) și unitate ascunsă (cu excepția unității de polarizare a stratului ascuns). Produsele dintre valorile din stratul de intrare și ponderile lor respective sunt analizate ca intrare pentru unitățile fără polarizare din stratul ascuns. Fiecare unitate ascunsă care nu este influențată invocă o funcție de activare – de obicei, funcția sigmoidă clasică în cazul problemei XOr – pentru a reduce suma valorilor de intrare la o valoare cuprinsă între 0 și 1 (de obicei, o valoare foarte apropiată de 0 sau 1). Ieșirile fiecărei unități din stratul ascuns, inclusiv unitatea de polarizare, sunt apoi înmulțite cu un alt set de ponderi respective și analizate la o unitate de ieșire. Unitatea de ieșire analizează, de asemenea, suma valorilor sale de intrare prin intermediul unei funcții de activare – din nou, funcția sigmoidă este adecvată în acest caz – pentru a returna o valoare de ieșire care se încadrează între 0 și 1. Aceasta este ieșirea prezisă.
Această arhitectură, deși mai complexă decât cea a rețelei perceptron clasice, este capabilă să realizeze o separare neliniară. Astfel, cu un set corect de valori ale ponderilor, aceasta poate asigura separarea necesară pentru a clasifica cu precizie intrările XOr.
Backpropagation
Elefantul din cameră, desigur, este modul în care se poate ajunge la un set de valori ale ponderilor care să asigure că rețeaua produce ieșirea așteptată. În practică, încercarea de a găsi manual un set acceptabil de ponderi pentru o rețea MLP ar fi o sarcină incredibil de laborioasă. De fapt, aceasta este NP-completă (Blum și Rivest, 1992). Cu toate acestea, din fericire, este posibilă învățarea automată a unui set bun de valori ale ponderilor printr-un proces cunoscut sub numele de backpropagation. Rumelhart et al. (1985) au demonstrat pentru prima dată că acest proces funcționează bine pentru problema XOr.
Agoritmul de retropropagare începe prin compararea valorii reale ieșite prin procesul de propagare înainte cu valoarea așteptată și apoi se deplasează înapoi prin rețea, ajustând ușor fiecare dintre ponderi într-o direcție care reduce dimensiunea erorii cu un grad mic. Atât propagarea înainte, cât și cea înapoi sunt reluate de mii de ori pentru fiecare combinație de intrări până când rețeaua poate prezice cu exactitate ieșirea așteptată a intrărilor posibile folosind propagarea înainte.
Pentru problema xOr, 100% din exemplele de date posibile sunt disponibile pentru a fi utilizate în procesul de instruire. Prin urmare, ne putem aștepta ca rețeaua antrenată să fie 100% precisă în predicțiile sale și nu este nevoie să fim preocupați de probleme precum părtinirea și varianța în modelul rezultat.
Concluzie
În această postare, a fost explorată problema clasică RNA XOr. Problema în sine a fost descrisă în detaliu, împreună cu faptul că intrările pentru XOr nu sunt separabile liniar în categoriile lor corecte de clasificare. O soluție neliniară – care implică o arhitectură MLP – a fost explorată la un nivel înalt, împreună cu algoritmul de propagare înainte utilizat pentru a genera o valoare de ieșire din rețea și algoritmul de propagare înapoi, care este utilizat pentru a antrena rețeaua.
Postul următor din această serie va prezenta o implementare Java a arhitecturii MLP descrisă aici, inclusiv toate componentele necesare pentru a antrena rețeaua să acționeze ca o poartă logică XOr.
Blum, A. Rivest, R. L. (1992). Antrenarea unei rețele neuronale cu 3 noduri este NP-completă. Neural Networks, 5(1), 117-127.
.