sunnuntai 13. lokakuuta 2019

Mitä koneoppiminen on?


Olen todella innostunut tekoälystä! Ostin jokin aika sitten Humblebundlesta tekoälypaketin, ja miten innoissani siitä olenkaan! Harmi, ettei monta kirjaa voi lukea yhtä aikaa. Tai no oikeastaan kyllä luenkin. Ostamaani tekoälypakettiin kuuluu 16 kirjaa koneoppimisen  ja muiden tekoälyn osa-alueiden, kuten konenäön, toteuttamisesta Pythonilla ja muilla koodauskielillä. Suosittelen muuten tutustumaan Humblebundleen, siellä on monesti todella hyviä kirjapaketteja ja osa niiden hinnasta menee hyväntekeväisyyteen.  Tällä hetkellä inspiraationi kohdistuu koneoppimisen ja siihen liittyvää konenäön, neuroverkkojen (liittyy myös koneoppimiseen) ja ROS:in eli Robot operation systemin opettelemiseen, ja oman tekstiseikkailupelin tekemiseen Pythonilla. No, olen kaikki jo aloittanutkin, mutta pitää tehdä yhtä kerrallaan, nyt keskityn koneoppimiseen. 

Tämän blogitekstin lähteenä käytän kirjaa Artificial intelligence with Pyton: A comprehensive guide to building intelligent apps for Python beginners and developers (tekijä: Prateek Joshi). Käytän tämän ja muiden kirjojen harjoitusten tekemiseen Python 3:sta ja siinä NumPy, SciPy, scikit-learn ja matplotlib -kirjastoja. Käytän tällä hetkellä pythonia Spyderilla.


Tekoäly


Tekoälyn sovelluksia on mm. konenäkö, puheen tunnistaminen, tekstin tunnistaminen, pelit ja robotiikka. Tekoälyssä on myös useita tutkimisalueita, esimerkiksi koneoppiminen / kuvioiden tunnistaminen, logiikkaan perustuva tekoäly, etsimistekniikat, tiedon esittäminen (knowledge prestentation), suunnitteleminen, heuristiikka sekä geneettnen ohjelmointi. Iso osa tekoälyn tutkimuksesta keskittyy rationaalisten tekijöiden (agenttien) etsimiseen. Rationaalisuus viittaa kykyyn tehdä oikeita päätöksiä annetuissa olosuhteissa kun se suoritetaan niin, että tekijälle koituu siitä maksimaalinen hyöty. Tekijä käyttäytyy rationaalisesti, jos se suorittaa toimintoja saavuttaakseen päämäränsä tiettyjen annettujen sääntöjen mukaan, eli se havainnoi ja toimii saatavilla olevan informaation mukaan. Tekijän on tarkoitus olla älykäs ja riippumaton, eli se pystyy sopeutumaan muuttuviin olosuhteisiin. Sen tulisi tiedostaa ympäristönsä ja toimia tarkoituksenmukaisesti saavuttaakseen tuloksen, joka on sille hyödyllisin. Yksi tapa tuoda tekijälle älykkyyttä on käyttää dataa ja kouluttamista eli koneoppimista.

Koneoppiminen


Koneoppimisessa koneet ohjelmoidaan käyttämään nimettyä (label) dataa annetun ongelman ratkaisemisessa. Koneoppimista käytetään esimerkiksi kuvien tunnistamisessa, robotiikassa ja puheen tunnistamisessa. Käymällä läpi dataa ja siihen liitettyjä nimityksiä (labels, onkohan suomennos oikein), kone oppii huomaamaan kuvioita ja suhteita. Koska tietokoneet ovat hyviä datan analysoimisessa, ne pystyvät käyttämään oppimismalleja (learned models). Nämä mallit saavutetaan harjoituksen kautta, eli kone käy läpi useita syötteitä ja niitä vastaavia ulostuloja muodostaakseen mallin, mistä syntyy usein monimutkaisia matemaattisia malleja. Mutta koneoppimisessa ei tarvitse päätellä syntyvää matemaattista mallia, koska kone muodostaa sen datan perusteella. Tarvitsee siis vain luoda lista syötteistä (inputs) ja niitä vastaavista ulostuloista (outputs). Malli, jonka saamme, on siten suhde luokiteltujen syötteiden ja haluttujen ulostulojen välillä. 

Ohjattu ja ohjaamaton oppiminen 


