Retele Neuronale In Scilab

CAPITOLUL 1

REȚELE NEURONALE

1. INTRODUCERE

Informatizarea este una dintre cele mai importante caracteristici ale societății moderne din secolul XXI. În prezent, implementarea tehnologiilor informaționale a devenit foarte accesibilă. Astfel că, prin utilizarea calculatoarelor și a soft-urilor se pot realiza multiple astfel de tehnologii în domeniul inteligenței artificiale.

O preocupare de interes mondial și de actualitate este inteligența artificială. Aceasta se ocupă de studiul și crearea sistemelor de calcul și a programelor care prezintă o formă de inteligență: sisteme care învață noi concepte, care pot raționa și deduce concepte utile într-un domeniu al lumii înconjurătoare, sisteme care pot înțelege limbajul natural sau percepe și înțelege o imagine, într-un cuvânt sisteme care necesită capacități inteligente specifice omului.

Un domeniu a inteligenței artificiale îl constituie teoria rețelelor neuronale artificiale, aceasta ne demonstreazã abilitatea neuronilor de a realiza cele mai bune aproximații ale unor funcții, de a recunoaște forme, și multe altele.

Rețelele neuronale artificiale reprezintã ramură a inteligenței artificiale care se ocupă cu numeroase ,,unelte” puternice de modelare pentru diferite clase de probleme din diverse domenii precum: bio-informaticã, medicinã, pentru depistarea precoce și clasificarea genelor specifice anumitor afecțiuni ale omului, cum ar fi de exemplu celulele canceroase, robotică, procesare de imagini, etc. De aceea, cercetãrile s-au axat pe lãrgirea spectrului posibilitãților de programare ale unui calculator convențional, folosindu-se de cunoștințele neurobiologice.

Creierul uman este un sistem de calcul foarte complex. Capacitatea sa de a gândi, de a memora sau de a rezolva probleme dintre cele mai complexe au stârnit curiozitatea unui număr mare de cercetători, în încercarea modelării modul său de operare.

Astfel cercetătorii au creat un sistem de calcul care să conțină trăsăturile fundamentale ale creierului uman, care poate fi numit calcul neuronal. Se poate sesiza așadar că creierul uman este superior oricărui calculator electronic, aproape în orice domeniu.

Un exemplu elocvent ar fi să ne gândim la capacitatea unui copil de 1 an de zile de a recunoaște obiecte sau forme și capacitatea de a recunoște persoanele din jur, decât să căutăm cel mai avansat sistem de inteligență artificială, care rulează pe cel mai puternic calculator. Doar activitățile bazate pe operații algebrice rulate pe un sistem de calcul electronic (un computer) depășește performanțele creierului uman.

Analizând trăsăturile de mai sus ale creierului uman putem observa o motivație reală pentru studiul calculului neuronal.

Cercetările din domeniul inteligenței artificiale, au vizat dezvoltarea conceptului de calcul neuronal. Acesta încearcă să dezvolte sisteme cultivate pentru scopuri generale folosind o cantitate mică de cunoștințe inițiale [1]. Aceste sisteme se mai numesc rețele neuronale sau sisteme conexioniste.

În literatura de specialitate, s-au descoperit numeroase denumiri alternative de sisteme cum ar fi: sisteme cu auto-organizare, sisteme de prelucrare paralelã distribuitã, modele neurodinamice, calculatoare neuronale, etc.

Acestă lucrare este structurată pe trei capitole mari și mai multe subcapitole (subsecțiuni), pe tema ,, REȚELE NEURONALE ÎN SCILAB”. Această temă a fost aleasă pentru a prezenta în primul rând un nou limbaj de programare, apărut pe piață recent, numit Scilab și noțiuni generale introductive ale rețelelor neuronale artificiale, precum și câteva aplicații a acestora.

Capitolul întâi, include o prezentare teoretică, generală, a Rețelelor Neuronale Artificiale. Se începe cu un scurt istoric a apariției acestei ramuri a inteligenței artificiale, etapă cu etapă, după care în următoarea subsecțiune a capitolului, se prezintă definiția rețelei neuronale și caracteristicile acesteia, iar în următoarele subsecțiuni ale capitolului 1, se ilustrează: modelul neuronului biologic, modelul neuronului artificial, structura unei rețele neuronale, aplicabilitatea rețelelor neuronale artificiale precum și clasele de probleme ce se pot rezolva cu ajutorul acestor rețele.

Capitolul al doilea, cuprinde o trecere în revistă a limbajului de programare SCILAB. Astfel că, în prima parte a capitolului se face o prezentare succintă generală a SCILAB-ului, după care în următoarele secțiuni se descrie modul de lucru a acestui limbaj de programare, prin explicarea pas cu pas a comenzilor principale, pentru a se putea rula aplicațiile cu ușurință.

Următorul capitol, capitolul 3, se ocupă cu realizarea unor aplicații având la bază rețele neuronale artificiale. Astfel că, vom avea aplicații cu perceptroni, regresii liniare și neliniare, și cu o rețea neuronală particulară numită Rețea Kohonen.

Această temă este utilă studenților pasionați de Inteligență Artificială de la specializãrile precum: Informaticã, Informaticã Economicã, Calculatoare și, în general tuturor celor care se simt atrași de informatică și doresc să descopere noi lucruri.

2. SCURT ISTORIC

Rețelele neuronale artificiale au cunoscut perioade în care activitatea de cercetare a fost extrem de intensă și perioade în care acest domeniu de cercetare a fost declarat complet „mort”, pentru ca mai târziu să revină în centrul atenției, atât în rândul cercetătorilor, cât și a publicului larg prin multitudinea de aplicații practice pe care le au sau le pot avea [10].

La sfârșitul secolului al XIX-lea și începutul secolului al XX-lea, Hermann Helmholz, Ernst Mach și Ivan Pavlov au enunțat teorii asupra procesului de învățare, asupra condiționării, etc. însă nu se putea vorbi încă de un început [10].

Adevăratul punct de pornire se găsește la începutul anilor 1940 când Warren McCulloch și Walter Pitts au formulat primul model formal al neuronului, punând accent pe capacitatea de calcul a acestuia și posibilitatea de implementare cu ajutorul circuitelor electronice. Tot în anii 1940, Hebb, a enunțat principiul adaptării permeabilității sinaptice conform căruia de fiecare dată când o conexiune sinaptică este folosită, permeabilitatea ei crește. Acest principiu stă la baza procesului de învățare prin modificarea ponderilor sinaptice [10].

În  1950 apare prima aplicație, Frank Rosenblatt introducând aplicația practică numită perceptron, utilizată în problema recunoașterii caracterelor. Tot în anii 1950 Bernard Windrow și Ted Hoff au dezvoltat algoritmi de învățare bazați pe minimizarea erorii pe setul de antrenare pentru rețele cu un nivel de unități funcționale (ADALINE – ADaptive LINear Element și MADALINE – Multiple ADaptive LINear Element) [10].

În anul 1969 Marvin Minsky și Seymor Papert publică cartea "Perceptrons" care pune în evidență limitările la care sunt supuse rețelele neurale cu un singur nivel de unități funcționale. Publicarea acestui material, împreună cu lipsa unor echipamente de calcul digital suficient de puternice, face ca o mare parte din companiile care investeau în cercetările din acest domeniu să se reorienteze, iar o mare parte dintre cercetători își abandonează studiul.

Anul 1980 aduce, pe lângă noi descoperiri în domeniul rețelelor neuronale, și calculatoare digitale mai puternice capabile să ajute cercetătorii în demersurile lor. Astfel că la începutul anilor 1980 [10], John Hopfield marchează începutul unei noi perioade de interes major în acest domeniu, caracterizată prin extinderea domeniilor de aplicabilitate și volumul mare de implementări soft și hard folosite în aplicațiile practice. Kohonen, tot în anii 1980, dezvoltă rețele cu auto-organizare care modelează procese neuronale, care pot fi folosite și pentru prelucrarea datelor[1].

În 1983 Carpenter și Grosberg dezvoltă ”teoria rezonanței adaptive” ce conduce la algoritmi de învățare nesupervizată bazată pe procese de competiție.

În 1985 este descris, algoritmul de învățare al rețelelor cu mai multe nivele bazat pe ideea minimizării unei funcții de eroare calculată pornind de la un set de antrenare (ideea a fost formulată anterior de Werbos însă a devenit cunoscută abia după prezentarea într-o manieraă explicită a lui Rumelhart și Parker). Algoritmul este cunoscut sub denumirea de ”backpropagation” provenită de la faptul că pentru determinarea ajustărilor ce vor fi aplicate ponderilor se propagă prin rețea în sens invers (de la nivelul de ieșire către cel de intrare) un semnal de eroare[10].

