Introducere în rețele neuronale – Teorie și aplicații

Încep astăzi o serie mai lungă de articole dintr-un domeniu destul de activ la ora actuală, cu aplicații foarte interesante într-o gamă largă de servicii unde este necesară o așa numită inteligență. Nu doresc să fac o descriere succintă a acestor noțiuni ci mai degrabă să surprind intuiția din spatele lor. Tocmai de aceea, dacă doriți să găsiți ceva strict la obiect nu cred că ar fi cel mai bun articol.

Domeniul rețelelor neuronale este unul foarte activ la această oră, lucru poate surprinzător, ținând cont că unele idei au peste 60 de ani. Chiar și așa, doar în ultimii ani, acest domeniu a devenit cu adevărat atractiv, asta în special datorită puterii crescute de calcul ce-i la îndemâna tuturor. E o un domeniu cu strânse legături în deep learning, big data și machine learning așa că unele aspecte tratate aici se regăsesc, într-o formă sau alta și în domeniile menționate.

Voi încerca să surprind căteva aspecte despre:

  1. Ce este un neuron?
  2. Ce este o rețea neuronală?
  3. Formulare matematică
  4. Tipuri de rețele
  5. Modalități de învățare
    1. Supervised
    2. Unsupervised

1. Ce este un neuron?

În biologie, neuronul este o celulă adaptată la recepționarea și transmiterea informației. Un număr suficient de mare de astfel de celule pot crea structuri de complexitate deosebită, exemplul pertinent fiind creierul nostru. De aici a pornit ideea rețelelor neuronale artificiale(ANN). Deși mult mai simple, ele oferă o serie de rezultate remarcabile ce sunt similare  cu procesele aparent naturale.

Warren McCulloch și Walter Pits au creat în anii  ’40 prima abstractizare al acestui mecanism complex. La început, ei au privit acest neuron ca pe-o funcție. Deși e o abordare foarte simplistă, măcar oferă o primă abstractizare matematică a neuronului. Astfel:

  1. Sinapsele pe care un neuron le făcea prin dendrite cu alți neuroni au devenit INTRĂRI;
  2. Corpul neuronului a devenit un SUMATOR + o FUNCȚIE DE ACTIVARE(fc. de TRANSFER)
  3. Axonul a devenit IEȘIREA
  4. Pentru a reprezenta caracteristici neliniare simple s-a introdus noțiunea de bias

Despre bias

În română, bias s-ar traduce ca parțialitate, care urmărește un anumit scop(tendențiozitate). Un exemplu e pareidolia – acea trăsătură a psihicului uman de a vedea fețe umane sau alte lucruri din mintea sa în obiecte(gen…fața unui monstruleț pe lună).

Mai concret și mai tehnic înseamnă să ai un răspuns de bază la o anumită intrare…lună -> monstruleț. Nu prea are treabă monstrulețul cu luna, deci nu este o legătură LINIARĂ între monstruleț și lună. Totuși, în capul tău există ceva. Și tocmai acest ceva, acest bias, e foarte bun și la funcții fiindcă el introduce o componentă neliniară în funcția ta. Un exemplu simplu ar fi ca la intrările 1, 2, 3, 4 funcția noastră să returneze doar valoarea β. O funcție simplă ar fi f(0 *x + b)  =  β.

NeuronNeuron artificial

 

2. Ce este o rețea neuronală?

  • Analogie cu creierul uman – mai mulți neuroni interconectați formează o rețea neuronală.
  • Este compusă dintr-un număr mare de elemente interconectate (modelul matematic al neuronului) care lucrează împreună pentru rezolvarea unei anumite probleme
  • Poate fi îmbunătățită prin învățare. Poate învăța funcții noi pe baza unor informații primite.

Tocmai aceste caracteristici care derivă și de la o structură simplă ca cea a lui McCulloch permite o serie de aplicații foarte variate precum:

  • Pot fi antrenate pentru recunoașterea scrisului de mână
  • Google folosește un algoritm bazat pe rețele neuronale pentru returnarea unor imagini pe baza unor cuvinte date ca intrare la căutare
  • Microsoft a dezvoltat un sistem de rețele neuronale care ajută la convertitrea limbii engleze în chineză
  • Largă aplicabilitate în medicină, afaceri, matematică, știință, business etc
  • O rețea neuronală poate fi învățată pe baza unui volum mare de date și îmbunătățită iterativ pentru realizarea altor funcții. (Folosirea algoritmilor bazați pe rețele neuronale în domeniul BigData)

 

