S-114.3812 Laskennallinen Neurotiede Laskuharjoitus 3 8.12.2006 Heikki Hyyti 60451P
Tehtävä 2 Tehtävässä 2 piti tehdä 100 hermosolun assosiatiivinen Hopfield-muistiverkko. Verkko on rakennettu Matlab-ohjelmaan seuraavalla koodilla: clear; P = 10; N = 100; % siirtymän estimaatti. Se siirtää todennäköisyyttä -1 ja 1 välillä. % jos siirtymä on 1, niin todennäköisyys saada 1 on 100% % jos siirtymä on -1, niin todennäköisyys saada 1 on 0% siirtyma = 0; if (siirtyma > 1) siirtyma = 1; else if (siirtyma < -1) siirtyma = -1; end end % Tekee matriisin, jossa on sarakkeissa N mittaiset vektorit v % ja P saraketta, jokainen yhtä P arvoa varten. V = round(rand(n, P)+(siirtyma/2))*2-1; % Lasketaan jokaisella P:n arvolla pistetulo vektorien kesken ja lasketaan % kaikki P:t yhteen. Se onnistuu matriisialgebralla helposti. % Lisäksi pitää tyhjentää diagonaaliakseli. M = V*V'; M = M.*(ones(N)-eye(N)); % Otetaan muistettava vektori talteen. Vm = V(:,1); % v:n alkuarvo niin että sillä on positiivinen overlap. % Tällä tavoin arvottuna satunnainen välillä [0,1] % samalla kaavalla saadaan negatiivinen overlap, kun Vm:n ja -1 merkki % vaihdetaan. v = sign(round(vm.*rand(n, 1))*1.5-1); for t = 1:20 end % overlap funktio overlap(t) = v' * Vm / N; % v:n aktiviteetti. M*v laskee summan M:n rivien ja v:n tulosta. % Siitä otetaan sign() funktiolla merkki ja muodostetaan uusi v:n arvo. v = sign(m*v); figure(1); plot(1:t,overlap); axis([1 t -1 1]); title(['muistaminen, kun overlap alussa on ' num2str(overlap(1),2) ', N= ' int2str(n) ' ja P=' int2str(p) ]); xlabel('aika'); ylabel('overlap'); Tämä koodi tekee ensin satunnaisen muistiavaruuden, V. Siitä luodaan hermosolujen väliset yhteydet matriisiin, M. Sen avulla lasketaan aikayksiköitä eteenpäin. Kunkin hetkinen tilanne on vektorissa, v. Kuvaan 1 on piirretty muistaminen kun overlap on ollut alussa positiivinen eli v:n alkutila on ollut lähellä muistettavaa tilaa.
Kuva 1. Kuvaan on piirretty positiivisella overlapilla aloitettu iterointi, kun P=10. Jos overlap on alussa negatiivinen, eli v:n alkutila on ollut hyvin kaukana muistettavaa tilaa, niin tämä verkko muistaakin täysin käänteisen tilan. Tällöin overlap iteroituu lähelle arvoa -1, kuten kuvasta 2 nähdään. Kuva 2. Kuvassa on piirretty negatiivisella overlapilla aloitettu iterointi, kun P=10.
Tällainen käytös selittyy sillä, että jos iterointivaiheessa v:n yksi alkio on negatiivinen, kertoo se kaikki matriisin M summattavat alkiot negatiivisella kertoimella, jolloin lopputuloskin on erimerkkinen verrattuna siihen että v:n alkion alkuarvo olisi ollut positiivinen. Näin lopputulos iteroituu kohti joko -1 tai +1 riippuen alkuarvosta, jos muistaminen tapahtuu. Voimme olettaa vektorin muistetuiksi, jos vektorin käänteisvektori (-v) löytyy. Tällöin voimme tosin tallentaa puolet vähemmän tietoa verkkoomme. Seuraavassa vaiheessa tutkimme Hopfield:n verkon muistikapasiteettia. Kasvatamme muistiavaruuden P kokoa 1 eteenpäin ja laskemme eri P:n arvoilla toteutuuko muistaminen vai ei. Koska järjestelmämme arpoo aina satunnaiset alkuarvot, pitää meidän laskea useita kertoja samalla P:n arvolla ja keskiarvoistaa tuloksia. Seuraava Matlab-koodi on muutettu yllä olleesta koodista niin, että se laskee 100 toistoa jokaiselle P:n arvolle ja laskee kaikki P:n arvot välillä [1,100]: clear; % muutetaan edellistä listausta niin, että tehdään sama mittaus 100 kertaa % jokaisella P.n arvolla. lasketaan P:n arvot 1-100. Näistä % laskentatuloksista otetaan keskiarvot jokaista P:tä kohti ja saadaan % todennäköisyys sille, että kullakin P.n arvolla muistaminen tapahtuu % oikein. for ii = 1:100 for P = 1:100 N = 100; % Tekee matriisin, jossa on sarakkeissa N mittaiset vektorit v % ja P saraketta, jokainen yhtä P arvoa varten. V = round(rand(n, P))*2-1; % Lasketaan jokaisella P:n arvolla pistetulo vektorien kesken ja lasketaan % kaikki P:t yhteen. Se onnistuu matriisialgebralla helposti. % Lisäksi pitää tyhjentää diagonaaliakseli. M = V*V'; M = M.*(ones(N)-eye(N)); % Otetaan muistettava vektori talteen. Vm = V(:,1); % viimeistä kohtaa varten overlap = 1; v = Vm; for t = 1:20 % overlap funktio overlap(t) = v' * Vm / N; end v = sign(m*v); %viimeistä testiä varten taulukointi. overlapend(ii,p) = overlap(t); end; end figure(1); plot(1:p,mean(overlapend)); axis([1 P 0 1]); title('muistamisen todennäköisyys P:n funktiona, kun overlap on alussa 1'); xlabel('p, muistiavaruuden koko'); ylabel('overlapin keskiarvo 100 näytteestä');
Edellisen koodin piirtämä keskiarvokäyrä on kuvassa 3. Siitä nähdään, että todennäköisyys sille, että muistaminen tapahtuu oikein alkaa laskea nopeasti, kun P>10. Kun P=30 niin vain enää joka toinen kerta muistetaan oikein. Kuvasta nähdään hyvin, miten muistin tehokkuus heikkenee muistettavien asioiden lisääntyessä. Kuva 3. Kuvassa on 100 overlap-mittauksen keskiarvo kullakin P:n arvolla. Lisäksi muistamisen tehokkuuden arviointia auttaa keskihajonnan laskeminen edellisen käyrän lisäksi. Se saadaan laskettua seuraavalla Matlab-koodilla: plot(1:100,std(overlapend)) title('muistamisen keskihajonta P:n funktiona, kun overlap on alussa 1'); ylabel('overlapin keskihajonta 100 näytteestä'); xlabel('p, muistiavaruuden koko'); Tällä koodilla on piirretty kuvaan 4 keskihajonta. Kuvasta 4 havaitaan, että muistamisessa alkaa tulla hajontaa kun P>10 ja hajonta on suurimmillaan kun P on 20 ja 30 välillä. Kuvista 3 ja 4 voidaan päätellä, että Muistaminen tapahtuu hyvin, kun P<= 10 ja muistamisen todennäköisyys pienenee jyrkästi, kun 10<P<30. Kun P>30 ei muistaminen enää toimi juuri ollenkaan.
Kuva 4. Kuvassa on 100 overlap-mittauksen keskihajonta kullakin P:n arvolla.