3. DEFINIȚIE ȘI CARACTERISTICI

Rețelele neuronale sunt o ramură din știința inteligenței artificiale care se ocupă cu sisteme de procesare a informației, compuse în unități simple de procesare, interconectate între ele și care operează în paralel și urmărind să interacționeze cu mediul înconjurător într-un mod asemănător creierelor biologice și prezintă capacitatea de a învăța.

O definiție genericã a rețelelor neuronale artificiale este urmãtoarea [Moise Adrian, 2005]:

Definiție: O rețea neuronalã artificialã este o structurã (rețea) compusã din mai multe unitãți de calcul interconectate (neuroni artificiali interconectați).

Originea acestor rețele a luat ființă prin studierea rețelelor bioelectrice din creier care sunt formate din neuroni și sinapsele acestora. Principala trăsătură fiind capacitatea de a învăța pe bază de exemple, urmărind din experiențele anterioare a-și îmbunătăți performanțele.

Creierul uman, într-o comparație cu un calculator electronic, este un sistem de procesare a informațiilor caracterizat prin complexitate, neliniaritate și paralelism.

Creierul uman are puterea de a-și organiza activitatea neuronală în așa fel încât să realizeze activități complexe ca de exemplu: recunoașterea formelor, percepție și multe alte capacități. Așadar putem spune că este mult mai rapid și mai performant decât cel mai puternic super – calculator construit vreodată de om.

La fel ca în natura, funcția rețelei este determinată de legăturile dintre elemente. Ele sunt compuse din neuroni artificiali. Aceștia sunt parte a inteligenței artificiale și își au originea în biologie.

Nu există pentru rețeaua neuronală artificială o definiție generală dar majoritatea cercetătorilor sunt de acord cu definirea rețelelor neuronale artificiale ca rețele de elemente.

Caracteristicile cele mai importante ale rețelelor neuronale artificiale sunt:

Reprezentarea distribuită a informației

Capacitatea de generalizare

Toleranța la zgomot

rezistența la distrugerea parțială

rapiditate în calcul.

4. MODELUL NEURONULUI BIOLOGIC.

MODELUL NEURONULUI ARTIFICIAL

4. 1. NEURONUL BIOLOGIC

Cercetările actuale în domeniul calculului neuronal este dorința de a alcătui o rețea neuronală artificială. Deși, la început scopul a fost modelarea matematică a rețelelor neuronale biologice, gama aplicabilității lor fiind aproape universală, în zilele noastre.

Din punct de vedere neuro-fiziologic, modelele construite cu ajutorul rețelelor neuronale artificiale sunt extrem de simple, ele având totuși suficiente trăsături care surprind cele mai importante trăsături ale "calculului" biologic.

Unitatea celulară fundamentală a sistemului nervos, și în particular a creierului, este neuronul. În Fig. 1.2 este reprezentat schematic un neuron biologic.

Un neuron biologic este format din [2]:

– dendrite numite și prelungiri ale corpului celulei nervoase, acestea îndeplinesc funcția de intrare, sau de captare a informației;

– corpul neuronului, este format din membrană și „substanțã” intracelularã

– axon, este o prelungire a corpului neuronului, reprezentând funcția de ieșire.

Neuronii sunt interconectați prin intermediul unor legături numite sinapse, acestea sunt punctele de contact dintre ramurile arborelui axonic ale unui neuron pre-sinaptic și ramurile arborelui dendritic ale unui neuron post-sinaptic.

Neuronii comunică între ei prin intermediul unor semnale electrice, numite impulsuri, care sunt transmise de-a lungul axonului, prin păstrarea amplitudinii și formei semnalului electric, până când întâlnesc legătura sinaptică. La sinapsă o substanță chimică, numită neuro-transmițător, este stocată într-un număr mare de vezicule. Potențialul de acțiune eliberează conținutul anumitor vezicule către cleștele sinaptic[6].

Un neuron primește impulsuri nervoase de naturã electricã de la alți neuroni, prin intermediul dendritelor. Impulsurile nervoase produc depolarizãri ale membanei neuronale, adicã modificãri ale diferenței de potențial dintre interiorul și exteriorul celulei (Fig. 1.1).

Fig. 1.1 Neuronul biologic [6].

Când suma semnalelor de intrare depãșește un anumit prag, neuronul trimite un impuls de la corpul neuronal cãtre axon, apoi spre receptorii altor neuroni. Acești neuro-transmițãtori elibereazã neuronul care a transmis semnalul, direcționând impulsurile, prin sinapse, cãtre receptorii celorlalți neuroni[6].

O sinapsã reprezintã spațiul dintre terminația axonului unui neuron și dendritele altui neuron. La nivelul sinapselor, au loc procese fizico-chimice complexe, în cadrul cãrora se proceseazã informațiile codificate analogic[6].

4. 2. ÎNVÃȚAREA SINAPTICÃ

Rețeaua neuronalã a creierului uman știe sã învețe. Modalitatea de învãțare este determinatã de adaptarea puterii conexiunilor dintre neuroni, de adãugare și ștergere de conexiuni între neuroni.

Neuronii pot învãța din experiențã, fãrã a fi necesarã asistența unui profesor. Eficiența sinapselor poate modifica rezultatul experienței, asigurând mecanismul de memorare-învãțare. Învãțarea (adaptarea) se realizeazã prin modificãri ale permeabilitãții sinaptice. Depolarizãrile sau modificãrile permeabilitãții ionice a Dendrit corpul neuronului axo-membranelor sinaptice sunt determinate de recepționarea neuro-transmițãtorilor (Fig. 1.2).

Dupã efectul pe care-l provoacã, sinapsele sunt:

– excitatoare (depolarizare pozitivã);

– inhibitoare (depolarizare negativã).

Fig. 1.2 Învățarea sinaptică [6]

Postulatul lui Hebb afirmã cã dacã axonul unei celule A este suficient de aproape, ca sã excite o celulã B în mod repetat și persistent, atunci schimbul metabolic (procesul de creștere) are loc într-una sau ambele celule, astfel încât eficiența cel puțin a unei celule se mãreșe [4].

Conform cercetãrilor neuropsihologului canadian Donald Olding Hebb [3], învãțarea celularã și memorarea depind de modificãrile pe termen lung ale puterii conexiunilor sinaptice.

În cele mai multe cazuri, excitabilitatea dendritelor influențeazã procesarea semnalelor de intrare sinaptice, ceea ce înseamnã cã plasticitatea sinapticã depinde de proprietãțile dendritelor.

4. 3. NEURONUL ARTIFICIAL

Neuronul biologic a constituit un model pentru neuronul artificial. În timp ce dendritele neuronului biologic primesc semnale electrice de la axonii altor neuroni, în neuronul artificial, aceste semnale electrice sunt reprezentate de valori numerice.

Într-o rețea neuronalã artificialã, semnalele de intrare sunt procesate folosind diverse combinații (de exemplu, suma ponderatã) și apoi transformate cu o funcție de activare, pentru generarea semnalului de ieșire (Fig. 1.3).

Fig. 1.3 Neuronul artificial [6].

Într-o rețea neuronală artificială, unitatea analoagă a neuronului biologic este o unitate de procesare simplă, care va fi numit neuron artificial. Un neuron artificial are mai multe căi de intrare care corespund arborelui dendritic. Celei de-a i-a cale de intrare în neuronul al j-lea îi corespunde o valoare numerică reală , echivalentul semnalului electric din modelul biologic al neuronului. Fiecare mărime de intrare este ponderată valoarea numerică reală ,, echivalentul tăriei sinaptice din modelul biologic al neuronului [8]. Produsul reprezintă al i-lea semnal· de intrare dentritic în al j-lea neuron artificial. Aceste valori sunt integrate (sumate), pe baza unui proces similar celui realizat de soma neuronului biologic.

Suma ponderată reprezintă argumentul unei funcții, numită funcție de activare care va determina valoarea de ieșire axonică din neuron. Cele mai utilizate funcții de activare sunt[8]:

funcția liniară:

funcția treaptă: ;

funcția rampă: ;

funcția signoidală: ;

funcția tangentă hiperbolică: ;

funcția signum: .

Acestea sunt exemple de funcții de activare care sunt cel mai frecvent utilizate în aplicațiile practice. Funcția de activare depinde de modelul de rețea neuronală ales și de tipul problemei pe care dorim să o rezolvăm, alegerea sa nefiind constrânsă de nici o condiție, decât eventual de analogia cu modelul biologic.