3. Formalismul matematic

Înainte de a prezenta o aplicație a acestei rețele cred că e mai bine să punem în lumină aparatul matematic necesar. Voi încerca să nu intru în detalii și voi pune accent pe intuiție în detrimentul specificității matematice.

3.1 Tipuri de rețele

  1. Neuronul cu o singură intrare

    Neuron cu o singură intrare

  2. Neuronul cu intrări multiple. Aici este un vector, iar W este o matrice cu un singur rând.

    Neuron cu intrări multiple

  3. Rețea cu un singur nivel de neuroni. Aici p este un vector, iar este o matrice cu S linii și R coloane.

    Rețea neuronală cu un singur strat

  4. Rețea cu mai multe nivele de neuroniRețele neuronale cu straturi multiple

eq

Observăm că deși poate părea complicat, formula finală e doar un efect combinat al rețelelor cu un singur nivel extins la mai multe.

 

3.2. Funcții de activare

Plecând de la ideea că un neuron poate fi reprezentat de către o funcție, atunci o rețea neuronală va deveni o mulțime de funcții interconectate, iar continuarea logică este să alegem ce tipuri de funcții vrem să folosim pentru a abstractiza neuronul.

Aceste funcții vor reprezenta filtrul final prin care va trece informația. În același timp ar fi de dorit găsirea unor funcții “frumoase”(derivabile) și care să ofere rezultate predictibile, preferabil normalizate, pentru a putea folosi metodele bogate din teoria clasificării și a probabilităților.

Una din cele mai populare funcții de activare este sigmoida. Pentru a înțelege intuiția din spatele acestei afirmații vom analiza o rețea neuronală ce folosește o funcție de activare diferită, precum funcția lui Heaveside(precum în cazul perceptronilor):

Bucata gri ce începe aici poate fi omisă și este mai mult țintită spre pasionații de mate.

Să facem o paranteză și să ne gândim la populații…așa s-a gândit și un tip pe nume Pierre François Verhulst care a vrut să găsească modelul matematic la aceste creșteri. La ce s-a gândit e chiar interesant…

Să zicem c-avem o populație cu K membri. Copiii care apar în această populație sigur depind de numărul de indivizi din ea(logic nu-i așa). Cu cât K e mai mare…mai mulți copii și vice versa. Dar cine sunt copiii? Dacă presupunem că nimeni nu moare atunci copiii reprezintă chiar variația populației K. Deci:

\text{Nr.} \; \text{de} \; \text{copii} \; \propto \; \text{Populatia} \; \text{totala} \; \text{K}

