AI ja masinõpe: kuidas neid visuaalselt õppida

Lõin selle õpetuse tehisintellekti käsitleva algtaseme tükina.

Iga uus õppeaine tuleb esitada keeles, mis vastab õppija sel ajal omandatud oskuste tasemele. Nii et ärge oodake veel hullumeelseid matemaatikavalemid.

Eriti vaatleme masinõpet ehk Deep Learning.

Neuraalvõrgu sügavus määratakse sisendkihtide arvuga.

Masinõppe algoritmid kaaluvad konkreetse andmekogumi tõenäosuse konkreetse mustri suhtes.

Vahemikus mõtlemine

Teie aju neuronid pole kindlasti digitaalsed, kuid meenutavad nii sisse- kui väljalülitatud olekus binaarset loogikat. Kuid tarkvaras kasutame selle asemel mitmesuguseid väärtusi.

AI-operatsiooni arvutustsükli tulemus on täpsushinnang vahemikus 0,0–1,0. Lõppkokkuvõttes - väljundväärtus saadakse selle põhjal, kui hästi sisendandmed vastavad konkreetsele mustrile, kui 1,0 on 100% -line (seda jõuate harva, kuid 0,95–0,97 on hea.)

See muster koolitatakse tavaliselt enne, kui on võimalik saada sisulisi tulemusi. Sellest veidi hiljem selles õpetuses. Kuid esiteks, siin on ML kõige elementaarsem.

Kõik algab närvivõrkudest - aju neuronite füüsilise struktuuri tarkvaraimitatsioonist.

Lihtne neuraalvõrgu struktuur

Masinõpe selle kõige põhilisemas vormis - väga lihtne närvivõrk.

Selles minimalistlikus näites on näidatud 1 sisestuskiht, mis koosneb 3 sisestussõlmest.

Tavaliselt pakutakse kihtide jaoks mitu sisendite komplekti. Iga sisend on kogutud mingist tüüpi allikast. Nagu näotuvastuseks kasutatava pildi pikslimassiiv, näiteks / või mis tahes muud andmed. See sõltub eesmärgist, mida proovite oma AI algoritmiga saavutada.

Nii sisend- kui ka väljundväärtused on ujuvad pt. arvud vahemikus 0,0 kuni 1,0.

Logistiliselt edastatakse võrgu töö ajal andmeid vasakult paremale. Kuid… närvivõrgu optimeerimiseks kasutatakse mõnikord tagasilööki. See on siis, kui sõidame võrku tagurpidi. Kuid praegu ei pea me sellega muretsema.

Summa

Mitme sisestussõlme summa on just selline, nagu see kõlab. See on eelmise sisendkihi iga sõlme kaalu kogusumma. Pärast summa arvutamist kantakse see töötlemiseks aktiveerimisfunktsiooni.

Aktiveerimisfunktsioon

Aktiveerimisfunktsioon teisendab sisendväärtuste summa väljundväärtuseks.

Aga kuidas see täpselt töötab?

Peame vaatama masinõppe teist aspekti.

Mäletate neid matemaatikavõrrandeid keskkoolis? Parabolas - keegi?

Pildi allikas: https://pl.wikipedia.org/wiki/Plik:Catenary-pm.svg

Aktiveerimisfunktsioon on sõna otseses mõttes lihtsalt matemaatikavõrrand. Nii et matemaatikataustaga inimestel on sellest ehk pisut lihtsam aru saada. Kui ei, lugege edasi visuaalseid skeeme ja ülejäänud seda õpetust, nii et see hakkab sisse vajuma!

Põhjus, miks me ei saa lihtsaid lineaarvõrrandeid kasutada, on tingitud nende piirangutest.

Nendest ei piisa kasulike närvivõrkude loomiseks.

Neuraalvõrgud on loodud keerukamate võrrandite ümber. Näiteks Sigmoidi (tuntud ka kui Logistic) funktsioon on üsna tavaline. (Vaatleme allolevas jaotises mõnda neist erinevatest.)

Need kõik on kujul f (x) =… ja purustavad seejärel x väärtuse sellele funktsioonile ainuomasel viisil. Miks see oluline on ja miks meil on erinevad AF-funktsioonid, selgub natuke hiljem.

Mis juhtub, kui oleme oma tulemuse kätte saanud?