Valoarea obținută prin aplicarea funcției de activare este propagată pe căile de ieșire, echivalente arborelui axonic din modelul biologic.

În concluzie, neuronul artificial efectuează următoarele operații [8]:

Integrare (Sumare): ;

Activare (Transfer): .

În cele ce urmează vom considera nivelul de activare implicit sau explicit, în funcție de necesități, fără ca aceasta să influențeze într-un fel generalitatea rezultatelor obținute.

Fig. 1.4 Reprezentarea schematică a neuronului artificial. Indicele j reprezintă

al j-lea neuron din rețeaua neuronală artificială[8].

4. 4. DIFERENȚE ÎNTRE NEURONUL BIOLOGIC ȘI NEURONUL ARTIFICIAL

Cele mai semnificative diferențe sunt următoarele:

 Neuronul biologic răspunde la semnalele de intrare într-un mod continuu și nu discret, ceea ce se numește răspuns gradual. Dar relația neliniară dintre semnalul de intrare și semnalul de ieșire la un neuron biologic este o trăsătură universală, care apare și la neuronul artificial prin intermediul funcției de activare.

 Neuronii biologici nu au toți același moment fix de activare și nici nu acționează sub controlul central al unui tact generat de un ceas.

 Cantitatea de substanță neuro-transmițătoare eliberată de sinapsă poate varia într-un mod impredictibil. Acest efect poate fi modelat, considerând o generalizare stohastică a dinamicii modelului determinist McCullogh-Pitts.

Legătura dintre rețelele neuronale biologice și artificiale nu este importantă la nivelul modelării detaliate, ci la nivelul reprezentării și la nivelul algoritmic [8]. Deși implementările biologice și artificiale ale algoritmilor sunt diferite, totuși există numeroase trăsături comune la nivel algoritmic [8].

5. STRUCTURA UNEI REȚELE NEURONALE ARTIFICIALE

O rețea neuronală artificială este un ansamblu de unități funcționale amplasate în nodurile unui graf orientat. De-a lungul arcelor grafului circulă semnale care permit unităților funcționale să comunice între ele. Elementele definitorii ale unei rețele neuronale sunt:

• Arhitectura: specifică modul în care sunt amplasate și interconectate unitățile funcționale. Aceasta definește și fluxul informațional în cadrul rețelei.

• Funcționarea: specifică modul în care fiecare unitate în parte și rețeaua în

ansamblul ei transformă semnalele de intrare în semnale de ieșire. Funcționarea este influențată de arhitectură, în special de modul de interconectare a unităților.

• Adaptarea (învățarea): specifică modul de stabilire a parametrilor ajustabili astfel

încât rețeaua să poate rezolva anumite probleme. În funcție de natura informației de care se dispune, învățarea poate fi supervizată sau nesupervizată. Învățarea constă în modificarea funcționaliții rețelei prin modificarea parametrilor și/sau a structurii acesteia. Procesul de învățare bazat pe adaptarea parametrilor constă în existența unor reguli de modificare a parametrilor și a unui algoritm (de regulă iterativ) de aplicare a acestor reguli.

Arhitecturile se clasifică după cum urmează:

Topologie (mod de aranjare a unităților):

Arbitrară – nu este importantă așezarea neuronilor (Fig. 1.5);

Pe nivele: de intrare – primește semnal de la mediul înconjurător (Fig. 1. 6), ascunse – nu comunică cu mediul, de ieșire – trimit semnale către ieșire;

Geometrică – existența unei relații de vecinătate (Fig. 1. 7).

Interconectivitate (mod de conectare a neuronilor):

Conectivitate totală (Fig. 1. 8);

Conectivitate între nivele (Fig. 1. 9);

Conectivitate bazată pe vecinătăți (Fig. 1.10).

Flux informațional (cum ,,curge” informația în cadrul rețelei):

Feedforword – semnalele circulă dispre nivelele de intrare către cele de ieșire, fără a exista conexini inverse (Fig. 1. 11);

Feedback – există conexiuni inverse (Fig.1. 12).

Fig. 1. 5 Arhitectură arbitrară

Fig. 1. 6 Arhitectură pe nivele

Fig. 1. 7 Arhitectură geometrică

Fig. 1. 8 Arhitectură totală

Fig. 1. 9 Arhitectură între nivele

Fig. 1. 10 Arhitectură bazată pe vecinătăți

Fig. 1. 11 Arhitectură feedforword

Fig. 1. 12 Arhitectură feedback

Fig. 1. 13 Arhitectura generală a unei rețele neuronale[8].

Cea mai semnificativă proprietate a rețelelor neuronale este capacitatea de a învăța din mediul înconjurător și de a-și îmbunătăți performanțele pe baza acestui proces de învățare. Rețeaua neuronală învață pe baza unui proces iterativ de ajustare a tăriilor sinaptice și eventual al nivelului de activare. Dacă procesul de învățare decurge bine, atunci rețeaua neuronală acumulează tot mai multe informații, la fiecare iterație.

Putem defini învățarea ca fiind un proces prin care parametrii unei rețele neuronale sunt adaptați permanent prin intermediul unor stimuli proveniți de la mediul înconjurător căruia îi aparține rețeaua neuronală. Tipul de învățare este determinat de forma de modificare a parametrilor rețelei neuronale.

Rețelele neuronale artificiale folosesc algoritmi de invățare în majoritatea problemelor. Prin algoritm de invățare înțelegem un set de reguli predefinite care soluționează problema ,,învățării”.

Există numeroase criterii de clasificare ale algoritmilor de învățare dintre care amintim:

În funcție de disponibilitatea răspunsului dorit la ieșirea rețelei neuronale există algoritmi de:

învățare supervizată;

învățare nesuperizată;

învățare folosind un “critic”.

B. În funcție de existența unui model analitic:

a) algoritmi parametrici;

b) algoritmi neparametrici.

C. În funcție de tipul aplicației pentru care sunt utilizați algoritmi de:

a) regresie;

b) clasificare.

Structura generală a unui algoritm de învățare bazat pe modificarea parametrilor este:

// inițializarea (aleatoare) a parametrilor rețelei

init W(0)

// inițializarea indicatorului de iterație

t=0

// prelucrare repetitiva

Repeat

W(t+1)=adjust(W(t),X(t)[,d(t)])

t=t+1

until <criteriu de stop>

unde:

W(t) reprezintă valorile parametrilor la momentul t,

X(t) reprezintă semnalul de intrare, iar d(t) semnalul de învățare corespunzător (poate fi chiar răspunsul corespunzător intrării X(t) sau doar un indicator de corectitudine/eroare a răspunsului dat de rețea).

În cazul învățării nesupervizate d(t) poate lipsi din regula de învățare.

Învățarea supervizată este 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ă. Aceste instanțe rezolvate se numesc instanțe de antrenament.

Formal, setul de instanțe de antrenament este o mulțime de perechi atribut-valoare (x,f(x)), unde x este instanța iar f(x) clasa căreia îi aparține instanța respectivă. De exemplu, un set de instanțe de antrenament ar putea fi:

Iterația 1: (culoare(obj1,roșie) forma(obj1,rotundă), f(obj1)=”sferă”)

Iterația 2: (mărime(obj2,mare) forma(obj2,cubică), f(obj2)=”cub”)

Scopul învățării este construirea unei funcții-șablon care să clasifice corect instanțele-exemplu, iar pentru un x pentru care nu se cunoaște f(x) să propună o aproximare cât mai corectă a valorii f(x).

Învățarea nesupervizată elimină complet necesitatea unor instanțe de antrenament, deci și problemele legate de acestea. Scopul învățării nesupervizate nu este definit anterior ca un concept țintă, algoritmul fiind lăsat singur să identifice concepte posibile.

În general, învățarea nesupervizată presupune existența unor instanțe neclasificate, un set de reguli euristice pentru crearea de noi instanțe și evaluarea unor concepte deduse, eventual un model general al spațiului de cunoștințe în care se găsesc aceste instanțe.

Un algoritm de învățare nesupervizată construiește concepte pentru a clasifica instanțele, le evaluează și le dezvoltă pe cele considerate “interesante” de regulile euristice.

În general, concepte interesante sunt considerate cele care acoperă o parte din instanțe, dar nu pe toate.

Învățarea nesupervizată permite identificarea unor concepte complet noi plecând de la date cunoscute. Încercări de a aplica acest tip de învățare în cercetarea științifică au dus la rezultate semnificative. Astfel AM (Davis și Lenat 1982) pleca de la un set de concepte de bază din teoria mulțimilor, un set de operații de creare a noi concepte prin modificarea și combinarea celor existente, și un set de reguli euristice pentru a alege conceptele interesante.