\dfrac{dK}{dt} = \alpha \text{K} \quad \Rightarrow \quad \dot{K} - \alpha \mathrm{K} = 0 \quad \text{Inmultind} \; \text{cu} \; \mathrm{e}^{-\alpha\mathrm{K}} \quad \Rightarrow \quad (\mathrm{e}^{-\alpha\mathrm{K}}K)^{'} = 0

\text{Cu} \; \text{solutia} \quad \mathrm{K} = \mathrm{C}\mathrm{e}^{\alpha\mathrm{K}}

Deși destul de bun, acest model nu prea reflectă realitatea. Populația în acest caz ar crește imediat spre valori foarte mari, iar asta nu prea pare să fie în concordanță cu realitățile. Să schimbăm puțin problema și să ne gândim altfel…să zicem că populația noastră va fi P, iar populația maximă ce poate fi suportată de mediu este K(ca și cum am zice că pe Pământ nu pot să trăiască mai mult de 10 miliarde de oameni și basta). Pare o idee simplă și chiar este…da cum rămâne cu variația populației și implicit cu copiii? Păi, intuitiv, când populația e mică…numărul de copii contează foarte mult și ne așteptam ca populația să crească semnificativ(o rata mare de creștere). Pe măsură ce ne-apropiem de limita mediului…populația ar trebui să nu mai poată crește, adică rata de creștere a populației să scadă, iar populația să rămână la valoarea maximă(10 miliarde în cazul nostru). Matematic:

\text{Variatia} \; \text{populatiei} \; \propto \; \text{Populatia} \; \text{P} \quad \text{(similar} \; \text{cu} \; \text{cazul} \; \text{anterior)}

\text{Variatia} \; \text{populatiei} \; \propto \; \text{K-P}\quad\Rightarrow

\dfrac{dP}{dt} = \tau \mathrm{P} (\mathrm{K} - \mathrm{P}) \quad \tau \mathrm{ - } \; \text{fiind} \; \text{o} \; \text{constanta} \; \text{oarecare} \quad \Rightarrow

-\dfrac{dP}{dt} + \tau\mathrm{P}\mathrm{K} - \tau \mathrm{P}^{2} = 0 \quad\text{Ecuatie}\;\text{de}\;\text{tip}\;\text{Bernoulli} \Leftrightarrow \text{Impartim}\;\text{totul}\;\text{cu}\;\text{P}^{2}

-\dfrac{dP}{P^{2}dt} + \tau\mathrm{K}\dfrac{1}{P} - \tau = 0 \quad (1)

\text{Notam}\;\text{cu}\quad \mathrm{z}(t) = \dfrac{1}{P(t)} \quad \Rightarrow \quad \mathrm{z}'(t) = -\dfrac{P'(t)}{P^{2}}\quad\text{Inlocuind}\;\text{in}\;{(1)}\;\Rightarrow

\mathrm{z}'(t) +\tau\mathrm{K}\mathrm{z} - \tau = 0 \quad (2)\quad \text{Inmultind} \; \text{cu} \; \mathrm{e}^{\tau\mathrm{Kt}} \quad \Rightarrow \quad (\mathrm{e}^{\tau\mathrm{Kt}}z )' = \tau\mathrm{e}^{\tau\mathrm{Kt}}

\text{Integrand}\;\text{obtinem}\quad\mathrm{e}^{\tau\mathrm{Kt}}z + \mathrm{C} = \dfrac{\mathrm{e}^{\tau\mathrm{Kt}}}{\mathrm{K}} \quad \Rightarrow \quad \mathrm{z} = \dfrac{1}{K} - \mathrm{C}\mathrm{e}^{-\tau\mathrm{Kt}}

\text{In}\;\text{final} \; \mathrm{P(t)} = \dfrac{1}{\dfrac{1}{K} - \mathrm{C}\mathrm{e}^{-\tau\mathrm{Kt}}} \quad \text{deci}\;\text{o}\;\text{functie}\;{de}\;\text{forma}\quad\mathrm{f(x)} = \dfrac{1}{1+e^{-x}}

 

Astfel de funcții(se mai numesc funcții logistice) îs tare bune și pentru rețele neuronale fiindcă mărginesc rezultatele – le pun într-o gamă cât de cât controlabilă de valori. Mai sunt și alte funcții, le vedeți în tabelul de mai jos.

E bine de menționat că prima funcție, sigmoida este una din cele mai importante funcții de activare, mai ales când folosim perceptroni. Oare de ce, ne-am putea întreba…ca să înțelegem să ne uităm la funcția 3 din tabel, funcția lui Heaveside. E mai simplă și spune ceva de genul:

\text{iesirea} = \begin{cases} 0, \; \text{daca} \; wx+b \leqslant 0 \\ 1, \; \text{daca} \; wx+b>0\end{cases}

Exemplul constă într-o rețea neuronală capabilă să recunoască cifre. Să presupunem că folosim un MLP, iar la un moment dat ne vom dori să recunoaștem cifra 6. Rețeaua cu perceptroni simpli va învăța modificând ponderile până când răspunsul rețelei e cel așteptat – 6. Problema va fi cu celelalte numere, rețeaua probabil fiind destabilizată. Astfel de rețele MLP sunt rigide, tocmai datorită modului de funcționare a perceptronului. Nefiind decât 2 stări distincte, trecerea de la 0 la 1 s-a făcut la o schimbare probabil mică a ponderilor. Din acest motiv se folosesc neuronii sigmozi, ce au sigmoida ca funcție de activare. Ea poate acoperi întreg intervalul [0,1], iar astfel se asigură o relație reciprocă între ponderi și intrări – variații mici la ponderi vor induce variații mici la ieșiri.
Tabel cu funcții de activare uzuale

 

