Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Neuraaliverkot

Sivun loppuun

peki [26.07.2005 14:07:35]

#

Olen alkanut pohtia sinänsä mielenkiintoista aihetta, neuraaliverkkoja. Aihetta vähemmän tunteville sanottakoon, että niillä tarkoitetaan dynaamisesti muovautuvaa verkkoa, joka ottaa vastaan ulkopuolisia "ärsykkeitä" ja muodostaa uusia yhteyksiä niiden perusteella. Lopulta tiettyihin verkon soluihin kertyy valmista tietoa, joka voidaan hakea ja tulostaa sopivien muokkausfunktioiden avulla.

Itse olen miettinyt seuraavanlaisia toteutusmalleja (Kielenä tällä kertaa C/C++, mutta millä tahansa kielellä tämän voi toteuttaa.) Tietorakenne (luokka tai struct) sisältää viisi (tai minkä tahansa määrän) sisään -pointteria ja yhden ulos -pointterin. Nämä viittaavat soluihin, joihon kyseinen tietorakenne on linkattu. Solun ytimenä toimii ns. pool arvo, jota jokainen sisään linkattu solu saa kasvattaa sisäistä funktiota käyttämällä. Kun tämä arvo ylittää tietyn raja-arvon (kuten 3; funktiossa on tarkistus) kutsuu samainen funktio ulos -pointterin osoittaman structin sisäistä funktiota (tai osoitin voisi yhtähyvin olla funktio-osoitin), joka kasvattaa vuorostaan sen pool arvoa. Malli matkii suhteellisen tarkasti ihmisaivojen toimintaa.

Toinen ratkaisumalli on samankaltainen, mutta tyyliltään interatiivisempi. Jos taulukossa, joka sisältää solut, on esimerkiksi 50 000 solua, käydään erikseen silmukassa jokainen läpi ja siirrellään arvoja sen avulla.

Molemmissa malleissa on aluksi määriteltävä x määrä input ja output -soluja, joihin alkuperäinen data sijoitetaan ja joista valmis data saadaan. Tämän hetkinen ongelmani on kehittää sopiva kaava/algoritmi, jolla solut muuttavat/luovat välilleen yhteyksiä. Mistä mikäkin solu voi tietää, mihin yhteys pitäisi luoda? Tekniikkaa voi helposti soveltaa mm. oppivaan peliälyyn tai vaikka oppivaan IRC-bottiin. (jälkimmäinen Soodalle ;)

Olisiko kenelläkään mitään kommentoitava tai ideoita järkevään algoritmiin solujen välisten yhteyksien muodostamiseen?

mikeful [26.07.2005 15:38:11]

#

Itseänikin aihe kiinnostaa.

Kannattaa etsiä Quake2 DM-botti nimeltä "NNBot". Se on oppivat/koulutettava ja siitä on sorsatkin saatavilla, C++:lla tehty muistaakseni.

peki [26.07.2005 16:14:24]

#

http://members.fortunecity.com/gokouzwar/nnlearn.htm

NNbot - ainakin sen perusteella, mitä tuosta kuvauksesta sain irti - näyttäisi perustuvan suurilta osin sumeaan logiikkaan. (fuzzy logic) Sillä on tarkat toimintamallit joka tilanteeseen, joita se noudattaa pilkuntarkasti. "Enemy is above -> retreat" Se ei siis punnitse jokaista tilannetta erikseen, kuten monimutkaisempi aivojen kaltainen järjestelmä tekisi.

Kaikki neuraaliverkot, joihin olen törmännyt, ovat rakenteeltaan suhteellisen yksinkertaisia eivätkä käytännössä muistuta soluja. Esimerkiksi chatbotit perustuvat usein sanojen välisten relaatioiden tallentamiseen dynaamiseen taulukkoon. Ne eivät voi aloittaa keskustelua itse vaan vastaavat orjallisesti sanojen välisten relaatioiden mukaan. Mielestäni input/output soluista ja 100% dynaamisista solujen välisistä yhteyksistä saisi paljon enemmän irti.

Edit: max. 100 000 solua, joiden relaatiot tietokone voisi ehkä kerrallaan käsitellä reaaliajassa on tietenkin erittäin vähän ja tarjoaa mehiläisen tai kastemadon tasoista älyä. ;)

sooda [26.07.2005 19:11:50]

#