AF edastab arvutatud väärtuse järgmisele sõlmele ja põhimõtteliselt osalise sisendina ühe järgmise sisendikomplekti sõlme aktiveerimisfunktsiooni juurde.

Võite mõelda, et see võtab hulga sisendeid. Ja arvutatud väärtuse edastamine järgmisele sõlmele. See on väärtusvärav sisendkomplektide vahel.

Aktiveerimisfunktsioonide erinevad tüübid

Nii nagu on erinevat tüüpi matemaatikavõrrandeid ... on ka aktiveerimisfunktsioonide tüüpe.

See, kuidas nad lõpliku väljundväärtuse saamiseks numbreid krõbistab, on tihedalt seotud esmalt olemasoleva võrgu koolitamisega. Nii et me ei saa veel selle teemaga nii põhjalikult tutvuda, sest üldiselt ei põhine süsteem nii lihtsal kui numbrilise tulemuse arvutamisel ja tagastamisel.

Kuid mida me saame teha - oma senise mõistmise süvendamiseks -, on vaadata iga aktiveerimisfunktsiooni taga oleva matemaatilise võrrandi visuaalset esitust!

See on visuaalne õpetus. Ja selleks, et anda teile põhitees selle kohta, millega te siin vaeva näete, on tabel klassikalistest matemaatikavõrranditest, millest paljud klassikalised aktiveerimisfunktsioonid võivad põhineda.

Kõige tavalisemat AF-i tähistab f (x) = x või identiteedifunktsioon.

Paar tuntud matemaatilist valemit.

Neid on veel mitu. Kuid nad on natuke keerukamad.

Põhimõtteliselt kasutatakse neid funktsioone saadud sõlme väärtuse määramiseks.

Kui täpselt määrab aktiveerimisfunktsioon selle väärtuse?

Noh, see on AF. See võtab sisendi numbri kujul ja tagastab väärtuse vahemikus 0,0–1,0 (mõnikord on vahemik +/- lõpmatus). Tegelikke valemeid on kirjeldatud ülalpool. Neid võrrandeid saate funktsioonidena ümber kirjutada Pythonis, JavaScriptis või mõnes muus programmeerimiskeeles.

Kui olete matemaatikaga tegelenud ja teil on palju aega oma kätes, siis armastate neid funktsioone koodiliselt välja kirjutada! Kuid sageli ei pea te seda tegema. Ja seda seetõttu, et juba olemasolev A.I. raamatukogud hoolitsevad selle eest sinu eest. Nii saate keskenduda oma närvivõrgu ülesehitamisele ja konkreetse eesmärgi koolitamisele.

Iga sõlm kannab arvutatud kaalu

Nii et need aktiveerimisfunktsioonid loovad väärtuse.

Kõige olulisem asi, mida sel ajal märgata - iga punkt on kaal.

See kaal mõõdab tõenäosust, et teatud muster on kokku sobitatud.

Kuid järgmises näites on võimalikud mitu sisestuskihti.

Natuke keerukamas närvivõrgus asuvad sõlmed on omavahel ühendatud.

Iga üksik sõlme suhtleb järgmise sisendkihi iga sõlmega, moodustades selle ristseotud sidetee.

Üksuste arv igas kihis on meelevaldne. See ei pea olema sama arv, nagu ülaltoodud diagrammil näidatud. Sõltuvalt sellest, millist probleemi proovite lahendada.

Sisestussõlmede arvu määramiseks, mida soovite igas kihis kasutada, on vaja pisut intuitsiooni ja loovust. Kuid isegi sama probleemi saab lahendada erinevate närvivõrgustruktuuride abil.

Arvestuste mittelineaarse olemuse tõttu on see protsess mitmetähenduslik.

Varjatud kihid

Arutasime just, kuidas närvivõrgul võib olla mitu sisestuskihti. Neid võib pidada sõlmede vertikaalseteks ridadeks.

Kõiki esimese sisestusrea ja väljundsõlme vahelisi sisemisi kihte nimetatakse sageli peidetud kihtideks. See on mõistlik, kuna just seal tehakse suurem osa AI töötlemise töödest. Põhimõtteliselt on see AI müsteeriumikast.

Erinevat tüüpi närvivõrgustiku mustrid

Mõnikord võib ML tunduda palju nagu võrgumustri viimistlemine mustrite sobitamiseks.

Neuraalvõrgud on erineva kuju ja kujuga.

Eri tüüpi närvivõrgustruktuurid sobivad paremini nende struktuuriga seotud konkreetsete probleemide lahendamiseks.