4. Tipuri de rețele

Deși încă nu ne putem forma o intuiție cu privire la tipul rețelelor neuronale este bine să cunoaștem terminologia, fiindcă sunt lucruri ce sunt amintite des. De când am început să studiez mai bine domeniul am observat că lumea le cam împarte după:

  • Tipul conexiunilor făcute de neuroni
    • Monolayer – aici avem de obicei doar intrări și ieșiri ce formează un strat
    • Multilayer – avem Input, Hidden și Output Layer, precum am putut vedea la modelul matematic, secțiunea 3.1., punctul 4.
  • Direcția semnalului
    • Rețele feedforward – care sunt rețele multilayer unde informația “curge” într-o singură direcție(în teoria sistemelor, analogia ar fi sisteme fără reacție).
    • Rețele feedback – unde există reacție, adică legături dintr-un strat superior la altele anterioare.

 

5. Modalități de învățare a rețelelor neuronale

Învăţarea automată, unul din sub-domeniile de bază ale Inteligenţei Artificiale, se preocupă cu dezvoltarea de algoritmi şi metode ce permit unui sistem informatic să înveţe date, reguli, chiar algoritmi.

Privite în ansamblu, mecanismele de învățare a rețelelor neuronale se pot împărți în două clase:

  • Supervised – Fiindcă vorbim de un tip de învăţare inductivă ce pleacă de la un set de exemple de instanţe ale problemei şi formează o funcţie de evaluare (şablon) care să permită clasificarea (rezolvarea) unor instanţe noi. Învăţarea este supervizată în sensul că setul de exemple este dat împreună cu clasificarea lor corectă.
  • Unsupervised – În acest caz setul de antrenare conține doar date de intrare
    • Exemplu: gruparea datelor în categorii în funcție de similaritatea dintre ele
    • Se bazează pe proprietățile statistice ale datelor
    • Nu se bazează pe conceptul de funcție de eroare ci pe cel de calitate a modelului extras din date, care trebuie maximizată prin procesul de antrenare

5.1. Învățarea competitivă

Învăţarea competitivă se bazează pe un proces concurenţial între neuronii din stratul de ieşire, existând un neuron “câştigător”, în detrimentul celorlalţi neuroni. Dacă în ceilalţi algoritmi de învăţare prezentaţi până acuma, toţi neuronii din stratul de ieşire puteau genera valori de ieşire mai mari sau mai mici, în algoritmul de învăţare competitivă, doar neuronul de ieşire “câştigător” este activ (generează o valoare), ceilalţi neuroni de ieşire devenind inactivi (generează valoarea zero).

Modul de actualizare a ponderilor in cazul invatarii competitive

Date si ponderi nestructurateDate structurate ca urmare a algoritmului de invatare competitiva

5.2. Rețele Kohonen (hărți cu auto-organizare)

Peste tot o să vedem noțiunea de SOM(Self Organizing Map) – o denumire pompoasă, pentru o serie de acțiuni pe care oamenii le fac toată ziua fără să se gândească.

 

Joc – ghicește culoarea bilei fără s-o vezi

Să ne imaginăm c-avem o masă unde sunt biluțe de diferite culori, în așa fel încât am putea distinge unde se află cele mai multe bile de-o culoare. Pare super simplu, dar să presupunem că suntem un calculator – deci nu avem ochi, și putem face doar calcule. Ce-am vrea să facem? Am vrea să ne învățăm pentru a putea spune cu mare exactitate de ce culoare este o bilă într-o anumită zonă a mesei FĂRĂ a o vedea…