Muakin kiinnostaisi, mutten ole ehtinyt (lue: jaksanut) tutustua aiheeseen tarpeeksi jotta yhtään ymmärtäisin toimintaa :) voisikin tässä lähiaikoina googletella...

neau33 [26.07.2005 20:48:29]

#

"Toinen ratkaisumalli..."
Vaikka en asiaa oikeasti tunnekaan niin sanoisin, että sun ehkä kanattais miettiä, että mitä jos sisällyttäisi/kiinnittäisi siihen taulukon solurakennelman sisään jokaiselle solulle oman mikrotaulukkon joihin ohjelma pukkaisi dataa kulloinkin käytettävissä olevista vaihtoehdoista, joista solu voisi "haistella" sillä hetkellä järkevimmän <--> järjettömimmän vaihtoehdon skaalasta ja valita jotain.
Virheen sekä onnistumisen seurauksena pitäisi luonnollisesti olla oppiminen, joka tallentuisi muistiin, josta se voitaisiin kaivaa esiin ja pukata takas näihin mikrotaulukoihin joko rajaamaan tai laajentamaan valintojen mahdollisuutta. lisäksi ohjelman tulisi
näiden valintojen perusteella kyetä itsenäisesti muodostamaan ja 'suorittamaan' funktioita ainakin rajallisesti.
Soluilla itsellään pitää luonnollisesti olla jokin ennalta määrätty tehtävä, jonka sä olet niille antanut "äidinmaitona"...

Lohdutuksena sanoisin että funktioita tuut näkeen unissasikin...

Tuura [26.07.2005 21:41:29]

#

voisitko neau33 vähän avartaa mua, kun en meinaa saada yhtään selvää viestistäsi

peki [26.07.2005 21:48:53]

#

neau33 kirjoitti:

että mitä jos sisällyttäisi/kiinnittäisi siihen taulukon solurakennelman sisään jokaiselle solulle oman mikrotaulukkon joihin ohjelma pukkaisi dataa kulloinkin käytettävissä olevista vaihtoehdoista,

Miksi ihmeessä? Pointterit, jotka säilövät yhteydet muihin soluihin vastaavat tätä ja kuluttavat vähemmän muistia. Linkitetty lista on myös taulukoita dynaamisempi.

neau33 kirjoitti:

joista solu voisi "haistella" sillä hetkellä järkevimmän <--> järjettömimmän vaihtoehdon skaalasta ja valita jotain.

Mitenköhän solu haistelisi jäkevintä ja järjettömintä vaihtoehtoa ilman sumeaa logiikkaa (fuzzy logic), jota en tahdo tähän sotkea. Ihmisen aivot, joita käytän referenssinä, toimivat eliminoimalla tarpeettomia (syntyneet sikiöaikana) ja vahvistamalla tarpeellisia yhteyksiä impulssien, joita ulkopuoliset ärsykkeet luovat, perusteella. Sumealla logiikalla ei loppupeleissä mihinkään päästä, sillä tulos on aina looginen ja alkuperäisesti ohjelmoitu.

neau33 kirjoitti:

Virheen sekä onnistumisen seurauksena pitäisi luonnollisesti olla oppiminen, joka tallentuisi muistiin, josta se voitaisiin kaivaa esiin ja pukata takas näihin mikrotaulukoihin joko rajaamaan tai laajentamaan valintojen mahdollisuutta.

1. Määrittele lihavoidut sanat millä tahansa tietokonekielellä ilman sumeaa logiikkaa.
2. Kursivoitu alue on sumean logiikan alue. (edit: voipi käsittää kahdella tavalla :)

neau33 kirjoitti:

lisäksi ohjelman tulisi
näiden valintojen perusteella kyetä itsenäisesti muodostamaan ja 'suorittamaan' funktioita ainakin rajallisesti.

Kertokaa joku minulle, miten muodostan funktioita reaaliajassa. Alanko muuttelemaan ohjelman binaaria lennosta? Menee vähän utopistiseksi, jos alan kehitellä uutta ohjelman sisäistä skriptikieltä. Eikös funktioiden älykkääseen rakentamiseen lennosta vaadita ihmisen tasoista älyä... ...joka lienee suhteellisen kaukana nykyisten neuraaliverkkojen tasosta? Kyllä tässä nyt siihen kastematoon pyritään. :P

neau33 kirjoitti:

Soluilla itsellään pitää luonnollisesti olla jokin ennalta määrätty tehtävä, jonka sä olet niille antanut "äidinmaitona"...

Alkuosa lienee triviaalia kaikille.. ..jopa minulle.
Kursivoitu osa lienee jokseenkin typerä huomautus.

neau33 kirjoitti:

Lohdutuksena sanoisin että funktioita tuut näkeen unissasikin...

What can I say? Taso heikkenee loppua kohti. Kyllä tässä nyt biologiseen malliin pyrin perinteisen funktio-sub-kontrollerimuuttujien sijaan. :)

Edit: Eiköhän jatkettaisi keskustelua kunnolla?

neau33 [26.07.2005 22:49:03]

#

Moi guruista guruin!!!
Mitä on ihmisen reaaliaika ja kuinka kauan sä yleensä kulutat aikaa muodostaessasi funktioita tai tehdessäsi valintoja...ennen kuin sä oot oppinut ne tai ne on sulle opetettu kysyn vaan, lyö sit sun ohjelmas täyteen valmista kamaa, mutta ei sillä mitään tekemistä minkään älyn kans ole!!!

Hae sit täältä jos sä haluut jotain valmiita malleja tutkittavakses...
http://www.aimlearning.com/?OVRAW=neural network&OVKEY=neural network&OVMTC=standard
Edit: eli pura se mitä sä saat impatuks

Grey [26.07.2005 22:51:40]

#

Aloinpa tässä muistelemaan mitä itse tiedän tästä aiheesta, ja oppimisesta oikeassa elämässä. Ensiksi on vaistot, jotka ovat perustietoisuus mitä on. Sitten on kyky oppia ja tieto minkä kautta opitaan uusia asioita. Tietoisuus ei ole oppimisen kannalta tärkeä, mutta tietoisuuden avulla voidaan esim. miettiä elämäntarkoituksia. Pelkkä vaisto pyrkii toteuttamaan ennaltamäärättyjä asioita.

Näin ollen, tälläiselle ohjelmalle kannattaa antaa jotkut peruskäskyt ensin, minkä jo tosin tiesitkin, eli vaiston, joka kertoo sen miten ohjelma käyttäytyy ja mitä se tahtoo oppia, tai ylipäätänsä mikä on ohjelman olemassaolon tarkoitus. Mitä se tekee, mitä se oppii ja minkä tiedon se hylkää.

Tosin, tämä kenties muistuttaa liikaa sumeaa logiikkaa, mutta jos et ole halukas selvittämään tietoisuuden periaatteita, kannattaa pysyä sumeassa logiikassa. Tietoisuus kun on sen vertaa helkutinmoinen kokonaisuus, että sen koodauksessa voisi mennä turhan pitkä aika. Jos katsot mitenkä lajikehitys on mennyt, niin saat siitä jonkinlaisen kuvan millainen aika mahdollisesti sinulla menisi koodauksessa ;-)

-Grey-

Metabolix [27.07.2005 12:38:21]

#

Ohjelma tosiaan tarvitsee jotakin, mistä se näkee, oliko tulos hyvä vai huono. Tosimaailmassa ihminen oppii sen ympäristöstä, kastemadolle se on synnynnäistä. Koska ympäristöstä oppiminen vaatii aika paljon (ainakin mutkikkaan analyysin siitä, mikä noista 100000 solusta oli se, jonka takia päädyttiin väärään tulokseen), voi olla jossakin määrin helpompi tehdä ensin se versio, jossa väärin valinneet kuolevat ja oikein valinneet risteytetään (aavistuksen satunnaisesti tai painotetusti). Jos et pysty määrittelemään jotakin funktiota, joka lopputuloksesta kertoo, onko se hyvä vai huono, joudut ainakin aluksi itse valitsemaan. Luulisin, että opettamisvaiheessa on pakko tyytyä sumeaan logiikkaan tai omaan intuitioon.