Algoritmul a descoperit numerele naturale, conceptul de număr prim, precum și o serie de alte concepte din teoria numerelor. BACON (Langley 1987) a fost o încercare de a dezvolta un model computațional de dezvoltare a unor legi cantitative științifice noi. Folosind date privind relația între distanțele dintre planete și soare și perioada lor de revoluție, BACON a redescoperit legile lui Kepler privind mișcarea planetelor. Totuși aceste încercări s-au dovedit limitate în rezultate. Principalul factor ce limitează numărul și relevanța conceptelor învățate de acest gen de algoritmi este faptul că ele nu pot învăța noi metode de a crea și evalua concepte.

Pentru a obține rezultate mai relevante, ar trebui intâi descris un set mult mai complex de operații pentru crearea de noi concepte, precum și niște reguli euristice mai flexibile pentru evalua aceste concepte.

6. APLICABILITATEA CALCULULUI NEURONAL

În prezent, studiile teoretice și practice privind calculul neuronal ocupã un loc important în cercetarea științificã din diverse domenii, precum inginerie, inteligențã artificialã, psihologie, neuroștiințã, fizicã, matematicã, etc.

Rețelelele neuronale artificiale permit rezolvarea unor probleme complexe, pentru care nu existã algoritmi secvențiali, ci doar exemple de soluții.

În faza de învãțare a rețelei neuronale, se folosesc exemplele cunoscute, care vor fi procesate pentru a rezolva probleme similare.

Tipurile de aplicații care pot fi rezolvate folosind rețele neuronale artificiale includ probleme de clasificare, de cãutare, de ordonare, probleme de recunoaștere a formelor obiectelor, mai ales înțelegerea vederii și a vorbirii, probleme care trateazã date imperfecte, incomplete, sau probabilistice.

Caracteristicile acestor probleme sunt date de [5]:

– spațiul problemelor de rezolvat, complexitatea, interacțiunile între variabilele problemei, care pot fi necunoscute sau care nu pot fi exprimate matematic

– spațiul soluției, care poate fi vid sau poate conține o soluție unicã sau cazul tipic, cu mai multe soluții.

Aplicațiile calculului neuronal vizeazã domenii precum:

• procesarea imaginilor – gruparea datelor, compresia datelor (maparea datelor dintr-un spațiu de dimensiune mare într-unul de dimensiune mai micã, astfel încât sã fie conservate relațiile de vecinãtate)

• recunoașterea formelor (inclusiv extragerea caracteristicilor formelor) și vederea artificialã

• aplicații în medicinã – diagnoza automatã, analiza celulelor canceroase, optimizarea timpului de transplant, crearea de hãrți senzoriale

7. CLASE DE PROBLEME CE POT FI REZOLVATE CU REȚELE NEURONALE

În continuare sunt prezentate câteva dintre categoriile de probleme pentru care rețelele neuronale au fost aplicate cu succes.

Clasificare și recunoaștere.

Date de intrare. Descriere sintetică a unui obiect (de exemplu descrierea grafică a unei litere sau ansamblul caracteristicilor acesteia). În majoritatea situațiilor descrierea este un vector de valori numerice obținute printr-o prelucrare prealabilă (preprocesare) a informațiilor brute.

Date de ieșire. Indicator al clasei căreia îi aparține obiectul (de exemplu numărul de ordine al literei în cadrul alfabetului). Abilitatea de clasificare a rețelei este rezultatul unui proces de învățare pornind de la exemple de clasificare corectă.

Pe lângă exemplul de mai sus, de recunoaștere a caracterelor, alte probleme concrete de clasificare sunt: recunoașterea vorbirii, clasificarea semnalelor (de exemplu separarea electrocardio- gramelor în normale și anormale), clasificarea celulelor în normale și anormale, recunoașterea unor fețe într-o imagine, clasificarea texturilor etc.

Gruparea și categorizarea datelor.

Este similară problemei de clasificare cu diferența că antrenarea rețelei se realizează pornind doar de la date de intrare, fără a specifica clasele cărora le aparțin. Clasele sunt construite pornind doar de la similaritățile existente în datele de intrare pe care rețeaua este capabilă să le identifice.

În felul acesta rețeaua neuronală descoperă criteriul de grupare. Probleme concrete din această categorie intervin în analiza datelor (în special în domeniul cunoscut sub denumirea de ”data mining”) și în compresia datelor.

Aproximare și estimare.

Se referă la extragerea dependenței funcționale dintre două mărimi pornind de la un set de valori ale celor două mărimi. De regulă valorile din set sunt alterate de zgomot (afectate de erori de măsurare sau de altă natură).

Folosind acest set rețeaua este antrenată pentru a determina dependența dintre cele două mărimi. O dată rețeaua antrenată, pentru orice valoare a argumentului ea furnizează aproximarea valorii asociate.

O problemă concretă din aceasta clasă este reprezentată de determinarea dependenței funcționale între mărimi măsurate experimental. În aceeași clasă se încadrează determinarea parametrilor unor modele din inginerie sau orice altă problemă de asociere.

În acest context rețelele neuronale pot fi văzute ca modele de regresie neliniară caracterizate printr-un număr mare de parametri.

Predicție.

Date de intrare. O succesiune de valori (numit˘a serie temporal˘a) pentru care nu este cunoscută o relație formală care să le genereze.

Dată de ieșire. Aproximarea următoarei valori din serie. Antrenarea rețelei se realizează pornind de la valorile cunoscute din serie.

Probleme concrete din această clasă sunt predicția evoluției stocurilor, predicția în meteorologie, predicție în evoluția vânzărilor etc.

Optimizare.

Diferite probleme din știință, inginerie și economie pot fi formulate ca probleme de optimizare constând în necesitatea determinării unei valori care satisface anumite restricții și optimizează o funcție obiectiv.

Rețelele neuronale sunt adecvate pentru rezolvarea problemelor de optimizare dificile pentru care este suficient să se obțină soluții suboptimale. Probleme concrete din această categorie sunt cele ce intervin în proiectarea circuitelor electronice, în alocarea resurselor, în rezolvarea problemelor de rutare în rețele etc.

Stocarea și regăsirea informației după conținut.

Rețelele neuronale permit stocarea informației astfel încât aceasta să fie ulterior regăsită pornind de la indicii legate de conținut (indiciile pot fi porțiuni din informația stocată). Astfel de sisteme de stocare sunt mai tolerante la erori în raport cu memoriile bazate pe adrese. Aplicații concrete sunt în proiectarea bazelor de date multi-media.

Modelare și control adaptiv.

Controlul unui sistem dinamic se referă la a determina un semnal de control, u(t), care asigură producerea unui semnal de ieșire dorit y(t). Rețeaua neuronală este antrenată pornind de la un model de referință.

Prelucrarea și analiza semnalelor.

Date de intrare. Un semnal, care poate fi o imagine sau un semnal sonor.

Date de ieșire. Semnalul transformat (de exemplu prin eliminarea zgomotului) sau o informație extrasă din cadrul lui.

CAPITOLUL 2

SCILAB

1. INTRODUCERE ÎN SCILAB

În acest capitol vom face o trecere în revistă a SCILAB-ului, astfel încât să ne putem familiariza cu acest mediu de programare. În prima parte, vom prezenta cum să obțineți și instala acest software pe calculatorul nostru.

În următoarele secvențe, vom prezenta limbajul Scilab, mai ales caracteristicile sale de programare. Vă prezentăm o caracteristică importantă a Scilab, care este gestionarea matrici reale și prezentare generală a algebrei liniare. Definirea funcțiilor și gestionarea elementară a variabilelor intrare și ieșire. După care se vor prezenta caracteristicile grafice Scilab și cum să creați un complot 2D. Acest limbaj de programare este dotat și cu un modul de desenarea a graficelor 3D.

De asemenea, Scilab se poate utiliza în domeniul matematicii, în predarea și învățarea acesteia devenind extrem de ușoară dacă se utilizează acestă aplicație, întrucât se pot reprezenta grafic funcții, ecuații, integrale și multe altele.

Acest capitol are ca scop familiarizarea cu mediul de lucru, în vederea rezolvării aplicațiilor ulterioare. Acest limbaj de programare este încă nou pe piață și în cele ce urmează vom prezenta câteva aspecte ale lucrului cu Scilab. Cei pe deplin familiarizați cu acest mediu de programare, pot sări peste exercițiile de început. Cei cu mai puțină experiență trebuie să urmărească explicațiile ce vor fi prezentate mai jos.