Dacă am avea ochii închisi ce-am face? Inițial am zice la noroc o culoare. Dacă e greșită am zice o altă culoare…și tot așa până ce-am nimeri culoarea adevărată. Următoarea bilă, dacă e chiar lângă cea pe care i-am determinat culoarea(numa pe ghicite (-:) va fi probabil de aceeasi culoare. Repetăm procesul până când dăm de altă culoare. Atunci știm că am ajuns la o zonă de graniță și culoarea s-a schimbat. Repetăm asta de mii și mii de ori și descoperim fiecare cluster cu bile de o anumită culoare. Exact așa funcționează și o hartă Kohonen și de aceea ele sunt folosite în probleme de categorizare(clustering).

Pentru un calculator asta se rezumă la modificarea ponderilor(care or fi ele, nu ne interesează cum este creată rețeaua, vrem doar să ne facem o idee asupra terminologiei de rețea cu auto organizare) asociate acestei rețele neuronale, ce are ca intrări coordonate pe planul mesei și ca ieșire ce culoare ar fi pe-acolo.

În concluzie, ele sunt folosite cu precădere la gruparea datelor. Rețelele Kohonen sunt destinate în principal clasificării nesupervizate a datelor vectoriale. Ele asigură însă un plus față de celelalte rețele competitive și anume conservarea relațiilor de vecinătate din domeniul datelor de intrare. Aceasta înseamnă că datele de intrare similare vor fi fie în aceeași clasă fie în clase diferite dar care sunt ”reprezentate” de către unități funcționale vecine.

 

Harti Kohonen - unsupervised learning

 

6. Modalități de îmbunătățire a învățării

6.1. Entropia încrucișată

Entropia încrucișată apare în contextul învățării rețelelor neuronale. Atunci când vorbim de învățare supravegheată, învățarea se rezumă la modificarea ponderilor și bias-urilor atașate neuronilor pentru ca întreaga rețea să mapeze rezultatele dorite. Entropia încrucișată s-a dezvoltat pornindu-se de la optimizarea funcției de cost prin metoda gradientului, atunci când s-au văzut primele limitări a acesteia.

\dfrac{\partial C}{\partial w} = (a-y)\sigma'(z)x

\dfrac{\partial C}{\partial b} = (a-y)\sigma'(z)

Unde \sigma este sigmoida, iar z este intrarea ponderata, \sum_{k} w^L_{kj} a^{L-1}_k + b^L_j

Din ecuațiile de mai sus, se poate intui problema care a dat naștere entropiei încrucișate. Funcția σ(z) este sigmoida, iar această funcție variază foarte puțin în afara intervalului [-1,1]. Acest lucru implică că și derivata va tinde spre 0 când eroarea este mare, făcând învățarea mult mai grea.

Pentru a rezolva această problemă, va trebui introdusă o funcție de cost diferită, care să nu țină cont de comportamentul sigmoidei, pentru a facilita învățarea rapidă, chiar și atunci când variația sigmoidei este foarte mică. Intuitiv, ne-am putea întreba dacă există o astfel de funcție. În acest caz, am putea transforma ecuațiile de mai sus în:

\dfrac{\partial C}{\partial w_j} = x(a_j-y_j) \qquad (1)

\dfrac{\partial C}{\partial b} = (a-y) \qquad (2)

Folosind regula produsului se obține

\dfrac{\partial C}{\partial b} = \dfrac{\partial C}{\partial a} \dfrac{\partial a}{\partial b} = \dfrac{\partial C}{\partial a} \sigma'(z) \qquad (2)

Apoi, ne folosim de proprietatea sigmoidei \sigma'(z) = \sigma(z)(1-\sigma(z)) = a(1-a)

Introducând identitatea de mai sus în (3) obținem:

\dfrac{\partial C}{\partial b} = \dfrac{\partial C}{\partial a} a(1-a)

Folosindu-ne de ecuația (2) obținem

\dfrac{\partial C}{\partial a} = \dfrac{a-y}{a(1-a)}

Integrăm pe ambele părți cu a și obținem forma finală a costului, pe un singur neuron

C=-[ylna + (1-y)ln(1-a)] + Const

Pentru a obține forma finală a funcției de cost, va trebui să luăm media pe toate exemplele de training:

C=-\dfrac{1}{n}\sum_x[ylna + (1-y)ln(1-a)] + Const

*** Articolul este în curs de completare – voi adaugă informații suplimentare în zilele următoare.

Pentru sugestii, idei sau alte lucruri care considerați că merită menționate nu ezitați să mă ajutați printr-un comentariu.

Ștefănescu Marian

Pasionat de științe exacte, drumeții.

2 Comments

Lasa un comentariu