Kastemadon maailmassa kehitys voi päättyä siihen, että lopulta kastemadon äly käskee kaivautua heti, jos näkyy valoa, koska pinnalla olevat kastemadot kuolevat helpommin. Oikeasti ihmisen tavoin tietoiseen olentoon tarvitaan niin paljon soluja, ettei reaaliaikainen laskeminen onnistu ainakaan ihan kotikoneella. Jonkin muun eläimen (koiran, marsun) tasoa voisi vielä yrittää simuloida. Tuon tason eläimillä oppiminen perustuu varmaankin hyvin pitkälti omiin tuntemuksiin (kipuun, nälkään, hyvän olon tunteeseen), joiden perusteella voi päätellä, oliko ratkaisu oikea. Tietenkin tulee vastaan tilanteita, joissa esimerkiksi kipua ei voi välttää, ja tällaisista voi usein seurata aivan vääriä johtopäätöksiä (niin neuroverkossa kuin oikeastikin). Kun jossittelun kyky puuttuu, ei voi nähdä, että kaikki muut vaihtoehdot olisivat olleet huonompia. Mutta tällaisetkaan älyt eivät pysty itse itseään kehittämään; ne toimivat ja oppivat ympäristön vaikutuksesta.

No, kadotin jo itsekin punaisen langan, mutta varmaan tuosta joku vähemmän aivoja tunteva saa jotakin irti :)

Kuitenkin, jonkinlainen lähtötilanne on oltava. Kannattaa varmaankin aloittaa mahdollisimman yksinkertaisesta älystä ja selkeästä tavoitteesta (mihin älyn pitäisi pystyä). Tekeminen voi olla työlästä. Kaiken kaikkiaan parhaat vaihtoehdot ovat varmaankin se, että kerrot itse, oliko ratkaisu hyvä, ja se, että luot sumealla logiikalla toimivan ympäristön, johon älysi yrittää sopeutua. Jos äly on mutkikas, jälkimmäinen vaihtoehto voi olla jopa vähemmän työläs.

Toiseksikin, pitäisi tietää tarkalleen, mitä älyltään haluaa. Mitään aivan yleispätevää älyä ei kannata lähteä rakentamaan neuroverkkona, vaikka kyllähän sekin onnistuu (johonkin syötesoluun syötetään se, mitä halutaan tehdä, ja se sitten tarvittaessa estää etenemisen muihin suuntiin).

