Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Neuroverkot

Daih [29.06.2009 19:55:54]

#

Olen rakentamassa tekoälylleni neuroverkkoa ja tarvisin apua, miten saisin tietyt ongelmakohdat selvitettyä. Ohjelmaa koodaan C++:lla. Tekoälyn tarkoitus olisi toimia kysymyksiin vastaajana, sekä sen tulisi oppia analysoimaan tietoa internetistä (ikuisuusprojekti).

Ensimmäinen ongelma tulee siinä, minkäkokoisen verkon voin rakentaa omilla konetehoillani, sillä en ole yhtään perehtynyt tähän konetehoja kuluttavaan asiaan, eli mitkä asiat tässä vaikuttavat? Voinen sanoa, että koneessani on Intel core i7 @ 290 vakiona ja 6 Gt muistia, sekä käyttiksenä Windows Vista Ultimate 64bit. Nämä kai ovat tärkeimmät tiedot. Ohjelmalle on myös yli 100Gt vapaata talletustilaa, jos sen on pakko jotain tallettaa (varmasti on...).

Neuronverkko tulee kuitenkin muodostumaan taulukkoihin, eli alussa tulee olemaan syötetaso, joka lähettää ärsykkeitä toisen tason neuroneille. Nämä taasen karsivat tietoa ja lähettävät ne alemmalla tasolla oleville neuroneille, jotka puolestaan lähettävät jatkojalostetun tiedon muistisoluille, jotka tallettavat tiedon tietokoneen muistiin ja jos muistisolun ikä kasvaa liikaa, se talletetaan teidostoon. Tällöin muistissa ovat vain uusimmat muistisolut ja aktiivisimmin käyetyt.

Neuronin olen saanut luotua olioksi, joka pystyy lukemaan muiden neuronien tiedot taulukosta, johon ne tallettuvat. Tämän jälkeen tulee käsittely, jonka jälkeen taulukkoon taltioitu tieto on joko positiivinen(1) tai negatiivinen (0), jonka lukee viimeinen kerros, joka palauttaa annetuista tiedoista tuloksen.

Nykyisenä ongelmanani on neuronien sisusta, eli miten se pitäisi rakentaa. Millä tavalla neuronien väliset reitit saadaan heikkenemään tai vahvistumaan? Ja miten tähän saadaan opetusominaisuus mukaan, eli kun tähän syötetään tieto, niin miten se pystyy menemään alkuasetelmasta loppuasetelmaan tuhoamatta muita reittejä?

os [29.06.2009 21:55:22]

#

Taidat yrittää haukata vähän turhan isoa palaa kerralla. Vaikuttaisi siltä, että olet koodannut lähinnä yksittäistä hermosolua kuvaavan olion ja kysyt nyt, miten näistä yhdistellään toimivat digitaaliset aivot. Jos tähän joku pystyisi vastaamaan, ei Nobel-palkintoa (tms. vastaavaa) varmaan tarvitsisi kovin kauaa odotella.

Myös neuroverkkojen koodaaminen kannataa aloittaa yksinkertaisista esimerkeistä. Tässä yksi hyvin tarkoitukseen sopiva sivu:
http://www.doc.ic.ac.uk/~nd/surprise_96/journal/vol4/cs11/report.html

jalski [29.06.2009 22:05:33]

#

Minkälaisen neuroverkon ajattelit toteuttaa. Aloitellessa on ehkä yksinkertaisin toteuttaa ensin Hebbian -ja/tai Hoppfield-verkko.

Olen viimeaikoina opiskellut Infernon Styx-protokollaa (= 9P2000) ja harjoituksena tehnyt Limbolla ohjelmaa, mikä palvelee hakemistossa virtuaalisia tiedostoja. Ohjelman kanssa kommunikointi tapahtuu lukemalla ja kirjoittamalla näitä tiedostoja. Hakemistossa on tiedostot loogisille operaatioille (AND, OR ja XOR). Edellä mainittuihin tiedostoihin kirjoittamalla 2-bitin vektorin, ohjelma palauttaa loogisen operaation tuloksen käyttämällä valmiiksi opetettua Hebbian-verkkoa. Lisäksi hakemistossa on kaksi tiedostoa, joilla ohjataan toista Hebbian-verkkoa (verkon opetus ja testaus). Voin postittaa tuon tänne, kunhan saan sen siistittyä "julkaisukuntoon". C-kieltä osaavan helppo ymmärtää Limboa.

trilog [29.06.2009 22:10:08]

#

Totta, suuren palan haukkaaminen tässä asiassa ei kannata. Aihe on niin laaja (ja osittain tuntematon), ettei mitenkään heti pysty käsittämään mitkä yhdistelmät sopivat juuri tiettyyn ongelmaan.

Daih kirjoitti:

Millä tavalla neuronien väliset reitit saadaan heikkenemään tai vahvistumaan? Ja miten tähän saadaan opetusominaisuus mukaan, eli kun tähän syötetään tieto, niin miten se pystyy menemään alkuasetelmasta loppuasetelmaan tuhoamatta muita reittejä?

Neuronien välisissä yhteyksissä (= synapsit) on painoarvo (weight) ja jokaisella neuronilla oma kynnysarvo (threshold), jos tuleva painoitettu syöttö (input) ylittää neuronin kynnysarvon, neuroni aktivoituu (fire). Verkkoa opetetaan jollakin opetusalgoritmilla, jolla muutetaan synapsien painoja halutuksi.

Schedler [30.06.2009 15:16:22]

#

Voin suositella David MacKayn mainiota kirjaa "Information theory, inference, and learning algorithms", jossa käsitellään mm. erilaisia verkkojen opetusmenetelmiä.

Kirja on saatavilla omaan käyttöön osoitteesta http://www.inference.phy.cam.ac.uk/mackay/itila/book.html

Vastauksia alkuperäiselle kysyjälle löytyy kappaleesta V.

goala [30.06.2009 17:46:23]

#

Luulisin, että tarvitset feedforward-tyyppisen verkon, jota sitten jatkuvasti evolvoit geneettisellä algoritmillä. Itse verkkohan on todella helppo hamottaa, vaikka C++::lla.

Luot vaikka Neuroni -luokan:

class Neuron
{
        public:
                Neuron();
                ~Neuron();

                ...

        private:
                double _weight;
                double _bias;
                double _delta;
};

ja näistä koostuville layereille (hidden):

class Layer
{
        public:
                Layer();
                ~Layer();

                ....

        private:
                std::vector<Neuron> _neurons;
};

Näihin joudut tietenkin tekemään vielä rajapinnat siihen, kuinka päästään
suoraan käsiksi weightseihin. Nyt voit uuden data pohjalta sitten käynnistää
geneettisen algoritmin tuunaamaan weightsi-dataa. Tarvitset tietenkin vielä sopivat crossover- ja selection funkkarit. Ja taas toisaalta, tähän tarvitaan vielä sopiva fitness-funktio, jotta homma toimisi.

Näin verkko "elää", eikä sun tartte tallentaa levylle muuta kuin itse verkko ja tietenkin ehkä oppimateriaali.

neau33 [30.06.2009 18:16:03]

#

Moikka Daih!

tsekkaa tämä

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta