Näytetään tekstit, joissa on tunniste tekoäly. Näytä kaikki tekstit
Näytetään tekstit, joissa on tunniste tekoäly. Näytä kaikki tekstit

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ä!

sunnuntai 6. toukokuuta 2018

Neuroverkoista - perseptronit ja sigmoid-neuronit


Olen kurssilla Johdatus tekoälyn taustalla olevaan matematiikkaan, ja siitä innostuneena päätin kirjoittaa hieman neuroverkoista. Todella mielenkiintoinen aihe ja kurssi! Olen jo pitkään haaveillut tekoälyyn liittyvistä kursseista, ja vihdoin se toteutui! Opin paljon paremmin silloin, kun kirjoitan aiheesta, joten päätin kirjoittaa tänne blogiini. Teksti on melko suoraan otettu sivulta http://neuralnetworksanddeeplearning.com/chap1.html, jota kurssilla tulee lukea. Kiinnostuneet voivat siis tutkailla aihetta enemmän sieltä! Sivusto on ilmainen nettikirja, mikä on todella hienoa. En siis väitä näitä tekstejä tai esimerkkejä omikseni, kaikki on kyseiseltä sivulta oppimistarkoituksessa suomennettuna. Olen ottanut myös hieman infoa kurssini luentomonisteesta, eli Jyväskylän yliopiston Johdatus tekoälyn taustalla olevaan matematiikkaan -kurssin Tim-sivuilta. P.s. jos tiedätte paremman suomennoksen jollekin termille, saa vinkata! :)

NEUROVERKOT


https://3c1703fe8d.site.internapcdn.net/newman/gfx/news/hires/2017/algorithmlev.jpg


Ihmisillä on näköaivokuoressa 140 miljoonaa hermosolua, joiden välillä on kymmeniä miljardeja yhteyksiä. Silti ihmisen näköön ja kuvien prosessointiin tarvitaan monia muitakin näköaivokuoria. Käsinkirjoitettujen numeroiden tunnistaminen ei siis ole helppoa, ja se tapahtuu ihmisillä alitajuisesti.

Visuaalisten kuvioiden tunnistamisen vaikeus tulee esille silloin, kun täytyy kirjoittaa tietokone-ohjelma, joka tunnistaisi käsinkirjoitettuja numeroita. Vaikka tunnistaminen on meille helppoa, se on todella vaikeaa ohjelmille. Ei ole helppoa ilmaista algoritmisesti muotojen tunnistamista. Esimerkiksi numerossa 9 tunnistamisen ohje voisi olla: "Numerossa 9 on silmukka ylhäällä ja pystysuuntainen veto oikealla alhaalla".

Neuroverkot lähestyvät ongelmaa eri tavalla. Ideana on ottaa suuri määrä käsinkirjoitettuja numeroita harjoitusesimerkkeinä ja kehittää siitä systeemi, joka voi oppia kyseisistä esimerkeistä. Toisin sanoen neuroverkko käyttää esimerkkejä apunaan tehdäkseen automaattisesti johtopäätöksiä, jotta se voi tunnistaa käsinkirjoitetut numerot. Mitä enemmän harjoitusesimerkkejä on, sitä paremman tarkkuuden verkko voi oppia käsinkirjoitetuista numeroista.

Keinotekoisia neuroneja on kahta tyyppiä, perseptroni (perceptron) ja sigmoid-neuroni (sigmoid neuron). Standardi oppimisalgoritmi neuroverkkoihin on stokastinen gradienttimenetelmä (stochastic gradient descent).

PERSEPTRONIT


Yksi keinotekoinen neuroni on perseptroni. Frank Rosenblatt kehitti perseptoronit 1950- ja 1960-luvulla Warren McCullochin ja Walter Pittsin töiden innoittamana. Nykyisin käytetään tavallisesti toisenlaisia keinotekoisten neuronien malleja, yleisesti sigmoid-neuroneja. Jotta voi kunnolla ymmärtää, miksi sigmaneuronit määritetään niin kuin ne määritetään, on hyvä ymmärtää perseptroneja.

Perseptroniin syötetään useita eri binäärisiä syötteitä (inputeja), ja se tuottaa yhden binäärisen ulostulon (outputin). Ulostulo, joka on arvoltaan 0 tai 1, lasketaan syötteiden painotuksien summan ∑jwjxj  avulla. Painotuksien summan tulee olla yli tai alle jonkin tietyn raja-arvon.

output = 0 jos ∑jwjxj ≤ threshold

output = 1 jos ∑jwjxj > threshold


Perspetronia voi ajatella laitteena, joka tekee päätökset painottamalla eri asioita. Esimerkiksi jos viikonloppuna on festarit, saatat painottaa eri asioita päättääksesi, menetkö sinne vai et. Päätökseen voi vaikuttaa 3 tekijää:

1. Millainen sää on 
2. Haluaako ystäväsi tulla mukaan 
3. Onko festivaaleille helppo päästä julkisilla kulkuvälineillä. 

Päätöksentekoa voi helpottaa mallintamalla sitä perseptroneilla. Näitä kolmea yllä mainittua tekijää voi vastata muuttujat x(sää), x(ystävä)ja x(julkinen liikenne). x1:n arvo voi olla 1, jos sää on hyvä ja 0, jos sää on huono. x2:n arvo voi olla 1, jos ystävä haluaa tulla mukaan ja 0, jos hän ei halua tulla mukaan. x3:n arvo on 1, jos festareille pääsee bussilla ja 0, jos sinne ei pääse bussilla. 

Eri tekijöille voi antaa erilaisia painotuksia. Pidät festareista niin kovasti, ettei päätöksentekoon vaikuta kovin paljon se, tuleeko ystäväsi mukaan vai ei tai se, onko sinne helppo päästä. Näissä painotukset ovat siis pienet ( w1 = 2 ja w3 = 2). Mutta et todellakaan haluaisi olla siellä sateessa, joten sää painaa vaakakupissa enemmän kuin seura ( w2 = 6). Valitset lopuksi perseptronin raja-arvoksi numeron 5. Näillä valinnoilla perseptroni toteuttaa päätöksenteon mallinnuksen tuottamalla ulostulon 1 jos sää on hyvä ja 0, jos sää on huono. Tulokseen ei vaikuta paljoakaan se, onko ystävä tulossa mukaan tai pääseekö sinne bussilla.

Painotuksia ja raja-arvoa muuttamalla saadaan erilaisia päätöksenteon malleja. Jos esimerkiksi raja-arvo olisi 3, halukkuus festareille menemiseen kasvaisi. Perseptronit voivat siis punnita erilaisia tekijöitä tehdäkseen päätöksiä. Mitä mutkikkaampia verkostoja, sitä hienovaraisempia päätöksiä tulisi.

Kuva on otettu osoitteesta http://neuralnetworksanddeeplearning.com/images/tikz1.png


Perseptroneja voi olla eri kerroksissa. Jokainen uusi kerros voi tehdä monimutkaisempia päätelmiä, koska se painottaa aiemman kerroksen syötteitä. Perspetronin kuvausta voidaan yksinkertaistaa esimerkiksi korvaamalla raja-arvo vaikotermillä (bias, b). En mene tässä postauksessa kovin paljon syvällisemmin matematiikkaan, kiinnostuneet voivat katsoa sitä alkuperäiseltä sivulta http://neuralnetworksanddeeplearning.com/chap1.html. Vakiotermi kertoo, miten helppo perseptronin on saada arvo 1, eli miten helppoa perseptronin on aktivoitua. Suurella vakiotermillä perseptronin on todella helppo tuottaa ulostulo 1.  Jos b on hyvin negatiivinen, perseptronin on vaikea saada arvoa 1.

Perseptroneja voidaan käyttää myös laskemaan loogisia funktioita, kuten AND, OR ja NAND-funktioita. NAND-portilla voi laskea mitä tahansa loogisia funktioita, koska se on universaali. Perseptronit ovat tavallaan vain uusi tyyppi NAND-porteista. 

Oppimisalgoritmien avulla voidaan kuitenkin automaattisesti säätää keinotekoisten neuroverkkojen painotuksia ja vakiotermejä. Kyseinen säätäminen tapahtuu vasteena ulkoiseen ärsykkeeseen ilman, että ohjelmoija vaikuttaa siihen suoraan. Oppimisalgoritmien avulla keinotekoisia neuroneja voidaan käyttää tavalla, joka on erilainen verrattuna loogisiin portteihin. Neuroverkot voivat oppia ratkaisemaan ongelmia, jotka olisi vaikea pala perinteisille virtapiireille, esimerkiksi loogisille porteille. Perseptronin ongelmana kuitenkin on, että pienet muutokset painotuksissa tai syötteissä aiheuttavat ison muutoksen tuloksessa (0 /1).


SIGMOID-NEURONIT


Miten oppimisalgoritmeja voi suunnitella neuroverkoille? Olkoon meillä perseptronien verkosto, jota haluaisimme käyttää ongelmanratkaisuun. Syötteet voivat olla esimerkiksi raakapikselidataa skannatusta, käsinkirjoitetusta numeron kuvasta. Verkoston halutaan oppivan painotukset ja vakiotermit niin, että verkoston ulostulo luokittelee luvut oikein. Jotta näemme, miten oppiminen voisi toimia, teemme pienen muutoksen joihinkin painotuksiin tai vakiotermeihin. Tämän pienen muutoksen painotusten suuruudessa tulisi muuttaa ulostuloa vain hieman. Verkosto voisi esimerkiksi virheellisesti luokitella numeron 8 numeroksi 9, jolloin voisimme selvittää, miten tehdä pieniä muutoksia painotuksiin ja vakiotermeihin, jotta verkosto osaisi paremmin luokitella kuvan numeroksi 9. Tätä toistettaisiin niin kauan, kunnes ulostulo olisi parempi, eli verkosto oppisi.

Näin ei kuitenkaan tapahdu, kun käytetään perseptroneja. Perseptroneja käytettäessä pienet muutokset painotuksessa tai vakiotermissä voi aiheuttaa verkon ulostulon ”flippaamisen” radikaalisti esimerkiksi nollasta ykköseen. Esimerkiksi 9 voidaan muutosten jälkeen tunnistaa oikein, mutta muiden kuvien tunnistaminen olisi tällöin luultavasti muuttunut vaikeasti kontrolloitavaksi. Tällöin on vaikea huomata, millä tavalla kannattaa vähitellen muokata painotuksia ja vakiotermejä, jotta verkosto pääsisi lähemmäksi haluttua lopputulosta. Ei siis ole täysin selvää, miten perseptronien verkko voidaan saada oppimaan.

Ongelma ratkeaa uuden tyyppisten keinotekoisten neuronien,  sigmoid-neuronien, avulla. Ne ovat samanlaisia kuin perseptronit, mutta pienet muutokset niiden painotuksissa ja vakiotermeissä aiheuttavat vain pienen muutoksen niiden ulostuloon. Se on tärkeä tekijä  sigmoid-neuronien kyvyssä oppia.

Kuva otettu osoitteesta http://neuralnetworksanddeeplearning.com/images/tikz11.png


Sigmoid-neuroneilla on sisääntulo, mutta ykkösen ja nollan sijaan ne voivat olla mitä tahansa arvoja 0:n ja 1:n väliltä. Sigmoid-neuroneilla on jokaiselle sisääntulolle painotus ja vakiotermi, mutta ulostulo ei ole 0 tai 1, vaan sigmoid-funktio σ(wx+b), joka määritellään σ(z)≡    1 / 1+e−z

Sigmoid-neuronin ulostulo syötteillä x1, x2,..., painotuksilla w1, w2,..., ja vakiotermillä b on

1 / 1+exp(−∑jwjxj−b)


Perseptronien ja sigmoid-neuronien väillä on kuitenkin monia yhtäläisyyksiä, sillä sigmoid-funktion algebrallinen muoto on lähinnä tekninen yksityiskohta. Havainnollistetaan sigmoid-funktion samankaltaisuutta perseptronimallin kanssa: olkoon z≡wx+b jokin suuri positiivinen luku. Tällöin e−z ≈ 0 ja σ(z) ≈ 1. Eli kun  z = w * x + b on suuri ja positiivinen luku, sigmoid-funktio on noin 1, kuten perseptronissa. Mutta jos z = w * x + b on hyvin negatiivinen, e−z → ∞ ja σ(z) ≈ 0, eli ulostulo on 0. Eli kun z = w * x + b on hyvin negatiivinen, sigmoid-neuronin käyttäytyminen on myös lähellä perseptronin käyttäytymistä. Vain silloin, kun z = w * x + b on maltillisen kokoinen, sigmoid-neuroni poikkeaa perseptronin mallista.

Sigmoid-funktion huono ominaisuus on se, että se kasvaa hyvin hitaasti kun x kasvaa ja vähenee hyvin hitaasti kun x vähenee. Sen derivaatta on hyvin lähellä nollaa kun x on suuri tai pieni. Tästä seuraa ongelmia, kun verkkoa opetetaan derivaattoihin perustuvilla menetelmillä. Koska virhefunktion osittaisderivaatat neuronin painotuksien ja vakiotermien suhteen riippuvat aktivointifunktion derivaatasta, ja painotuksien ja vakioiden muutokset koulutettaessa ovat pieniä jos osittaisderivaatat ovat pieniä, verkko oppii hitaasti. Toinen sigmoid-funktion huono puoli on se, että se ei ole symmetrinen nollan suhteen. Nykyisin sitä käytetään lähinnä ulostulokerroksessa varsinkin jos verkon tulokset ovat välillä [0,1][0,1].

HERMOVERKKOJEN ARKKITEHTUURI


Kuva otettu osoitteesta http://neuralnetworksanddeeplearning.com/images/tikz11.png


Vasemmanpuoleisin kerros on syötekerros (input layer), jossa olevat hermosolut ovat syöteneuroneja (input neurons). Oikeanpuolimmaisin ulostulokerros (outputlayer) sisältää ulostuloneuronit (output neurons), joissain tapauksissa vain yhden. Keskimmäinen kerros on piilokerros (hidden layer), koska siinä olevat neuronit eivät ole syötteitä tai ulostuloja. Jos piilokerroksia on useita, niitä kutsutaan joskus perseptronien monikerrokseksi eli MLP:ksi, vaikka siinä olisikin sigmoja.

Syötekerroksen ja ulostulokerroksen verkon suunnittelu on yleensä suoraviivaista, mutta piilokerrosten suunnittelu on usein melkoista taiteilua: ei ole peukalosääntöjä, joilla niitä voisi suunnitella. Piilokerrosten suunnittelussa käytetäänkin apuna heuristiikkaa.

Eteenpäin kytketyiksi verkoiksi (feedforward neural networks) kutsustaan neuroverkkoja, joissa yhden kerroksen ulosotuloa käytetään seuraavan kerroksen syötteenä. Verkossa ei ole siis loopeja eli kiertoja, koska informaatio syötetään aina eteenpäin, ei ikinä taaksepäin.

Toistuviksi / uusiutuviksi keinotekoisiksi neuroverkoiksi (recurrent neural networks) kutsutaan verkkojen malleja, joissa kierto on mahdollista. Näiden mallien ideana on neuronit, jotka ovat aktiivisia tietyn osan ajasta, ennen kuin niistä tulee uinuvia. Aktivointi voi stimuloida muita neuroneja vaikka hieman myöhemminkin, mikä johtaa lopulta monien neuronien aktivoitumiseen. Loopit eivät aiheuta mallissa ongelmia, koska neuronin ulostulo vaikuttaa sen sisääntuloon vasta vähän myöhemmin eikä heti. Nykyisin toistuvien neuroverkkojen opettelualgoritmit ovat vielä vähemmän voimakkaita kuin eteenpäin kytkettyjen verkkojen. Mutta toistuvat neuroverkot ovat silti mielenkiintoisia, koska ne toimivat samankaltaisemmin kuin omat aivomme.

YKSINKERTAINEN VERKKO KÄSINKIRJOITETTUJEN KIRJAINTEN TUNNISTAMISEEN



Käsialan tunnistaminen voidaan jakaa kahteen alaongelmaan.  Ensin kuva lukusarjasta tulisi jakaa yksittäisiin kuviin, esim 456 olisi 4, 5 ja 6. Kuvan jakaminen on helppoa meille ihmisille, muta haasteellista tietokoneohjelmalle. Toiseksi, kun kuva on jaettu, jokainen yksittäinen numero tulee luokitella. Lukusarjan jakaminen yksittäisiin lukuihin onnistuu esimerkiksi siten, että numeroiden luokittelua käytetään lähestymistapana. Kannattaa siis keskittyä toiseen ongelmaan eli numeroiden luokitteluun.

Erottelu saa korkeat pisteet, jos yksittäisen numeron luokittelija on varma kaikkien numeroiden luokittelussa. Alhaisen numeron erottelu saa, jos luokittelijalla on ongelmia joidenkin numeroiden kohdalla. Ideana on, että jos luokittelijalla on jossain ongelma, sillä on luultavasti vaikeuksia siksi, että erottelu on valittu väärin perustein. Tätä ja muita vaihtoehtoisia tapoja voidaan käyttää ratkaisemaan erotteluongelma melko hyvin.

Kuva otettu osoitteesta http://neuralnetworksanddeeplearning.com/images/tikz12.png


