< eelmine | 3. OSA sisukord | järgmine > |
3.2 Tehisnärvivõrgud masinnägemises autor: Ardi Tampuu
Neuronid ja ühendused, sisendist väljundi arvutamine
Sarnaselt bioloogilistele neuronite võrgustikele koosnevad ka tehisnärvivõrgud neuronitest ja nendevahelistest ühendustest. Tehisneuronitel on aga päris neuronitega üsna vähe ühist ja seega kutsume me neid tihti mitte neuroniteks, vaid lihtsalt (tehisvõrgu) sõlmedeks. Sõlmede omavaheliste ühenduste tugevusi kutsutakse kaaludeks. Ühendused on nii ajus kui tehisnärvivõrkudes ühesuunalised - kui neuron A saadab neuronile B signaale, siis see ei tähenda automaatselt, et ka B saadab A-le signaale.
Neuronitest ja nendevahelistest ühendustest moodustub võrgustik. Bioloogilised närvivõrgud meie ajus on väga-väga keeruliste ühenduvus-mustritega, tehisnärvivõrkude puhul on levinud pigem lihtsama ülesehitusega võrgustikud.
Lihtsaim ja levinuim tehisnärvivõrgutüüp on pärilevivõrk. Tüüpilises pärilevivõrgus on neuronid jagatud gruppidesse, mida kutsutakse kihtideks. Kihid on järjestatud, seega räägime esimesest, teisest, ... ja viimasest kihist. Iga kiht on ühendatud järgmise kihiga, ehk annab sisendit järgmisesse kihti. Ühendused on ühesuunalised ning vastassuunalisi ühendusi (näiteks teisest kihist esimesse) pole, seega liigub signaal alati pärisuunas - esimesest viimase kihi suunas.
Kui tegu on täissidusa võrguga (nagu Joonisel 9), siis saab iga neuron sisendeid kõigilt eelmise kihi neuronitelt ja saadab oma väljundi kõikidesse järgmise kihi neuronitesse (vt. Joonis 9, kõigi neuronipaaride vahel on ühendusjoon).
Esimene "kiht" koosneb sisendväärtustest, näiteks pikslite värviväärtustest. Kui võrgu sisendiks on 10x10 suurusega värviline pilt, on sisendkihis 10*10*3 = 300 neuronit, millest igaühe väljund vastab mingi piksli mingi värvikomponendi väärtusele (täisarv 0st kuni 255ni). Iga sisendneuron on ühendatud iga teise kihi neuroniga (täissidus ühendus kihtide vahel). Igal sellisel ühendusel on erinev reaalarvuline kaal.
Iga teise kihi neuron korrutab sisendneuronite väljundid läbi ühendustugevustega (kaaludega) ja liidab need kokku. Saadud summat kutsutakse selle neuroni sisendite kaalutud summaks. Kuna ühendustugevused on erinevad, on ka saadud summad igal teise kihi neuronil erinevad, kuigi nad kõik said sisendeid kõikidelt esimese kihi neuronitelt.
Kontrollülesanne. Arvuta järgneva neuroni sisendite kaalutud summa:
Seejärel arvutab iga neuron oma sisendite kaalutud summa põhjal oma väljundi (ehk aktivatsiooni), kasutades selleks aktivatsioonifunktsiooni. Aktivatsioonifunktsioonid on üsna lihtsad funktsioonid, mis võtavad sisendiks ühe reaalarvu ja tagastavad samuti ühe reaalarvu. Klassikaliselt kasutati aktivatsioonifunktsioonina näiteks hüperboolset tangensit ja sigmoidfunktsiooni. Tänapäeval väga populaarne aktivatsioonifunktsioon on mittenegatiivne lineaarfunktsioon (ingl rectified linear unit), mis lihtsalt muudab kõik negatiivsed väärtused nullideks ja jätab positiivsed samaks.
mittenegatiivne lineaarfunktsioon: | kui summa < 0 : väljund = 0 | kui summa >= 0: väljund = summa
Sellega ongi teise neuronitekihi arvutused tehtud: arvutati iga neuroni sisendite kaalutud summa ja rakendati neile summadele aktivatsioonifunktsioon. Väljundid saadetakse edasi kolmandasse kihti. Jällegi, täissidusas võrgus saab iga kolmanda kihi neuron sisendeid kõigilt teise kihi neuronitelt ning korrutab need läbi erinevate kaaludega. Seejärel rakendatakse aktivatsioonifunktsioon. Nii, kiht kihi haaval liiguvad väärtused läbi võrgu "pärisuunas", ehk võrgu sisendist võrgu väljundi suunas. Võrgu väljundiks ongi lihtsalt viimase neuronitekihi väljundid.
Vea arvutamine
Nagu peatükis 3.1 mainiti, on iga masinõppe mudeli eelduseks andmed. Juhendatud õppes tähendab see, et meil on olemas sisendid ja neile vastavad õiged vastused ehk märgendid.
Sisestades tehisnärvivõrgu esimesse kihti sisendväärtused (tunnuste väärtused), arvutame kiht-kihi haaval võrgu neuronite aktivatsioonid ja saame viimasest kihist vastuseks teatud väljundi. Seda väljundit võrreldakse märgendiga ja arvutatakse kui suure vea võrk tegi. Näiteks, kui pildil on kass (õige vastus on "kass"), aga võrk on 99% kindel, et pildil on koer, on viga suur. Kui aga võrk on 70% kindel, et tegu on kassiga ja ainult 30% kindel, et koeraga, siis on viga märgatavalt väiksem. Ja kui mudel on 99.9% kindel, et tegu on kassiga, on viga väga väike.
Viga arvutatakse teatud matemaatilise funktsiooni kaudu, väljundi ja õige vastuse alusel.
Tehisnärvivõrkude õpetamine
Kui öeldakse, et tehisnärvivõrk õpib, või et tehisnärvivõrku treenitakse, siis see tähendab ühendustugevuste (kaalude) muutmist viisil, mis vähendaks ennustamisel tehtavat viga. Aga kuidas me teame, mil viisil me igat üksikut kaalu muutma peaks? Sellele küsimusele annab vastuse gradientlaskumise algoritm, mis seisneb vea tuletise arvutamises iga võrgus oleva kaalu järgi (ühendustugevuse järgi).
Lihtsamalt seletades küsime me iga kaalu kohta: "Kui palju ja mis suunas muutuks viga, kui me tõstaksime seda kaalu hästi natukene?" Kui vastus on, et viga väheneks (kui tuletis on negatiivne), siis me tõstamegi pisut selle kaalu väärtust. Kui kaalu suurendades viga tõuseks, siis me hoopis vähendame kaalu väärtust (sest siis viga väheneb). Rakendades seda reeglit kõigile kaaludele võrgus, vähendame me viga käesoleva näite (võrgu sisendi ja märgendi paari) jaoks. Korrates sellist õppimisprotseduuri paljude sisend-märgend paaride jaoks, muutub mudel kõigi nende puhul veidi paremaks. Käies korduvalt läbi kõik meie märgendatud andmestikus olevad näited, õpibki mudel järk-järgult aina väiksema veaga igast sisendist õiget väljundit ennustama.
Siinkohal meenutame eelmisest loengust, et isegi kui mudel õpib ideaalselt vastama treenimisel kasutatud sisend-väljund paaride puhul, ei tähenda see, et uute, seni nägemata sisendite puhul tulemus sama hea oleks. Mudel ei pruugi üldistuda uutele andmetele või võib treeningandmetele ülesobituda.
Õppiva võrgu demo (mitte-kohustuslik)
Järgneval lingil saab reaalajas katsetada kuidas üks närvivõrk õpib erinevaid objekte tuvastama.
Selle rakenduse kasutamiseks on vaja veebikaamerat. Rakendus küsib, et kasutaja näitaks veebikaamerale erinevaid esemeid (või inimesi). Veebikaamera teeb näidatud asjadest pildid ja proovib seejärel treenida tehisnärvivõrgu, mis neid omavahel eristada suudaks. Kui mudel on treenitud, saab veebikaamerasse uuesti erinevaid esemeid näidata ja vaadata, kas mudel arvab ära, millise esemega on tegu.
Kui kasutajal pole veebikaamerat, on võimalik ka käsitsi pilte üles laadida ja nende põhjal mudel treenida.
Pikslite paigutuse arvesse võtmine - konvolutsioon
Täissidusad võrgud (vt joonis 9) ei ole piltide töötlemisel osavamad kui eelmise peatüki lõpus mainitud otsustusmets ja tugivektormasinad. Ka täissidusad võrgud käsitlevad kõiki sisendeid üksteisest sõltumatute tunnustena ja tasandavad pildi 3D-massiivi kujult üheks pikaks vektoriks, mis on täissidusalt ühendatud teise neuronitekihiga. Seega ei hooli nad sellest, millised pikslid asuvad üksteise kõrval või millised värviväärtused kuuluvad samale pikslile.
Piltide töötlemiseks kasutatakse veidi keerukamat tehisnärvivõrkude varianti - konvolutsioonilisi närvivõrke. Need võrgud ei pea sisendit ühemõõtmeliseks tasandama ja suudavad sisendit ruumilisena vaadelda. Enne, kui me saame rääkida tehisnärvivõrkudest, mis kasutavad konvolutsiooni, peame täpsemalt selgitama, mis üldse on konvolutsioon.
Konvolutsioon
Tehisnärvivõrkude kontekstis mõeldakse konvolutsiooni all 'samade kaalude korduvat rakendamist erinevatele sisendiosadele. Kuigi hiljem rakendame seda kolmemõõtmelistele objektidele-piltidele - siis lihtsuse mõttes seletame konvolutsiooni esmalt ühemõõtmelisel sisendil.
Joonis 12. Konvolutsioon tähendab samade kaalude rakendamist erinevatele sisendiosadele. Märka, et koos kasutatakse järjestikuseid sisendeid - seega sisendite järjekord ja naabrussuhted on olulised!
Allikas
Joonisel 12 kujutatakse konvolutsiooni 1-mõõtmelise sisendi puhul. Sisendiks on 7 tunnust ja kasutame kolme kaalu. Neid 3 kaalu kasutatakse alati koos ja sellist kaalude gruppi kutsutakse filtriks. Konvolutsiooniline operatsioon seisneb mingi teatud filtri rakendamises sisendi erinevatele osadele. Filtri üks rakendamine seisneb kaalude ja käesoleva sisendilõigu omavahelises elementhaaval korrutamises ja kokku liitmises (vt. Joonisel 12 tehet parempoolse väljundi juures). Joonisel on loetavuse mõttes filtrit rakendatud kolme erinevasse kohta, aga antud sisendile saaks seda filtrit rakendada ka viide erinevasse lõiku, liikudes vasakult paremale ühe elemendi pikkuse sammuga.
Pane Joonisel 12 tähele, et:
1) iga väljund sõltub ainult kolmest sisendist, mitte kõigist seitsmest
2) filtrit rakendatakse üksteise kõrval asuvatele sisenditele.
3) me kasutame oma filtrit (oma kolme kaalu) mitu korda (sama värvi jooned)
Esimene punkt tähendab, et kõik sisendid ei ole enam seotud kõigi väljunditega (pole "täissidus"). Teine punkt tähendab, et naabrussuhted on olulised - me kasutame koos esimest, teist ja kolmandat sisendit, aga näiteks mitte esimest, neljandat ja kuuendat. Seega - naabrussuhted on olulised ja defineerivad, milliseid sisendeid millistega kombineeritakse. Kolmas punkt tähendab, et me teeme sama "asja" mitu korda - me rakendame sama filtrit korduvalt, eri sisendiosadele.
Vaatame nüüd, kuidas see kõik välja näeb kui sisendiks on värviline pilt (3D massiiv), mitte vektor (mis on ühemõõtmeline).
Joonis 13 Konvolutsioon piltidel. Joonisel on näidatud üks filtri rakendamise kord. Sisendiks on 32x32x3 (värviline) pilt. Rakendatud on 10x10x3 filtrit, mis tähendab, et kasutatakse mingit 10x10 piksli suurust ala pildil ja kasutatakse korraga kõiki värvikanaleid. Sisendregiooni ja filtri dimensioonid on samad (neis on sama palju elemente) ning seega saame nende väärtused paarikaupa korrutada ja kokku liita. Iga filtri rakendamise korra väljundiks on üks reaalarv - korrutiste summa.
Allikas
Esimene oluline erinevus on see, et 3D massiivile rakendatav filter peab samuti olema kolmemõõtmeline. Filtri rakendamine tähendab ikka, nagu ka 1D juhul, et filtris sisalduvad kaalud korrutatakse läbi mingi alaga sisendis. Joonisel rakendame 10x10x3 filtrit, seega tuleb pildist mõtteliselt "välja lõigata" samuti 10x10x3 ala. Sama suuri objekte saame element elemendi haaval omavahel korrutada ja korrutised kokku liita, saades lõpptulemusena ühe arvu.
Valimaks 10x10 ala 32x32 pikslisel pildil on kokku 23x23 võimalust. Kujutagem ette, et esmalt rakendame filtrit alale vasakul üleval nurgas, siis nihkume ühe piskli võrra paremale ja rakendame sama filtrit uuesti. Jõudes paremasse serva alustame rakendamist uuesti vasakust äärest, aga ühe piksli võrra alt poolt. Seega kui rakendame ühte 10x10(x3) filtrit kõikides võimalikes pildi osades, saame kokku 23x23 väärtust, mis on samuti ruumiliselt organiseeritud, ehk moodustavad samuti teatud tüüpi "pildi". Sellel pildil on samuti kõrgus ja laius ning väärtuste asukohad omavad tähendust. See pilt näitab, kui hästi filter ja erinevad pildiosad omavahel sobitusid - mida suurem väärtus, seda paremini.
Seletame seda järgneva näite abil:
Filter, mis lihtsalt võtab iga piksli värviväärtuse keskmise, ehk teeb pildi mustvalgeks, on suurusega 1x1x3. Seda filtrit rakendatakse igale pikslile eraldi (1 x 1 alale), kokku 32 x 32 korda. Kaalud sellise keskmise võtmiseks on [0.333, 0.333, 0.333]. Tulemusena saame mustvalge pildi (Joonis 14), mille suurus on 32x32x1. Märka, et punase-rohelise-sinise väärtuste asemel on nüüd ainult üks väärtus, heledus, aga pildi ruumiline ülesehitus on säilinud ka väljundis.-
Joonis 14. Pildi mustvalgeks tegemine konvolutsiooni abil. Vasakul esialgne foto, paremal mustvalge. Kasutades 1x1x3 filtrit, mis korrutab iga värvikanali 0.333-ga ja liidab need kokku, saame tulemuseks 32x32 pildi, millel on ainult üks "värv", heledus (ehk tegu on 32x32x1 massiiviga).
Nagu Joonisel 14 näeme - väljundina saadud pilt on ruumiliselt organiseeritud sama moodi nagu algne pilt, selle pikslite asukohad vastavad asukohtadele algsel pildil. Rakendasime sama filtrit palju kordi (32x32=1024 korda) ning filtri moodustanud kaalud olid sellised, et filtriga hästi "sobitumine" tähendas lihtsalt piksli heledust.
Natuke keerulisema, 3x3x3 filtri abil on võimalik leida pildil horisontaalsed jooned, tuvastades pildiosad, kus heledus muutub üles-alla suunas liikudes (Joonis 15). Samuti oleks võimalik luua filter, mis tuvastaks vertikaalsed või diagonaalsed jooned. Natuke suurema (8x8) filtri abil võiks pildilt otsida silmi või kõrvu.
Joonis 15. Servade leidmine pildil konvolutsiooni abil. Vasakul esialgne pilt, paremal servad. 3x3 filter on täidetud selliste kaaludega, et aktivatsioon on maksimaalne kui pildiosal on horisontaalne joon. Konvolutsiooni väljundiks on pilt, kus heledus vastab sellele, kui tugevalt filter antud pildiosas aktiveerunud oli.
Kokkuvõtteks, konvolutsioon käib süsteemselt läbi kõik teatud suurusega alad pildil ja võrdleb neid teatud näidisega (filtriga, mis omakorda koosneb kaaludest). Sellise funktsiooni väljundiks on uus kahemõõtmeline pilt (öeldakse ka "kaart", tunnuskaart), mis sisaldab infot selle kohta, millises pildi osas sisend ja näidis (filter) paremini kattusid.
Konvolutsioonilised võrgud
Konvolutsioonilised tehisnärvivõrgud on mitte-täissidusad pärilevivõrgud, mille vähemalt ühe kihi aktivatsioonid on arvutatud kasutades konvolutsiooni.
Näiteks: andes võrgule sisendiks pildi, rakendab võrk esmalt sellele pildile konvolutsioonilisi filtreid. Tavaliselt mitut erinevat filtrit, nii et väljundiks on sellel konvolutsioonilisel kihil mitu uut "pilti", mida kutsutakse tunnuskaartideks. Need tunnuskaardid peegeldavad, kui hästi iga filter erinevate pildiosadega sobitus. Neile, väljundiks saadud tunnuskaartidele, saab omakorda rakendada järgmise konvolutsioonilise kihi (vt. Joonis 16). On ju tegu põhimõtteliselt piltidega, nagu algne sisendki oli. Veel ühe konvolutsioonilise kihi rakendamine tunnuskaartidele võimaldab erinevaid ruumilisi tunnuseid kombineerida, näiteks tuvastada vertikaalse ja horisontaalse joone puutepunktis nurk. Või järeldada silmade ja kõrvade asukoha põhjal, et pildil on nägu.
Alles pärast ühe või mitme konvolutsioonilise kihi rakendamist tasandatakse aktivatsioonid (viimase konvolutsioonilise kihi tunnuskaardid) üheks pikaks vektoriks, rakendatakse täissidusaid kihte ja arvutatakse lõplik võrgu väljund. Näiteks ennustus, mis objekt või loom on pildil. Konvolutsiooniliste kihtide kasutamine esimeste kihtidena võimaldab pildilt tuvastada ruumilisi mustreid. Täissidusasse võrguossa jõuab vähem tunnuseid kui oli algselt pikslite värviväärtusi ning need tunnused sisaldavad infot pildi ruumilise ülesehituse kohta.
Joonis 16. Kahe konvolutsioonilise kihiga võrk. Iga konvolutsiooniline kiht kasutab mitut filtrit, seega on kihi väljundiks mitte üks kõrgus x laius tunnuskaart, vaid mitu tunnuskaarti. Joonisel on need mitu tunnuskaarti kujutatud koos, ühe risttahukana. Käesolevas võrgus tasandatakse teise konvolutsioonilise kihi väljundiks olevad tunnuskaardid ja nende väärtustele rakendatakse täissidusaid kihte.
Allikas (kohandatud)
Alates 2012. aastast on sellised võrgud kogunud tohutu populaarsuse. Lihtne idee otsida pildi erinevatest osadest samu tunnuseid, nende tunnuste põhjal omakorda keerulisemaid tunnuseid ja alles siis hakata nende põhjal väljundit ennustama on osutunud väga edukaks.
Et mitte jätta olulisi asju mainimata, märgime ka ära, et konvolutsioonilistele võrkudele on võimalik veel lisada kihte, mis tagavad ka ruumilise invariantsuse. See tähendab, et ei ole vahet, kus mingi detail pildil asub. Pole oluline, kas pildil olev tunnus (näiteks silm või käpp) asub pildi paremal või vasakus servas - mudel ei ole selle suhtes kuigi tundlik.
Konvolutsiooniliste filtrite õpetamine
KÕIK ON ÕPITAV! Ja see kõik on õpitav gradientlaskumise algoritmi abil.
Ka konvolutsioonilisi filtreid on võimalik optimeerida. Kui eelpool toodud näidetes kasutasime me oma tarkusest leiutatud filtreid, mis muutsid pildi mingiks meile mõistetavaks tunnuskaardiks (heledus, horisontaalsete joonte sisaldamine), siis praktikas me laseme tehisnärvivõrkudel ise õppida, milliseid tunnuseid pildilt otsida.
Nagu ka täissidusate võrkude puhul, on meil märgendatud näited: pilt ja oodatav õige vastus. Sisestame pildi esimesse kihti, rakendame filtrite kihte (ehk konvolutsioonilisi kihte) ja täissidusaid kihte kuni lõpuks saame viimasest kihist lugeda võrgu väljundi. Väljundi ja õige vastuse alusel arvutame vea, vea tuletiste abil teame, millises suunas iga filtri iga kaaluväärtust muuta. Nii suudabki konvolutsiooniline võrk ise õppida, milliseid filtreid kasutada.
Näidete põhjal, filtrite optimeerimise käigus, suudavad konvolutsioonilised võrgud leida veel informatiivsemaid filtreid ja filtrite kombinatsioone kui need, millega inimmõistus lagedale suudaks tulla. Selle tulemusena suudavad need võrgud pildist olulise info üles leida ja selle põhjal täpseid otsuseid teha, mõnikord isegi täpsemaid kui inimesed oma ülimalt arenenud nägemismeelega.
< eelmine | 3. OSA sisukord | järgmine > |