SCILAB a fost dezvoltat încă din anii 1990 de către o echipă de cercetători din Franța de la INRIA (Institut Francez de Cercetare în Informatică și Automatică) și ,,École nationale des ponts et chaussées (ENPC)” [11].

SCILAB este un pachet software destinat în primul rând calculelor numerice și prelucrărilor grafice, fiind foarte util în rezolvarea problemelor din inginerie și știință. Conceput ca o variantă open source a pachetului comercial MATLAB (http://www.mathsoft.com), SCILAB are o serie de similarități cu acesta. În primul rând fiind vorba despre facilitățile privind lucrul cu matrici.

Acest software posedă un limbaj propriu de programare, fiind un limbaj de programare de nivel înalt și permite generarea unor reprezentări grafice sofisticate. Acesta putând fi utilizat pentru prelucrarea semnalelor, analiza statistică, de îmbunătățire a imaginii, dinamica fluidelor simulări, optimizare numerică, și modelare, simulare de explicite și implicite sistemelor dinamice și (dacă este instalată caseta de instrumente corespunzătoare) manipulări simbolice.

SCILAB este un limbaj de programare asociat cu o bogată colecție de algoritmi numerici care acoperă multe aspecte ale problemelor de calcul științific.

Din punct de vedere software, SCILAB este un limbaj interpretat. Acesta în general obține o dezvoltare mai rapidă a proceselor, deoarece utilizatorul accesează direct un limbaj de nivel înalt, cu un set bogat de caracteristici oferite de biblioteca Scilab. Utilizatorii Scilab pot dezvolta propriile module astfel încât să poată rezolva problemele lor specifice [11].

SCILAB este mai mult decât un limbaj de programare de tip script. El fiind un mediu de programare dedicat științelor aplicative. În plus are o puternică interfață grafică (GUI) portabilă pe Linux și Windows.

Din punct de vedere al licenței, Scilab este un software gratuit, în sensul că utilizatorul nu plătește pentru ea. Software-ul este distribuit cu codul sursă, astfel încât utilizatorul are accesul la aspectele cele mai interne ale Scilab-lui.

Din punct de vedere științific, Scilab vine cu multe caracteristici. La început Scilab, s-a axat pe algebra liniară. Dar, rapid, numărul de caracteristici extins pentru a include mai multe domenii de calcul științific.

Așadar să enumerăm pe scurt capacitățile sale:

• algebră liniară, matrici;

• polinoame și funcțiile raționale;

• interpolarea, aproximare;

• capacități liniare, pătratice și optimizare non liniar;

• optimizarea diferențiabilă și non-diferențiabilă;

• prelucrare semnal;

• statistică.

3. CUM OBȚINEM ȘI CUM INTALĂM SCILAB?

Oricare ar fi platforma de lucru de exemplu Windows, Linux sau Mac, Scilab poate fi descărcat direct de pe pagina Scilab http://www.scilab.org sau din domeniul de download http://www.scilab.org/download sursele Scilab sunt prevăzute atât pe 32, cât și pe 64 de biți astfel încât acestea se potrivescă pe fiecare sistem de operare.

Fig. 2. 1 Consola Scilab [11]

4. MEDIUL DE LUCRU ȘI SPAȚIUL VARIABILELOR

SCILAB oferă o interfață simplă, similară celei din MATLAB, prin intermediul căreia utilizatorul poate introduce comenzi și poate vizualiza rezultatele. Interpretorul din Scilab este case-sensitive. Prompterul în Scilab este ,,–>”.

Afișarea la consolă se face prin comanda ,,disp(variabilă/text)”.

Un exemplu simplu este afișat în Fig. 2. 2:

Fig. 2. 2

4. 1. TIPURI ȘI OPERAȚII DE BAZĂ

Tipul de bază în SCILAB este cel de matrice. Valorile scalare sunt interpretate ca matrici cu o linie și o coloană. Se poate opera cu valori întregi, reale sau complexe. Tipul este asignat implicit unei variabile în funcție de valoarea pe care o are. Un exemplu este reprezentat în Fig. 2. 3:

Fig. 2. 3

Observații:

1. permite separarea mai multor comenzi pe aceeași linie, dar are și efectul de a înhiba rezultatul evaluării;

2. dacă valoarea nu este asignată unei variabile specificate atunci este implicit asignată variabilei ans (answer);

3. constantele predefinite se specifică prin construcții sintactice care încep cu ,,%”: ,,%pi”, ,,%i”, ,,%inf” (infinit), ,,%e”, ,,%nan” (valoare nedefinită);

4. comentariile se specifica prin ,, // ” (la fel ca în C).

Șirurile de caractere se specifică ca succesiuni de caractere cuprinse între ghilimele

Exemplu:

–>sir1="șir de caractere"; sir2="exemplu ";

–>sir1+sir2 //concatenare

ans =

șir de caractereexemplu

Matricile se reprezintă prin a se specifica elementele între ,,[ ]” și grupată pe linii. Elementele unei linii se separă prin spațiu, iar liniile se separă prin ,, ; ”. Fig. 2. 4

Fig. 2. 4

Accesul la elemente și la submatrici se specifică prin numele matricii și indicii grupati între paranteze rotunde și submatricile se specifică prin domenii ale indicilor de linie și/sau coloană. Un domeniu se specifică prin: val1:val2. Un exemplu este ilustrat în Fig. 2.5.

Fig. 2. 5

Observație:

Domeniile pot fi definite și pentru numere reale specificând un pas pentru generarea valorilor. Sunt utile în construirea vectorilor de valori folosiți la reprezentările grafice.

–>d=[0:0.2:1]

d =

0. 0.2 0.4 0.6 0.8 1.

Determinarea dimensiunii a numărului de linii și/sau coloane ale unei matrici se obține folosind funcția size ( Fig. 2. 6):

Fig. 2. 6

Pentru crearea matricilor particulare și modificarea conținutului există funcții speciale pentru a realiza acest pas caracterizate prin:

1. conțin doar valoarea 0 (funcția: zeros)

2. conțin doar valoarea 1 (funcția: ones)

3. conțin valori aleatoare între 0 ți 1 (funcția: rand)

Exemplele sunt reprezentate în Fig. 2. 7:

Fig. 2. 7

Conținutul unei matrici poate fi modificat direct specificând noile valori ale elementelor sau ale submatricii.

Exemplu:

–>m1(1,:)=rand(4) // modificarea primei linii a matricii cu elemente aleatoare

m1 =

0.6653811 0.6653811 0.6653811 0.6653811

5. 6. 7. 8.

Asupra matricilor pot fi operate diverse operații care pot fi aplicate, cum ar fi prelucrările clasice: calcul transpusă (operator apostrof: ‘), calcul sumă (operator: +), calcul produs (operator: *), ridicare la putere (operator: ^), operații la nivel de elemente (operatori: .*, ./, .^ ), calcul determinant (det), calcul inversă (inv). Exemplele sunt ilustrate în Fig. 2. 8:

Fig. 2. 8

În Scilab se folosesc și liste. Acestea permit gruparea unor date heterogene. Există două tipuri principale de liste:

liste fără tip:

– se creează prin cuvântul cheie ,,list”, iar pentru specificarea elementelor se folosește o notație indexată (componentele listei au asociați indici)

2. liste cu tip:

– fiecărei componente a listei i se asociază un nume (similar numelui de câmp din tipul struct) astfel că acestea pot fi referite prin calificare (notația cu . ) Se creează prin ,,tlist”.

Crearea unei liste fără tip ( Fig. 2. 9):

Fig. 2. 9

Modificarea unei componente a listei este redată în Fig. 2. 10

Fig. 2. 10

Crearea unei liste cu tip este ilustrată în Fig. 2. 11:

Fig. 2. 11

4. 2. REPREZENTĂRI GRAFICE

Reprezentările grafice în Scilab se realizează prin funcțiile următoare: ,,plot” și ,,plot2d” (reprezentări de grafice de funcții în plan) și plot3d (reprezentarea suprafețelor).

Exemplu: reprezentare pe același grafic a funcțiilor sin (roșu) și cos (albastru)

–>x=0:0.1:2*%pi;y=sin(x);

–>plot(x,y,'r',x,cos(x),'b')

Reprezentarea grafica este creată într-o fereastră separată (Fig. 2.12).

Fig. 2.12

Pentru a vizualiza exemple pentru diferite funcții grafice se apelează funcțiile fără parametri (plot() sau plot3d() etc.)

4. 3. ELEMENTE DE PROGRAMARE

Scilab conține și comenzi corespunzătoare principalelor structuri de prelucrare: alternative și repetitive. Astfel că, la fel ca și în alte limbaje de programare, Scilab are următoarele instrucțiuni:

instrucțiunea if

if condiție then instrucțiuni

else instrucțiuni

end

instrucțiunea for

for contor=valoare inițiala:valoare finală

instrucțiuni

end

Exemplu reprezentarea a 10 puncte în grafic (Fig. 2. 13):

n=input('Numar puncte='); // vizualizarea a n puncte cu coordonate aleatoare

for i=1:n

x(i)=rand(1);

y(i)=rand(1);

plot(x(i),y(i),'o');

end

Fig. 2. 13

instrucțiunea while

while condiție continuare

instrucțiuni

end

Un alt element de programare a Scilab sunt funcțiile. Astfel că se permite gruparea prelucrărilor în funcții care se salvează în fișiere separate și apelul acestora fie din alte funcții fie din linia de comandă. Editarea funcțiilor se face prin intermediul unui editor de texte (SciPad) care se lansează fie cu comanda ,,scipad()” fie se selectează ,,Editor” din meniul principal din Scilab.

După editarea funcției, aceasta se salvează, iar pentru a putea fi apelată din Scilab trebuie încarcată prin ,,Execute->Load into Scilab”.

Structura unei funcții este:

function [rezultat1, rezultat2, …] = nume_functie (param1, param2, ….)

prelucrari

endfunction

Exemplu:

//

// Conversia unui intreg x din baza 10 in baza 2 pe n pozitii

//

function b=bin(x,n)

b=zeros(1,n);

i=0;

while x~=0

i=i+1;

b(i)=modulo(x,2);

x=floor(x/2); end for i=1:floor(n/2)

aux=b(i);

b(i)=b(n-i+1);

b(n-i+1)=aux;

end

endfunction

CAPITOLUL 3

APLICAȚII ÎN SCILAB CU REȚELE NEURONALE ARTIFICIALE

În acest capitol se prezintă o serie de probleme ale rețelelor neuronale artificiale rezolvate cu ajutorul limbajului de programare Scilab.

În prima parte a acestui capitol, vom prezenta perceptronul atât parte teeoretică cât și parte practică prin aplicații în Scilab.

În a doua parte, vă vom descrie regresia liniară și regresia neliniară cu rețele neuronale prin parte teoretică și prin parte practică, cu funcții liniare și neliniare.

În partea a treia vom vorbi despre o rețea neuronală particulară, numită Kohonen, pentru exemplu vom utiliza problema Comis-voiajor rezolvată folosind rețeaua Kohonen.

1. PERCEPTRONUL

Neuronii biologici introduși de McCulloch și Pitts au fost prezentați ca modele de componente conceptuale pentru circuite care realizează anumite calcule. Rosenblatt a propus perceptronul, un model mai general decât unitățile de calcul McCulloch–Pitts. Ideea esențială constã în introducerea ponderilor numerice și a unui model special de interconectare [3].

Perceptronul clasic este o rețea neuronală ce poate rezolva probleme de recunoaștere a formelor, putând reprezenta numai funcții liniar separabile.

Modelul unui perceptron

Fie o rețea de tip perceptron cu urmãtoarele elemente componente [6]:

fiecare intrare j din exterior are ponderea , unde j = 1, . . . , d . Vectorul ponderilor va fi notat W = (), iar transpusa vectorului W se va nota: w =

un vector cu d intrări notate (). Deci vectorul de intrare va fi un punct din spațiul , fiind notat ca vector de coloana i , de dimensiune d :

i =

neuronul are o intrare suplimentară b (pragul sau polarizarea), conectată în permanență la un semnal egal cu 1 (Fig. 3. 1.).

Fig. 3. 1. Perceptron cu un neuron/ Perceptron simplu [6]

activarea rețelei ( n ) se poate exprima ca suma ponderată a intrărilor, unde j = [5]

n =

perceptronul folosește o funcție de transfer (sau de activare), care transformã semnalul de activare în semnal de ieșire (Fig. 3. 2.):

hard R, hard lim (n) =, unde n = activarea rețelei

Fig. 3. 2. Funcția hardlim [6].

rețeaua de tip perceptron are o ieșire, care se determinã prin aplicarea unei funcții cu prag. Ieșirea este dată de relația [6]

a = hard lim ( n ) = hard lim ( W * i + b ) = hard lim ().

O rețea neuronalã devine funcționabilã, numai dacã este învãțatã sã îndeplineascã anumite funcțiuni, specifice rezolvãrii problemelor (folosind algoritmi de învãțare).

Perceptronul simplu reprezintă unul din primele modele de calcul neuronal construite, fiind de departe cea mai studiată și analizată rețea neuronală. De aceea interesul de a studia perceptronul simplu nu este numai de factură istorică ci și științifică, proprietățile sale putând fi regăsite la orice rețea neuronală. Perceptronul simplu învață cu ajutorul unei legi de învățare supervizate. Arhitectura perceptronului simplu constă din stratul de intrare și stratul de ieșire, neexistând straturi ascunse ( Fig. 3. 1.).

APLICAȚIA 1. PERCEPTRON SIMPLU

Implementarea unui perceptron simplu care reprezintă o funcție booleană definită pe cu valori {-1,1} (exemplu funcțiile OR și AND) .

Etapele rezolvării aplicației:

definirea setului de antrenare:

set_OR=tlist(["Training set","x","d"],[-1 -1 1 1;-1 1 -1 1],[-1 1 1 1])

definirea rețelei se face prin:

network=tlist(["Simple perceptron","X","W","Y"], zeros(3,1), zeros(1,3), zeros(1,1))

implementarea algoritmului de învățare este reprezentat în Fig. 3. 3. :

Fig. 3. 3. Cod sursă perceptron simplu

testarea rețelei se face pe consola SCILAB prin:

[network,rez] = simple_perceptron(network,0,set_OR,10,0.1)

Rezultatul testării va fi:

Iteration:

0.

d=

– 1.

y=

0.

d=

1.

y=

– 1.

d=

1.

y=

– 1.

d=

1.

y=

1.

Iteration:

1.

d=

– 1.

y=

– 1.

d=

1.

y=

1.

d=

1.

y=

1.

d=

1.

y=

1.

rez =

– 1. 1. 1. 1.

network =

network(1)

!Simple perceptron X W Y !

network(2)

0.

0.

0.

network(3)

– 0.1 0.1 0.1

network(4)

0.

APLICAȚIA 2. PERCEPTRON MULTIPLU.

Implementarea unui perceptron multiplu care să permită clasificarea în patru clase (ex: datele sunt puncte în plan iar clasele sunt cele patru cadrane ale sistemului de axe de coordonate)

Rezolvare:

definirea setului de antrenare:

se vor alege câteva puncte din fiecare cadran iar eticheta clasei va fi numărul de ordine al cadranului

set =tlist(["Set antrenare","x","d"],[1 2 -1 -2 -1 -2 1 2;1 2 1 2 -1 -2 -1 -2], [1 1 2 2 3 3 4 4])

definirea rețelei (2+1 unități de intrare și 4 unități de ieșire):

network=tlist(["Multiple perceptron","X","W","Y"], zeros(3,1), zeros(4,3), zeros(4,1))

implementarea algoritmului de învățare ( Fig. 3. 4. ):

Fig. 3. 4. Cod sursă algoritm învățare – perceptron multiplu

Funcția imax returnează indicele valorii maxime din vectorul x ( Fig. 3. 5.)

Fig. 3. 5. Cod sursă funcția imax.

Antrenarea rețelei se face prin comanda:

[network,rez] = multiple_perceptron(network,0,set,10,0.1) efectuată la consolă.

Testarea rețelei se face prin construirea un set de testare și testarea propriu-zisă:

setTestare =tlist(["Set testare","x"],[3 -3 -3 3;2 2 -2 -2] )

testarea propriu-zisă se face prin comanda

[network,rez] = multiple_perceptron(network,1,setTestare,0,0)

Rezultatul rulării programul este:

rez =

0. 0. 0. 0.

0. 0. 0. 0.

0. 0. 0. 0.

0. 0. 0. 0.

network =

network(1)

!Multiple perceptron X W Y !

network(2)

0.

0.

0.

network(3)

0.1 0.1 0.1

0.1 – 0.1 0.1

– 0.1 – 0.1 – 0.1

– 0.1 0.1 – 0.1

network(4)

0.

0.

0.

0.

2. REGRESIE LINIARĂ ȘI NELINIARĂ

Rețelele neuronale liniare sunt asemănătoare cu rețelele de perceptroni, diferența fiind dată de funcția de activare, care este liniară. Acest fapt permite ca ieșirile unei rețele liniare să poată lua orice valoare, în timp ce ieșirea unui perceptron este limitată la două valori: 0 sau 1 [15].

Principalele diferențe între rețelele liniare și perceptroni constau în modul de interpretare a ieșirii rețelei și în algoritmul de învățare. Perceptronii pot rezolva probleme de decizie (de exemplu probleme de clasificare), iar rețelele liniare sunt destinate în special rezolvării problemelor de aproximare [15].

O funcție f : R → R: este liniară dacă:

Rețelele neuronale liniare pot rezolva numai probleme liniar separabile.

În categoria rețelelor uninivel, cu funcții de transfer liniare, se încadrează rețelele ADALINE (ADAptive LINear Element), respectiv MADALINE (Multiple ADAptive LINear Element), introduse de Widrow și Hoff.

Astfel de rețele pot fi utilizate pentru rezolvarea problemelor de algebră booleană, pentru reprezentarea funcțiilor liniare continue, principalele aplicații fiind regresia liniară și filtrarea liniară a semnalelor, etc.

Rețelele liniare cu un singur nivel au aplicabilitate limitată deoarece [3]:

– pot rezolva doar probleme simple de clasificare (probleme liniar separabile);

– pot aproxima doar dependențe simple.

Aceste limitări, ale rețelelor liniare, pot fi depășite prin includerea nivelelor ascunse, care trebuie să aibă funcții neliniare de transfer.

Funcțiile de activare liniare sunt utile la implementarea rețelelor cu un strat

și, în special, la implementarea rețelelor feed-forward, pentru procesarea semnalelor de activare ale ultimului strat.

Rețelele neuronale neliniare sunt asemenea celor liniare , diferența dintre cele două este că rețelele neuronale neliniare rezolvă problemele reprezentate prin funcții neliniare.

APLICAȚIA 3. REGRESIE LINIARĂ CU REȚELE NEURONALE UNINIVEL.

Să se determine o funcție liniară, care asigură o cea mai bună aproximare (în raport cu eroarea medie pătratică) a unui set de puncte în plan {(), … , ()}.

Rezolvare:

Definirea setului de antrenare a regresiei liniare se realizează prin:

set_regression=tlist(["Training set","x","d"],[1 2 3 4 5],[3 5 7 9 11])

Definirea rețelei neuronale artificiale se efectuează prin:

network=tlist(["Linear network","X","W","Y"],zeros(n,1),zeros(m,n),zeros(m,1))

Observație: În prealabil se asignează valori pentru n și m (de exemplu: n=2, m=1).

Implementarea algoritmului de antrenare, Widrow-Hoff, este ilustrată în Fig. 3. 6.

Fig. 3. 6. Cod sursă algoritm de antrenare, Widrow-Hoff.

Eroarea se calculează cu următoarea funcția mediei pătratice reprezentată în Fig. 3. 7.

Fig. 3. 7. Cod sursă funcție eroare, medie pătratică.

Rețeaua se antrenează, în consola SCILAB, prin comanda:

linear_network(network,0,set_regression,5,0.1)

Efectuând comanda de mai sus antrenarea arată în felul următor:

Iteration:

0.

error=

0.0839105

Iteration:

1.

error=

0.0729837

Iteration:

2.

error=

0.0634797

Iteration:

3.

error=

0.0552134

Iteration:

4.

error=

0.0480235

ans =

ans(1)

!Linear network X W Y !

ans(2)

– 1.

5.

ans(3)

– 1.2067889 1.9565007

ans(4)

0.

Reprezentarea grafică punctele din setul de antrenare (Fig. 3. 9.) și dreapta aproximată (Fig. 3. 8. ) se realizează prin comenzile:

x=[1:0.1:5];

y=network.W(2)*x-network.W(1);

plot(x,y);

plot(set_regresion.x,set_regression.d,'r*');

Pentru n=2 și m=1 programul afișează (Fig. 3. 8. și Fig. 3. 9.):

Fig. 3. 8. Graficul dreptei aproximată

Fig. 3. 9. Graficul punctelor din setul de antrenare.

APLICAȚIA 4. REȚELELOR NEURONALE NELINIARE DE TIP FEEDFORWARD, PENTRU APROXIMARE ȘI PREDICȚIE.

Implementarea rețelelor feedforward antrenate cu BackPropagation – funcții SciLab pentru crearea și antrenarea unei rețele cu un nivel ascuns.

Algoritmul BackPropagation învață ponderile pentru o rețea pe mai multe nivele, dându-se o rețea cu o mulțime de unități și interconexiuni. Este implicată panta gradientului pentru a încerca să minimizeze pătratul erorii dintre valoarea ieșirii și valoarea țintă pentru acele ieșiri. Problema învățării în BackPropagation este de a căuta în spațiul mare al ipotezelor definit de toate valorile posibile ale ponderilor pentru toate unitățile din rețea.

Exemplu :

Aproximarea unei funcții neliniare (f:[a,b]->R) pornind de la un set de puncte corespunzătoare graficului său.

Preluarea datelor de intrare (puncte aflate în apropierea graficului funcției de aproximat) – punctele se selectează folosind butonul drept al mouse-ului; finalizarea selectării punctelor se realizează folosind butonul din stânga al mouse-ului):