Käsinkirjoitetun yksittäisen numeron tunnistamiseen tarvitaan kolmekerroksista neuroverkkoa (yllä). Syötekerros sisältää neuroneja, jotka koodaavat syötepikselien arvot. Verkoston harjoitteludata koostuu monesta 28 x 28 pikselin käsinkirjoitettujen numeroiden kuvista, joten syötekerros koostuu 784 = 28 x 28 neuronista. Syötteen pikselit ovat harmaaväriskaalattuja: arvo 0.0 esittää valkoista, arvo 1.0 esittää mustaa ja väliin jäävät arvot esittävät asteittain tummenevia harmaan sävyjä.

Piilokerroksen neuronien lukumäärää kuvataan n:llä. Ulostulokerros sisältää 10 neuronia. Jos ensimmäinen neuroni aktivoituu eli sen ulostulo on 1, se merkitsee, että verkko ajattelee numeron olevan 0. Jos toinen neuroni aktivoituu, se osoittaa, että verkko ajattelee numeron olevan 1 jne. Tarkemmin sanottuna ulostuloneuronit numeroidaan luvuilla 0-9 ja selvitetään, millä neuroneista on korkein aktivointiarvo. Jos se on kutosella, verkko arvaa, että syötekuva oli 6.

OPPIMINEN GRADIENTTIMENETELMÄN AVULLA


Miten neuroverkko voi oppia tunnistamaan numeroita? Sen täytyy ensin oppia ns. harjoitusdatasetistä.  Esimerkiksi MNIST datasetti sisältää kymmeniätuhansia skannattuja kuvia käsinkirjoitetuista numeroista sekä niiden oikeat luokittelut. MNIST data on kaksiosainen. Ensimmäinen osa sisältää 60 000 kuvaa, joita käytetään harjoitusdatana. Nämä kuvat on skannattu 250 ihmisen käsinkirjoitetuista näytteistä. Kuvat harmaaväriskaalataan ja asetetaan 28 x 28 pikselin kokoisiksi. Toinen osa MNISTin datasetistä sisältää 10 000 kuvaa, joita voi käyttää testidatana. Nekin ovat 28 x 28 harmaaväriskaalattuja kuvia. Testitataa käytetään arvioimaan, kuinka hyvin hermoverkko on oppinut tunnistamaan numeroita. Jotta saavutettaisiin mahdollisimman hyvä suoritus, testitdata otettiin 250 eri ihmiseltä kuin alkuperäinen harjoitusdata. Se varmistaa, että systeemi kykenee tunnistamaan numeroita ihmisiltä, joiden kirjoitusta se ei ole nähnyt harjoituksen aikana.

x:llä ilmaistaan harjoitusyötettä. Jokainen harjoitussyöte x on 28 x 28=784 -ulotteinen vektori. Jokainen vektorin alkio edustaa kuvan yksittäisen pikselin harmaa-arvoa (grey value). Haluttua ulostuloa merkitään y = y(x), missä y on 10-ulotteinen vektori. Halutaan algoritmi, mikä auttaisi löytämään painotukset ja vakiotermit niin, että verkon ulostulo vastaisi y(x):ää kaikilla harjoitussyötteillä x. Jotta voidaan arvioida, miten hyvin tämä tavoite on saavutettu, määrittetään virhefunktio C:


Virhefunktio C kertoo, miten hyvin verkon ulostulo vastaa y(x):ää kaikilla harjoitussyötteillä x. Jos C on lähellä nollaa, harjoitusalgoritmi on suoriutunut hyvin. Mikäli C:n arvo on suuri, se tarkoittaisi, ettei y(x) ole monilla syötteillä lähellä ulostuloa a. Halutaan siis löytää sellaiset painotukset ja vakioarvot, jotka tekevät C:n mahdollisimman pieneksi. Se onnistuu käyttämällä algoritmiä nimeltään gradienttimenetelmä.

Gradienttimenetelmän päämääränä on siis löytää painotukset ja vakiotermit, jotka minivoivat virhefunktio C(w,b):n arvon. Oppimisessa gradienttimentelmää käytetään korjaamaan neuronien parametrit. Tarkempaa tietoa gradienttimenetelmän matemaattisesta puolesta ja sen periaatteista voi lukea alkuperäiseltä sivulta http://neuralnetworksanddeeplearning.com/chap1.html
_________________________________________________________________________

Siinä oli hieman infoa ja käsitteitä neuroverkoista ja siitä, mihin koneoppiminen neuroverkkojen avulla perustuu. Hirmuisen mielenkiintoista!