Ensimmäinen idea: Jos haluat saada kaikki mahdolliset yhteysideat käyttöön, voit ehkä aluksi jatkaa syötettä vaikkapa (pienessä älyssä) kaikkiin muihin soluihin tai (isommassa) tiettyyn määrään jatkosoluja ja suoraan näiden jatkosoluihin (eli yhteensä x+x*x yhteyttä, jolloin voi ehkä selvitä kannattavaksi ohittaa jokin tietty solu kokonaan. Jälkimmäistä voisi yrittää pitää yllä myöhemminkin, se voisi muuttaa älyn kehitystä.

Toinen idea: Älä juutu liikaa aiempiin neuroverkon sääntöihin (niillä tulee nähdäkseni aika paljon juuri tuollaisia aavistuksen sumeaa logiikkaa muistuttavia älyjä). Tee uusia omituisia kokeiluja. Voit vaikkapa lisätä johonkin väliin solun, vetää siihen ja siitä muutamia mielivaltaisia yhteyksiä ja arpoa sille sopivat alkuarvot. Sitten voit vielä yrittää yhteyksien painoarvojen muuttamisen lisäksi muuttaa itse solujenkin toimintaa älyn kehittyessä. Vaikkapa laskea tai nostaa reagointirajaa vähitellen. Mistään et voi oikeastaan tietää, mikä kannattaa. Se pitää juuri noilla oppimismenetelmillä kokeilla. Voi olla hyvä idea ajaa sama syöte uudestaan muutosten jälkeen ja katsoa, auttoivatko ne asiaa.

Kolmas idea: Siirrä silmukan joka kierroksella tilannetta vain yksi solu eteenpäin. (Vaikka tekstistäsi voikin tavallaan lukea, että juuri näin aioitkin toimia.) Eli tavallaan jokainen solu on olemassa kahtena kappaleena, joista taulussa A olevasta luetaan ja taulussa B olevaan kirjoitetaan, ja kierroksen lopuksi taulu B kopioidaan tauluun A. En tiedä, mitä tästä sitten käytännössä tulisi... Kaaos, ehkäpä. Tämä systeemi ainakin voisi saada aikaan hyvin ihmismäistä käytöstä. Silmukan voisi lopettaa siinä vaiheessa, kun yhdenkään solun tila ei muutu. Toisaalta tällaista systeemiä voisi ehkä käyttää aidon älyllisyyden matkimiseen, eli joka kierroksen jälkeen päivitettäisiin uudet arvot sisääntulosoluihin ja ulostuloista saataisiin sen hetken toiminnat. Voin jo valmiiksi ennustaa, että tähän tarvittaisiin melkoinen numeronmurskaaja. Kierrosten määrän sekunnissa voisi määrittää niin, että syötearvoja vastaavat ulostuloarvot tulisivat ulos 0,1 - 0,5 sekunnin kuluttua (sillä välillähän se normaali ihmisen reaktiokyky on).

Neljäs idea: Kannattaa varmaankin kehittää jokin tiedostorakenne, johon tallennat koko verkon. Sitten, kun on saatu aikaan jonkinlainen "hyvä" lähtötilanne, voi olla kannattavaa siirtyä linkitetyistä listoista dynaamisiin taulukoihin.
(int Maara, solu ** Taulu, realloc; dynaaminen muistinhallinta lienee tuttu juttu.)

Lopuksi varmaankin kannattaa vielä mainita, että vaikka korkeamman tason teoriapuoli onkin jossakin määrin hallussa, matalammalla tasolla minun käytännön neuroverkko-osaamisellani saa ehkä hädin tuskin tehtyä verkon, jossa on kaksi sisääntuloa ja yksi ulostulo ja joka oppii tarpeen mukaan and-, or- tai xor-operaation.
(Huh huh. Taitaakin olla pisin viestini.)

mikeful [27.07.2005 13:46:36]

#

Selailin läpi taas tämän keskustelun ja näyttää siltä, että pekillä on jäänyt tekoälynsä tarkoituksen ja tehtävän määrittely kesken. Mieti minkälaisessa ympäristössä tekoälysi tulee toimimaan ja mitä sen pitää tehdä. Et voi tehdä vain yleispätevää älyä, heittää sille arvoja ja katsoa mitä tulee ulos. Erilaisiin tehtäviin toteutetaan tekoäly eri tavalla.

peki [27.07.2005 17:23:16]

#

mikeful: alkuperäinen tarkoitukseni oli tehdä yksinkertainen neuroverkkoja käyttävä framework, jota voi laajentaa eri tarkoituksiin. (neuroverkkohan käytännössä on tyhjä verkosto, joka luo uusia yhteyksiä sääntöjen mukaan)

Metabolix: Erittäin hyviä ideoita. Kiitoksia. :) Kolmannen ideasi tavoin olin kutakuinkin alkuperäisesti suunnitellut toimivani. (ehkä oliopohjaisemmin :) Tämän takia puhuin kastemadon tai mehiläisen tasosta. Evoluutioon perustuvaa alustusta voisi myös miettiä. Voisin arpoa vaikka 1000 erilaista yhteysverkostoa ja katsoa, mikä selviää parhaiten sekä ristetyttää parhaimmat. Alustuksen tapahduttua voisi alkaa soveltamaan sääntöjä, karsia tarpeettomia yhteyksiä ja vahvistaa tarpeellisia.

neau33 [27.07.2005 17:40:32]

#

Hei taas peki!

Are you still thinking that the following phrase:
joko rajaamaan tai laajentamaan valintojen mahdollisuutta.
has completely different meaning than the phrase below:
karsia tarpeettomia yhteyksiä ja vahvistaa tarpeellisia.

- replace worst
- replace best
- replace parent
- replace random
- replace most similar
...and so on...

Metabolix [27.07.2005 19:07:44]

#

Kyllä se on aika lailla eri asia. Ei millään pahalla, mutta ehkäpä kannattaisi jättää osallistumatta keskusteluun, jos itsekin tunnustaa, ettei tiedä aiheesta yhtikäs mitään :) Yritetään nyt pitää tämä ohjelmointikeskusteluna eikä chattina.

Kerro ihmeessä, peki, jos saat jotakin aikaan. Katsoisin mielelläni lopputulosta (keskeneräistäkin).

neau33 [27.07.2005 20:05:12]

#

Hei Metabolix!

Voi olla, että tää juttu eteneekin vielä kivasti, ainakin peki on saanut ulkopuolisia ärsykkeitä ja voi karsia tarpeettomia juttuja sen mukaan mikä tuntuu luontevalta...

-Nea-

Ps. Onnea pekille!


Sivun alkuun

Vastaus

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

Tietoa sivustosta