OK - aga kuidas me koodi kirjutame?

See oli palju teooriat.

Aga kuidas me seda tegelikult koodina rakendame?

Alustamiseks võite kasutada teeki nagu Tensorflow.js.

Kuid see ei tee midagi head, sest katta on veel nii palju.

OK - aga kuidas see annab tähendusrikkaid tulemusi?

Siiani oleme arutanud närvivõrgu ülesehitust.

Rääkisime aktiveerimisfunktsioonidest, andmesisestustest ja varjatud kihtidest.

Rääkisime ka kaaludest, mis anti simuleeritud ühendustele edasi ja tagasi.

Mittelineaarse masinõppe algoritmi mõistlike tulemuste saamiseks tuleb esmalt koolitada olemasolevate andmete komplekt.

Alustate alati andmete valimist AI algoritmi koolitamiseks.

See sõltub sellest, millist probleemi proovite lahendada.

Kui soovite pildi numbreid ära tunda, alustage numbrikujutistega.

Numbrite äratundmine ekraanipildilt

Klassikaline AI näide on õpetada närvivõrku tundma numbreid vahemikus 0–9. Samamoodi, nagu saate treenida masina algoritmi, et ära tunda A-Z tähed või isegi inimese näo osad - silm või suu foto tähistab ka teatud kuju või mustrit, mis on kõigile inimestele ühine, kuid võib tunduda pisut erinev.

Pidage meeles, et kõik, mis meil siin on, on mustrid.

Kui algoritm tuvastab mustri, pole see kunagi 100% -line. Kuid mida lähemale võime jõuda 1,0-ni (100%), seda tõenäolisem on see kuju, mida otsime, seda, mida ta on koolitatud ära tundma.

Kui kasutaksime tavalist fonti, ei peaks me isegi AI-tööd tegema. Saime lihtsalt skannida iga numbri täpse pikslimustri saamiseks. Kuid AI põhipunkt on ähmasuse mustri äratundmine.

Esiteks peab meil olema teatud tüüpi meedium, mida kasutatakse koolitusandmetena. Igat numbrit võib tähistada kujutisega:

Samad korduvalt kirjutatud numbrid annavad pisut erineva mustri. Pilt on tehtud JavaScripti AI demos, mis asub aadressil http://myselph.de/neuralNet.html

Iga numbrit saate nägemise järgi hõlpsalt ära tunda. Kuid AI algoritmi tuleb koolitada sarnaste mustrite äratundmiseks, sest kuigi nad on sarnased, pole nad siiski 100% identsed.

Selle saavutamiseks võime jagada esmase mustri väiksemateks plokkideks ja rakendada midagi, mida nimetatakse funktsioonide ekstraheerimiseks.

Funktsioonide ekstraheerimine

Numbri tuvastamiseks rakendab algoritm funktsioonide eraldamise süsteemi, mis jagab ühised mustrid vastasosadeks, mis on vajalikud kogu numbri / sümboli / tähe / jne konstrueerimiseks.

Mustri olemus jääb samaks. Näiteks 0 on enamasti ring - võite selle jagada väiksemateks mustriteks, mille mõlemal küljel on kaar:

Kui suudame ainult treenida oma algoritmi nende 4 ainulaadse mustri äratundmiseks ja nende olemasolu kontrollimiseks pildi lokaliseeritud piirkonnas, saame arvutada kindluse, mille abil võib öelda, et see võib olla null.

Sama on ka teiste numbritega. Näiteks number 1 on üks vertikaalne riba. Või ehk väiksema joonega, ülaosas väikese nurga all.

Number 2 on pool ringi peal, diagonaaljoon ja horisontaaljoon.

Number 3 võib jagada kaheks poolkaaremustriks.

Numbrit 4 võib pidada 3 jooneks: vertikaalne, horisontaalne ja diagonaal.

…ja nii edasi.

Mis siis, kui see on käsitsi kirjutatud number? Sellel numbril on ikka samad omadused: samad servad, samad aasad.

Mis siis, kui number ilmub fotol kaudse nurga alt tänavale väljuvale kiirusepiirangu märkile? Sarnaselt meie enda visioonile peaks AI suutma kohaneda teatud tüüpi tõrketerminite korral.

Kas see on viis, kolm või kaheksa?