Rezolvarea problemei se face prin următorii pași:

Crearea rețelei neuronale și funcțiile de activare care se utilizează în rețelele neuronale cu algoritmul de învățare BackPropagation se realizează în felul următor:

function network=NNcreate(N, K, M, activationFunction1, activationFunction2)

network=tlist(["Retea feedforward","N","K","M","X0","Y0","X1","Y1","X2","Y2","W1","W2","f1","f2"], N,K,M,zeros(N+1,1),zeros(N+1,1),zeros(K,1),zeros(K+1,1),zeros(M,1),zeros(M,1),zeros(K,N+1),zeros(M,K+1),activationFunction1,activationFunction2);

endfunction

// functie de activare: logistica

function output=logistic(x)

output=1/(1+exp(-x));

endfunction

// functie de activare: liniara

function output=linear(x)

output=x;

endfunction

Observație. Funcția ,,tanh” este predefinită în SciLab.

Calculul semnalului de ieșire este prezentat în cele ce urmează (etapa Forward din algoritmul BackPropagation):

function network=forward(network, X)

network.X0=[-1;X];

network.Y0=network.X0;

network.X1=network.W1*network.Y0;

network.Y1=[-1; feval(network.X1,network.f1)];

network.X2=network.W2*network.Y1;

network.Y2=feval(network.X2,network.f2);