Koneoppiminen jaetaan ohjattuun ja ohjaamattomaan oppimiseen, mutta muitakin jakotapoja on olemassa. Ohjatussa oppimisprosessissa mallin muodostaminen pohjautuu luokiteltuun (labeled) harjoitusdataan. Esimerkiksi jos haluamme rakentaa systeemin, joka automaattisesti ennustaa ihmisen tulotason pohjautuen moniin parametreihin kuten ikään, asuinpaikkaan, koulutustasoon jne, luomme tietokannan jossa on kyseiset parametrit ja luokittelemme / nimeämme (label) sen eli kerromme algoritmillemme, mitkä parametrien arvot vastaavat mitäkin tulotasoa. Algoritmi oppii sen avulla laskemaan henkilön tulotason pohjautuen sille annettuihin parametreihin.

Ohjaamaton oppiminen pohjautuu mallin rakentamiseen ilman luokiteltua harjoitusdataa. Koska luokitteluja ei ole saatavilla, käsitysten rakentaminen pohjautuu pelkästään annettuun dataan. Eli jos haluamme jakaa datan ryhmiin, emme tiedä jakamisen eli eri ryhmiin kuulumisen kriteerejä. Algoritmin tulee siis jakaa data ryhmiin parhaalla mahdollisella tavalla. 

Huom, en ole varma mikä suomennos olisi hyvä sanalle label, koska classification eli luokittelu on oma terminsä. Luokittelussa törmätään usein moneen nimeämiseen eli labeliin, jotka voivat olla joko numeroita, sanoja tai muuta. Sklearnigissa labelsien tulee olla numeroita, mutta usein ne ovat kuitenkin ihmisten luettavissa eli kirjaimina, jolloin ne tulee muuttaa numeroiksi käyttämällä label encodingia.

Mitä luokittelu on?


Luokittelu tarkoittaa tekniikkaa, jossa luokittelemme datan annettuihin luokkiin. Luokittelumalli pohjautuu harjoitusdataan, jossa on datapisteet ja niitä vastaavat luokittelut. Esimerkiksi jos haluamme tietää, onko kuvassa kissa vai koira, rakentaisimme harjoitusdatasetin, joka sisältäisi luokat sekä kissojen että koirien kuvista. Näiden harjoitusnäytteiden avulla malli koulutetaan. Näytteiden eli harjoitusdatan määrän tulisi kuitenkin olla iso, jotta vältytään harjoitusdatan ylisovittamiselta. Ylisovittaminen tarkoittaa sitä, että malli ei toimi hyvin tuntemattomassa datassa, koska se sovittautui liikaa pienen harjoitusdata kuvioihin. Eli malli tavallaan näkee kuvioita / malleja siinäkin, missä niitä ei välttämättä ole, ja luokittelee siten väärin.

Koneoppimisen algoritmien takia datan tulee olla muotoiltu tietyllä tavalla, ennen kuin harjoitus voidaan käynnistää. Dataa täytyy siis esikäsitellä ja muotoilla se oikeaan muotoon, mikä vie monesti paljon aikaa.
Esikäsittelyn tekniikoita on mm. binarisaatio (binarization), keskiarvon poistaminen, skaalaaminen ja normalisaatio. Binarisaatiossa numeeriset arvot muutetaan boolean arvoiksi, eli esimerkiksi kaikki arvot jotka ovat yli 1 merkitään ykköseksi, ja kaikki arvot jotka ovat alle 1 merkitään nollaksi. Keskiarvon poistamisessa piirrevektorin piirteet keskitetään nollaan. Tämä auttaa poistamaan vinoumaa. Note to self: tähän asiaan pitää perehtyä vielä tarkemmin. Skaalaamisessa piirrevektorin piirteet (features) skaalataan, koska ne voivat vaihdella paljonkin. Esimerkiksi maksimiarvoksi voidaan asettaa 1, ja muut arvot skaalataan siihen. Normalisaatiossa piirrevektorin arvot muokataan niin, että ne voidaa mitata yleisellä skaalalla (common scale). Esimerkiksi jokaisen rivin absoluuttisten arvojen summaksi voidaan asettaa 1, tai sitten neliöiden summaksi asetetaan 1.

Kerron erilaisista luokittelutekniikoista toisessa postauksessa. Kirjoitan myös jossain vaiheessa esimerkkejä siitä, miten koneoppimista voidaan käytännössä toteuttaa Python-koodilla. En vain ole varma, onko tekijänoikeuksien takia sallittua laittaa samaa koodia, jota on kirjan esimerkeissä, vaikka kertoisikin lähteen. Aiemman postauksen Sulautetut-kirjan tekijät olivat sanoneet toisessa kirjassaan, että koodia saa käyttää, jos kertoo lähteen. Pitää selvitellä, miten asia on näiden kirjojen kanssa! 

Suloinen Pepper-robottikin hyötyy tekoälystä!

Ei kommentteja:

Lähetä kommentti