Proovige seda AI JavaScripti demo, mis võimaldab teil ekraanile midagi joonistada ja lasta eelkoolitatud algoritmil öelda, mida just joonistasite.

Algoritm püüab anda teile parima tulemuse ka siis, kui see, mida joonistate, pole tegelikult number. Siiski näete tööl tehisintellekti, püüdes pakkuda võimalikult täpset lähenemist.

Kuidas näeb välja koolitatud komplekt?

Siin on algoritmi väljavõte treeningandmetest. See on lihtsalt väga pikkadesse massiividesse salvestatud raskuste loend (tuhandeid väärtusi):

// Neuraalvõrgu kaalud (ühiku ühikud ja ühikväärtused) // koolitus viidi läbi Matlabis koos MNIST-i andmekogumiga.
// need andmed on seotud 784-200-10 ühikuga, logistiliselt mittelineaarsusega
// väljundkihis peidetud ja softmax. Sisend on a
// [-1; 1] halli taseme pilt, taust == 1, 28x28 pikslit lineariseeritud
// veergude järjekorras (st veerg1 (:); veerg2 (:); ...) i-nda väljundina
// kui on maksimaalne, tähendab võrk, et sisend kodeerib
// (i-1) Allolevad kaalud näitasid testis 1,92% veamäära
// andmekogum (9808/10000 numbrit on õigesti tuvastatud).
laske w12 = [[-0.00718674, 0.00941102, -0.0310175, -0.00121102, -0.00978546, -4.65943e-05, 0.0150367, 0.0101846, 0.0482145, 0.00291535, 0.00172736, 0.0234746, 0.0416268, 0.0315077, 0 , 0,00692898, 0,0215552, 0,0540464, 0,0393167, 0,0668207, 0,0232665, 0,031598, 0,0143047, 0,0156885, -0,0269579, -0,00777022, 0,0397823, -0,00825727, 0,0212889, -0,0075751515, 0,0353843, 0,0353843,
/ * ... Järgneb tuhandeid raskusi rohkem ... * /

Täielik lähtekood ei mahu sellesse artiklisse. Kuid komplektid on tavaliselt üsna pikad isegi selle jaoks, mis tundub triviaalne.

Kujutise sisestus neurovõrku

See natuke koodi on võetud JavaScripti kirjutatud funktsioonist tunnusta ().

See võeti demoselt aadressilt http://myselph.de

Kogu lähtekoodi saate vaadata siit.

// visualiseerimiseks / silumiseks: värvige sisend närvivõrku. if (document.getElementById ('eeltöötlus'). kontrollitud == tõene)
{
    ctx.clearRect (0, 0, lõuend.laius, lõuend.kõrgus);
    ctx.drawImage (copyCtx.canvas, 0, 0);
    jaoks (var y = 0; y <28; y ++) {
        jaoks (var x = 0; x <28; x ++) {
           var blokeerida = ctx.getImageData (x * 10, y * 10, 10, 10);
           var newVal = 255 * (0,5 - nnsisend [x * 28 + y] / 2);
           jaoks (var i = 0; i <4 * 10 * 10; i + = 4) {
               block.data [i] = newVal;
               block.data [i + 1] = newVal;
               block.data [i + 2] = newVal;
               plokk.andmed [i + 3] = 255;
           }
       ctx.putImageData (plokk, x * 10, y * 10);
       }
   }
}

See osaline kooditükk kleebib kujutise sisendi (vabakäejoonis), mis oli eelnevalt jagatud 10 x 10 plokiks, salvestades pildi selle ala keskmised halltoonid.

Seejärel kontrollib ta seda väljaõppitud komplekti suhtes ja pärast summade / keskmise võrdluse krõbistamist tagastab tulemuse tõenäosus selles osas, kui täpselt vastab teie HTML-lõuendi joonis konkreetsele numbrile.

Lõppsõnad

Tehisintellekt on tohutu teema. Iga päev ilmub välja erinevaid masinõppe mustreid ja õpetusi. See õpetus peaks olema ainult sissejuhatus inimesele, kes alles alustab!

Jälgige mind Twitteris tasuta kingituste saamiseks

Haarake kaasa CSS-i visuaalse sõnaraamatu koopia. kõigi CSS-i omaduste diagrammid.

Twitteris Loodelaine on konto, mis annab mu raamatud tasuta ära.

Jälgige mind saidil j @ js_tut, kus postitan freemium JavaScripti õpetusi.