endfunction

Calculul erorii medii pătratice este ilustrat mai jos:

function err=error_computation(network, tset)

err=0;

L=tset.L;

for i=1:L

network=forward(network,tset.X(:,i));

delta=(tset.d(i)-network.Y2).^2;

err=err+sum(delta);

end

err=err/L;

endfunction

Ajustarea ponderilor ( implementarea algoritmului BackPropagation) se realizează după cum este ilustrat în codul sursă de mai jos:

function [network, ap, aE]=BP(network, tset, pmax, Emax, eta)

L=tset.L;

// initializarea ponderilor cu valori aleatoare in [-1,1]

network.W1=2*rand(network.W1)-ones(network.W1);

network.W2=2*rand(network.W2)-ones(network.W2);

E=error_computation(network,tset);

// calcul eroare

p=0;

// initializare contor epoca de antrenare ap=[]; aE=[];

while p<pmax & E>Emax

for l=1:L

network=forward(network,tset.X(:,l));

delta2=tset.d(l)-network.Y2;

// calcul eroare la nivel de iesire

if (network.f2==logistic)

delta2=delta2.*(network.Y2.*(ones(network.Y2)-network.Y2));

end;

if (network.f2==tanh)

delta2=delta2.*(ones(network.Y2)-network.Y2.^2);

end;

delta=network.W2'*delta2;

// propagare eroare

if (network.f1==logistic)

delta=delta.*(network.Y1.*(ones(network.Y1)-network.Y1));

end;

if (network.f1==tanh)

delta=delta.*(ones(network.Y1)-network.Y1.^2);

end;

delta1=delta(2:length(delta));

// ignorarea componentei fictive

network.W1=network.W1+eta*(delta1*network.Y0');

network.W2=network.W2+eta*(delta2*network.Y1');

end;

E=error_computation(network,tset);

disp(E,"Eroare=",p,"p=");

ap=[ap p];

aE=[aE E];

p=p+1; // incrementarea contorului de epoca

end

endfunction

Construirea setului de antrenare pentru funcția neliniară

function tset1=trainingSet()

tset1=tlist(["Training set","L","X","d"],0,zeros(1,100),zeros(1,100));

clf;

plot2d(0,0,0,rect=[0,0,10,10]); // definirea domeniului si a codomeniului

xgrid(3);

x=locate(-1,1);

tset1.L=size(x,2);

tset1.X(1:tset1.L) = x(1,:);

tset1.d(1:tset1.L) = x(2,:);

endfunction

Aproximarea funcției pornind de la punctele selectate:

function tset=regression(hiddenUnits, eta, epochs)

rn=NNcreate(1,hiddenUnits,1,logistic,linear); // crearea retelei

disp("dupa creare retea");

tset=trainingSet();

// construirea setului de antrenare

inf=min(tset.X);

sup=max(tset.X);

rna=BP(rn,tset,epochs,0.0001,eta);

// antrenarea retelei // testarea retelei

x=inf:(sup-inf)/100.:sup;

y=[];

for i=1:size(x,2);

rna=forward(rna,x(1,i));

y=[y rna.Y2];

end

plot(tset.X,tset.d,'b*',x,y,'r-');

endfunction

Apelul programului pentru funcția neliniară f:[a,b]->R, se realizează prin comanda:

regression(10,0.01,10000) în consola Scilab.

Selectarea punctelor și graficul funcției rezultat este reprezentată în Fig. 3. 10.

Fig. 3. 10. Graficul funcției neliniare.

3. REȚELE NEURONALE KOHONEN

Rețele Kohonen (hărți cu auto-organizare) pentru gruparea datelor.

Rețelele Kohonen sunt destinate în principal clasificării nesupervizate a datelor vectoriale. Ele asigură un plus față de celelalte rețele competitive și conservarea relațiilor de vecinătate din domeniul datelor de intrare. Aceasta înseamnă că date 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. Scilab permite crearea de hărți multidimensionale cu diferite tipuri de topologii ale nivelului de ieșire [12].

Conectivitatea dintre nivelul de intrare și cel de ieșire este totală. Unitatea învingătoare se determină folosind criteriul distanței minime. Antrenarea este de tip competitiv asigurându-se ajustarea atât a unității învingătoare cât și a celor aflate în vecinătatea acesteia (folosind însă o rată de învățare de două ori mai mică). Atât rata de învățare cât și dimensiunea vecinătății descresc pe măsură ce numărul de iterații crește.

Învățarea conține două etape[12]:

(a) etapa de ordonare: asigură ordonarea unităților în așa fel încât unitățile vecine să ”răspundă” de clase ”apropiate” (în această fază atât rata de învățare cât și dimensiunea vecinatății sunt relativ mari);

(b) etapa de ajustare fină a prototipurilor: asigură apropierea vectorilor cu ponderi de prototipurile claselor (vecinătățile se reduc doar la vecinii direcți sau chiar doar la unitatea învingătoare iar rata de învățare este mică).

APLICAȚIA 5. REȚELE KOHONEN. PROBLEMA COMIS-VOIAJORULUI.

Enunțul problemei. Să se proiecteze o rețea Kohonen pentru rezolvarea problemei comis voiajorului. Se pornește de la un set de puncte în plan și se caută un traseu care să treacă prin toate punctele astfel încât lungimea totală a traseului să fie minimă.

Se folosește o rețea Kohonen unidimensională circulară (ultima unitate este considerată vecină cu prima unitate) având cel puțin de două ori mai multe unități decât puncte. Setul de antrenare este reprezentat de setul de puncte în plan.

Antrenarea va consta în aplicarea algoritmului Kohonen folosind o funcție de vecinătate.

Etapele rezolvării problemei:

Implementarea rețelei Kohonen:

n=10;

m=10;

function [nn]=Kohonen_TSP(a, b, n, m)

[x,n]=generare(a,b,n); // generare date

nn=tlist(["retea Kohonen","m", "X","W","Y"],m,zeros(2,1),zeros(m,2),zeros(m,1));

// definire retea

C=init(a,b,m); // etapa de initializare

nn.W=C';

eta=1.25; s=m/2;

for t=1:1000

for i=1:n

// determinare unitate invingatoare

imin=winner(nn,x(:,i));

// ajustare

for j=1:m

nn.W(j,:)=nn.W(j,:)+eta*(x(:,i)'-nn.W(j,:))*lambda(nn,j,imin,s);

end

end

// ajustare eta si s

eta=0.995*eta;

if modulo(t,100) ==0 & s>1

s=s/1.25;

end

end

//vizualizare traseu aproximat de catre retea

plot(x(1,:),x(2,:),'ko');

for k=1:nn.m-1 do

plot([nn.W(k,1),nn.W(k+1,1)],[nn.W(k,2),nn.W(k+1,2)],'r*-');

end

plot([nn.W(nn.m,1),nn.W(1,1)],[nn.W(nn.m,2),nn.W(1,2)],'r*-');

endfunction

Funcții ajutătoare. Generarea datelor ( coordonatele punctelor ) se realizează prin:

function [x, n]=generare(a, b, n)

x=[];

for k=1:n

x=[x [grand(1,1,"unf",a,b);grand(1,1,"unf",a,b)]];

end

endfunction

Determinarea unității învingătoare.

function imin=winner(nn, x)

for k=1:nn.m

d(k)=dist(x,nn.W(k,:)');

end

imin=1;

for k=2:nn.m

if d(k)<d(imin)

imin=k;

end

end

endfunction

Inițializarea ponderilor se întocmește aleator prin următoarea funcție:

function C=init(a, b, m)

C=[];

for i=1:m

//C=[C [grand(1,1,"unf",a,b);grand(1,1,"unf",a,b)]];

C=[C [(a+b)/2+0.5*cos(grand(1,1,"unf",0,2*%pi));(a+b)/2+0.5*sin(grand(1,1,"unf",0,2*%pi))]];

end

endfunction

Calcul distanță euclidiana între vectori

function d=dist(x, y)

n=length(x);

d=0;

for i=1:n

d=d+(x(i,1)-y(i,1))^2;

end

endfunction

Funcția de reprezentare a vecinătăților.

function f=lambda(nn, i, imin, s)

if abs(i-imin)==nn.m-1

f=exp(-1/(2*s^2));

else

f=exp(-(i-imin)^2/(2*s^2));

end

endfunction

Rezultatul rulării programului prin apelarea comenzii nn=Kohonen_TSP(10,20,n,m) este ilustrat în Fig. 3. 11.

Fig. 3. 11. Problema comis-voiajor(n=10, m=10)

BIBLIOGRAFIE

[1] Dumitrescu D., Costin Hariton, Rețele neuronale. Teorie și aplicații, 1996, Editura Teora

[2] Genevieve Orr, Nici Schraudolph, Fred Cummins, Neural Networks. Lecture Notes, Willamette University, 1999

[3] Hebb D.O, The Organization of Behavior; a neuropsychological theory, Wiley: New York; 1949

[4] Carew Thomas J., Robert D. Hawkins, Thomas W. Abrams, Eric R. Kandel, A Test Of Hebb’s Postulate At Identified Synapses Which Mediate Classical Conditioning In Aplysia, The Journal Of Neuroscience, Vol. 4, No. 5, p. 1217- 1224, 1984

[5] Moise Adrian, Rețele neuronale pentru recunoașterea formelor, Editura MATRIX ROM, 2005

[6] Tudor Nicoleta Liviana, RETELE NEURONALE ARTIFICIALE. Aplicații Matlab, Editura MATRIX ROM, 2012

[7] Enăchescu C., Fundamentele rețelelor neuronale; Editura "Casa Cărții de Știință", Cluj- Napoca, 1998.

[8] Enăchescu C, Calcul neuronal, Editura "Casa Cărții de Știință", Cluj-Napoca, 2009

[9] Pintea C-M., Advances in Bio-inspired Computing for Combinatorial Optimization Problem, Springer, 2014

[10] www.wikipedia.com

[11] The Scilab Consortium. Scilab. http://www.scilab.org

[12] http://web.info.uvt.ro/~dzaharie/nec.html

[13] http://www.scilab.in/

[14] http://www.openeering.com/scilab_tutorials

[15] Articolul. Procesarea semnalelor în rețele neuronale liniare, Tudor Nicoleta Liviana, Revista Română de Informatică și Automatică, vol. 21, nr. 3, 2011.

Similar Posts