Oletko koskaan miettinyt, miten tietokone pystyy tunnistamaan kuvia, miten sosiaalisen median palvelut pystyvät kohdentamaan mainontaansa jokaiselle käyttäjälle erikseen tai miten asikaspalvelussa vastaava sovellus osaa ohjata asiakkaan oikealle asiakaspalvelijalle muutaman puhutun avainsanan perusteella? Äskeiset esimerkit ovat ongelmia, jotka ovat ihmiselle kohtalaisen helppoja ratkaistaviksi, sillä jo pieni lapsi osaa erottaa kuvasta onko kyseessä kissa vai koira. Miten sitten tietokone, joka loppujen lopuksi osaa laskea vain kaksi lukua yhteen, pystyy ratkaisemaan tämän ongelman? Vastaus tähän ovat erilaiset koneoppimisalgoritmit, joiden ideana ei ole opettaa tietokoneohjelmalle suoraviivaisia sääntöjä, kuten “jos kuvassa näkyy viiksikarvoja, kyseessä on kissa”, vaan opettaa tietokoneohjelmaa näyttämällä sille paljon erilaisia esimerkkejä. Tällöin opetus tapahtuu muodossa “tämännäköisessä kuvassa on kissa, mutta tämännäköisessa kuvassa onkin koira”. Menetelmä on varsin toimiva, sillä oikeassa maailmassa asioiden väliset riippuvuudet eivät ole usein suoraviivaisia: kissan lisäksi myös ihmisellä tai mursulla voi olla viikset.
Olen viimeiset pari kuukautta lukenut ja kokeillut iltaisin neuroverkkoja käsitteleviä materiaaleja. Neuroverkot ovat yksi tapa toteuttaa yllä kuvattu koneoppiminen. Neuroverkkojen teknisistä yksityiskohdista kiinnostuneille suosittelen ilmaista kirjaa Neural networks and deep learning. Varsinaisen ohjelmointiin olen käyttänyt Python-kielelle löytyvää PyBrain-pakettia, mutta neuroverkkoimplementaatiot löytyvät myös monelle muulle ohjelmointikielelle.
Neuroverkkojen ideana on alun perin ollut matkia aivojen hermosolujen muodostamaa verkostoa. Siinä missä hermosolu toimii kemiallisesti syntyvien varauserojen avulla, neuroverkkojen neuronien sisälle on kätketty kohtalaisen yksinkertaisia matemaattisia malleja. Kokonainen Neuroverkko koostuu monesta yksittäisestä neuronista, jotka ovat kytkettyinä toisiinsa. Jokainen neuroni pystyy ottamaan vastaan tietoa ja lähettämään sitä ulos. Yksinkertaisen neuroverkon voi koostaa esimerkiksi kolmesta neuronista, jotka näkyvät allaolevassa kuvassa. Ensimmäinen neuroni on niin sanottu sisäänmenoneuroni ja viimeinen ulostuloneuroni. Kaikki varsinainen laskenta tapahtuu keskimmäisessä neuronissa. Tässä yksinkertaisessa esimerkissä halutaan, että kun sisäänmenoneuroniin laitetaan jokin luku a tulee ulostuloneuronista ulos luku -a eli sisään laitetun luvun vastaluku. Kun tämä kolme neuronia sisältävä verkko on luotu, se pitää opettaa tähän syöttämällä sisäänmenoneuroniin paljon erilaisia lukuja ja vaatia, että ulostulon on oltava sisäänmenoluvun vastaluku. Tässä piilee koko konseptin vaikeus. Erilaisia neuroverkkojen opetusalgoritmeja on lukuisa määrä, eikä ole aina selvää mikä algoritmi toimii minkäkinlaiseen tehtävään. Tämän lisäksi neuroverkon rakenteella ja neuronien sisäisillä matemaattisilla ominaisuuksilla on lopputuloksen kannalta väliä.
Kolmen neuronin esimerkkimme on vielä kohtalaisen helppo opettaa antamaan sisään menevän luvun vastaluku. Kuitenkin jo kohtalaisen yksinkertaisissa opetustapahtumissa voi törmätä ongelmiin. Alla olevassa kuvassa on esimerkki ensimmäisistä yrityksistäni opettaa neuroverkkoa laskemaan jonkin luvun neliö eli korottamaan luku toiseen potenssiin. Tässä tapauksessa ei siis yritetä löytää hyvää sovitusta pisteisiin käyttämällä tilastollisia menetelmiä, kuten pienimmän neliösumman sovitusta, vaan yritetään opettaa neuroverkkoa kertomalla sille toistuvasti “Jos annan luvun 2, haluan, että palautat luvun 4. Jos taas annan luvun 5, haluan, että palautat luvun 25” ja niin edelleen. Kuten kuvasta näkee, opettaminen yksinkertaisella opetusalgoritmilla onnistuu nopeassa ajassa, kun neuroverkkoa opetetaan laskemaan vain lukujan -2 ja 2 tai -5 ja 5 välillä. Lukujen -10 ja 10 välillä luvun neliön laskemisen opettaminen vaatii jo huomattavasti enemmän aikaa, tai lopputulos on kuvan mukainen.
Kaikista hankaluuksista huolimatta koneoppimisalgoritmit ovat äärettömän hyödyllisiä niin teollisuudessa kuin tutkimuksesakin. Tiedän neuroverkkoja sovellettavan nykyään monilla aloilla, joista esimerkkeinä mainittakoon alkeishiukkas- ja aerosolifysiikan tutkimusalat. Omana salaisena tavoitteenani koneoppimiseen liittyen on ohjelmoida tietokoneohjelma, joka pystyy muokkaamaan itseään jonkin satunnaisen ohjelmointiongelman ratkaisemiseen. Sitä varten on luettava vielä monta kirjaa ja tehtävä monta harjoitusta.
Vastaa