AI un mašīnmācība: kā tos vizuāli iemācīties

Es izveidoju šo apmācību kā sākuma līmeņa darbu par mākslīgo intelektu.

Visi jaunie priekšmeti jāpasniedz valodā, kas atbilst tā laika izglītojamā prasmju līmenim. Tāpēc pagaidām negaidiet trakas matemātikas formulas.

Īpaši mēs apskatīsim Machine Learning jeb Deep Learning.

Neironu tīkla dziļumu nosaka ieejas slāņu skaits.

Mašīnmācīšanās algoritmi nosver noteiktas datu kopas iespējamību attiecībā pret konkrētu modeli.

Domāšana diapazonos

Neironi jūsu smadzenēs noteikti nav digitāli, taču tie atgādina bināro loģiku gan ieslēgtā, gan izslēgtā stāvoklī. Bet programmatūrā tā vietā mēs izmantojam virkni vērtību.

Aprēķina cikla rezultāts AI operācijā ir precizitātes novērtējums diapazonā no 0,0 līdz 1,0. Galu galā - izvades vērtība tiek iegūta, pamatojoties uz to, cik labi ievades dati atbilst noteiktam modelim, kad 1,0 ir 100% (jūs to reti sasniedzat, bet 0,95 - 0,97 ir labs.)

Šis modelis parasti tiek apmācīts, pirms var iegūt nozīmīgus rezultātus. Plašāk par to nedaudz vēlāk šajā apmācībā. Bet vispirms šeit ir ML visvienkāršākajā.

Viss sākas ar neironu tīkliem - smadzeņu neironu fiziskās struktūras programmatūras imitāciju.

Vienkārša neironu tīkla struktūra

Mašīnmācība visvienkāršākajā formā - ļoti vienkāršs neironu tīkls.

Šajā minimālisma piemērā parādīts 1 ievades slānis, kas sastāv no 3 ievades mezgliem.

Parasti tiek nodrošināti vairāki ieeju komplekti vienā slānī. Katra ievade tiek apkopota no kāda veida avotiem. Tāpat kā pikseļu masīvs no attēla, ko izmanto sejas atpazīšanai, piemēram, / vai jebkuri citi dati. Tas ir atkarīgs no mērķa, ko jūs mēģināt sasniegt ar savu AI algoritmu.

Gan ieejas, gan izejas vērtības ir mainīgas pt. skaitļi no 0,0 līdz 1,0.

Loģistiski tīkla darbības laikā dati tiek padoti no kreisās uz labo pusi. Tomēr… Neironu tīkla optimizēšanai dažreiz tiek izmantota aizmugures izplatīšanās. Tas ir, kad mēs ceļojam pa tīklu apgrieztā virzienā. Bet pagaidām mums tas nav jāuztraucas.

Summa

Vairāku ievades mezglu summa ir tieši tāda, kā izklausās. Tā ir kopējā katra iepriekšējā mezgla mezgla svara summa. Pēc summas aprēķināšanas tā tiek nodota apstrādei aktivizācijas funkcijā.

Aktivizēšanas funkcija

Aktivizācijas funkcija ievades vērtību summu pārveido izvades vērtībā.

Bet kā tieši tas darbojas?

Mums jāskatās uz vēl vienu mašīnmācības aspektu.

Atcerieties tos matemātikas vienādojumus no vidusskolas? Parabolas - kāds?

Attēla avots: https://pl.wikipedia.org/wiki/Plik:Catenary-pm.svg

Aktivizācijas funkcija burtiski ir tikai matemātiskais vienādojums. Tiem, kam ir matemātikas fons, to varētu būt mazliet vieglāk aptvert. Ja nē - lasiet tālāk uz vizuālajām diagrammām un pārējo šo pamācību, lai tā sāktu ieslīgt!

Iemesls, kāpēc mēs nevaram izmantot vienkāršus lineārus vienādojumus, ir saistīts ar to ierobežojumiem.

Tie nav pietiekami, lai izveidotu noderīgus neironu tīklus.

Neironu tīkli ir veidoti ap sarežģītākiem vienādojumiem. Piemēram, Sigmoid (pazīstama arī kā loģistika) funkcija ir diezgan izplatīta. (Tālāk sadaļā apskatīsim dažus dažādus veidus.)

Tie visi ir f (x) =… un pēc tam sasmalcina x vērtību unikālā veidā šai funkcijai. Kāpēc tas ir svarīgi un kāpēc mums ir dažādas AF funkcijas, mazliet vēlāk parādīsies.

Kas notiek, kad esam ieguvuši rezultātu?

AF aprēķināto vērtību nodod nākamajam mezglam un būtībā kā daļēju ievadi vienā no aktivizēšanas funkcijām mezglā nākamajā ieejas komplektā.

Jūs to varat uzskatīt par vairāku ieeju komplekta uzņemšanu. Un aprēķinātās vērtības nodošana nākamajam mezglam. Tā ir vārteja starp ievades kopām.

Dažādi aktivizēšanas funkciju veidi

Tāpat kā ir dažādi matemātisko vienādojumu veidi, ir arī dažādi aktivizācijas funkciju veidi.

Precīzi tas, kā viņi sagrauj skaitļus, lai iegūtu galīgo izvades vērtību, ir cieši saistīts ar pirmā tīkla apmācību. Tāpēc mēs pagaidām nevaram iedziļināties šajā tēmā, jo kopumā sistēma nav balstīta uz kaut ko tik vienkāršu kā skaitliska rezultāta aprēķināšana un atgriešana.

Bet tas, ko mēs varam darīt - lai padziļinātu mūsu izpratni līdz šim - ir aplūkot katra matemātiskā vienādojuma vizuālo attēlojumu aiz dažādām aktivizēšanas funkcijām!

Šī ir vizuāla apmācība. Un, lai sniegtu jums pamata ideju par to, ar ko jūs tiksit galā, ir tabula ar klasisko matemātisko vienādojumu kopumu, uz kura var balstīties daudzas klasiskās aktivizācijas funkcijas.

Visvienkāršāko AF attēlo f (x) = x vai identitātes funkcija.

Dažas vispārzināmas matemātiskās formulas.

Ir vēl vairāki citi. Bet tie ir nedaudz sarežģītāki.

Būtībā šīs funkcijas tiek izmantotas, lai noteiktu iegūto mezgla vērtību.

Cik precīzi aktivizācijas funkcija nosaka tā vērtību?

Tas ir tas, kas ir AF. Tas tiek ievadīts skaitļa formā un iegūst atgriešanās vērtību no 0,0 līdz 1,0 (dažreiz diapazons ir +/- bezgalība). Faktiskās formulas ir aprakstītas iepriekš. Šos vienādojumus var pārrakstīt kā funkcijas Python, JavaScript vai jebkurā citā programmēšanas valodā.

Ja jūs esat matemātikas un daudz laika paņemat uz rokām, jums patiks šīs funkcijas rakstīt kodā! Bet bieži vien jums tas nav jādara. Un tas ir tāpēc, ka jau esošais A.I. bibliotēkas par to rūpējas par jums. Tādā veidā jūs varat koncentrēties uz sava neironu tīkla veidošanu un tā apmācību noteiktam mērķim.

Katrs mezgls pārvadā aprēķinātu svaru

Tātad šīs aktivizācijas funkcijas rada vērtību.

Vissvarīgākais, kas šajā laikā jāievēro - katrs punkts ir svars.

Šis svars mēra varbūtību, ka kāds modelis tiks saskaņots.

Bet ir iespējami vairāki ievades kopu slāņi, kā parādīts nākamajā piemērā.

Mezgli nedaudz progresīvākajā neironu tīklā, kas savienoti viens ar otru.

Katrs mezgls sazinās ar katru mezglu nākamajā ieejas slānī, veidojot šo savstarpēji savienoto komunikāciju šoseju.

Vienumu skaits katrā slānī ir patvaļīgs. Tam nav jābūt tādam pašam skaitlim, kā parādīts iepriekš redzamajā diagrammā. Atkarībā no tā, kuru problēmu jūs mēģināt atrisināt.

Lai noteiktu ievades mezglu skaitu, ko vēlaties izmantot katrā slānī, būs nepieciešama zināma intuīcija un radošums. Bet pat vienas un tās pašas problēmas risināšanu var panākt ar dažādām neironu tīkla struktūrām.

Sakarā ar aprēķinu nelineāro raksturu šis process ir neskaidrs.

Slēptie slāņi

Mēs tikko apspriedām, kā neironu tīklam var būt vairāki ievades slāņi. Tos var uzskatīt par vertikālām mezglu rindām.

Visus iekšējos slāņus starp pirmo ievades rindu un izvades mezglu bieži sauc par slēptiem slāņiem. Tam ir jēga, jo tieši šeit tiek veikta lielākā daļa drūmo AI apstrādes darbu. Būtībā tā ir AI noslēpumu kaste.

Dažādu veidu neironu tīkla paraugi

Reizēm ML var šķist līdzīgs tīkla modeļa izstrādei, lai tas atbilstu modeļiem.

Neironu tīkli ir dažādās formās un formās.

Dažāda veida neironu tīkla struktūras ir piemērotas, lai risinātu noteikta veida problēmas, kas saistītas ar to struktūru.

Labi - bet kā mēs rakstām kodu?

Tas bija daudz teorijas.

Bet kā mēs to īstenojam kodā?

Lai sāktu, varat izmantot tādu bibliotēku kā Tensorflow.js.

Bet tas neko labu nedos, jo vēl ir tik daudz ko segt.

Labi - bet kā tas dod nozīmīgus rezultātus?

Līdz šim esam apsprieduši neironu tīkla struktūru.

Mēs runājām par aktivizācijas funkcijām, datu ievadi un slēptajiem slāņiem.

Mēs runājām arī par svariem, kas tika nodoti simulētajiem savienojumiem un tiem tālāk.

Lai nelineārs mašīnmācīšanās algoritms sniegtu saprātīgu rezultātu, tas vispirms jāapmāca, izmantojot iepriekš izveidotu datu kopu.

Jūs vienmēr sākat ar datu izvēli, lai apmācītu AI algoritmu.

Tas ir atkarīgs no tā, kādu problēmu jūs mēģināt atrisināt.

Ja vēlaties atpazīt numurus attēlā, jūs sākat ar ciparu attēliem.

Ciparu atpazīšana no ekrānuzņēmuma

Klasiskais AI piemērs ir iemācīt neironu tīklam atpazīt ciparus no 0 līdz 9. Tādā pašā veidā, kā jūs varat apmācīt mašīnas algoritmu, lai atpazītu A – Z burtus vai pat cilvēka sejas daļas - aci vai muti uz fotogrāfija attēlo arī noteiktu formas vai modeļa veidu, kas ir kopīgs visiem cilvēkiem, bet varētu parādīties nedaudz atšķirīgs.

Atcerieties, ka viss, ar ko mēs šeit nodarbojamies, ir paraugi.

Ja algoritms atpazīst modeli, tas nekad nav 100% atbilstošs. Bet, jo tuvāk mēs varam sasniegt 1,0 (100%), jo ticamāk, ka meklētā forma atspoguļo to, ko tā ir apmācījusi atpazīt.

Ja mēs izmantotu standarta fontu, mums pat nebūtu jādara neviens AI darbs. Mēs varētu vienkārši noskenēt katru ciparu, lai iegūtu precīzu pikseļu paraugu. Bet AI galvenais punkts ir apzināties nezināmības modeli.

Pirmkārt, mums ir jābūt sava veida videi, ko izmantos kā apmācības datu daļu. Katru ciparu var attēlot ar attēlu:

Tie paši cipari, kas rakstīti vairākas reizes, rada nedaudz atšķirīgu modeli. Attēls ņemts no JavaScript AI demonstrācijas, kas atrodas vietnē http://myselph.de/neuralNet.html

Katru ciparu var viegli atpazīt pēc redzamības. Bet AI algoritms ir jāapmāca, lai atpazītu līdzīgus modeļus, jo, kamēr tie ir līdzīgi, tie joprojām nav 100% identiski.

Lai to sasniegtu, mēs varam sadalīt primāro modeli mazākos blokos un ieviest kaut ko, ko dēvē par funkciju ekstrahēšanu.

Funkciju ieguve

Lai identificētu ciparu, algoritms ievieš funkciju ekstrahēšanas sistēmu, kas iedala kopējos modeļus līdzībās, kas attiecas uz pilnīga cipara / simbola / burta / utt. Konstruēšanu.

Raksta būtība nemainās. Piemēram, 0 lielākoties ir aplis - jūs varat to sadalīt mazākos modeļos ar arku katrā pusē:

Ja mēs varam tikai apmācīt savu algoritmu, lai atpazītu šos 4 unikālos modeļus un pārbaudītu to klātbūtni attēla lokalizētajā apgabalā, mēs varam aprēķināt noteiktības pakāpi, ar kādu var teikt, ka tā varētu būt nulle.

Citiem cipariem tas pats. Piemēram, 1. cipars ir viena vertikāla josla. Vai varbūt ar mazāku līniju ar nelielu leņķi augšpusē.

Skaitlis 2 ir puse apļa augšpusē, pa diagonāli un horizontāli.

Skaitli 3 var sadalīt divos pusarku modeļos.

Skaitli 4 var uzskatīt par 3 līnijām: vertikāli, horizontāli un pa diagonāli.

…un tā tālāk.

Ko darīt, ja tas ir ar roku rakstīts cipars? Tam joprojām ir tās pašas šī cipara īpašības: vienādas malas, vienādas cilpas.

Ko darīt, ja cipars parādās uz ātruma ierobežojuma izrakstīšanās uz ielas no netieša leņķa uz fotoattēla? Līdzīgi kā mūsu pašu redzējumam, AI vajadzētu būt spējīgam pielāgoties noteikta veida kļūdu terminam.

Vai tas ir pieci, trīs vai astoņi?

Izmēģiniet šo AI JavaScript demonstrāciju, kas ļauj kaut ko uzzīmēt uz ekrāna un iepriekš apmācītam algoritmam pateikt, ko jūs tikko uzzīmējāt.

Algoritms centīsies sniegt jums vislabāko rezultātu pat tad, ja tas, ko jūs zīmējat, nav īsts cipars. Joprojām darbā var redzēt mākslīgo intelektu, cenšoties sniegt vistuvāko tuvinājumu, kādu tas spēj uzkrāt.

Kā izskatās apmācītais komplekts?

Šeit ir apmācības datu fragments no algoritma. Tas ir tikai to svaru saraksts, kas glabājas ļoti garā masīvā (tūkstošiem vērtību):

// Neironu tīkla svari (vienības-vienības svari un vienības nobīdes) // apmācība tika veikta Matlab ar MNIST datu kopu.
// šie dati ir par 784-200-10 vienību ar loģistikas nelinearitāti
// slēptajā un softmax izvades slānī. Ievade ir a
// [-1; 1] pelēka līmeņa attēls, fons == 1, linearizēts 28x28 pikseļi
// kolonnu secībā (t.i., 1. kolonna (:); 2. kolonna (:); ...) i-tā izeja
// ir maksimālais, nozīmē, ka tīkls domā, ka ieeja kodē
(i-1) zemāk norādītie svari testā uzrādīja 1,92% kļūdu līmeni
// datu kopa (9808/10000 cipari ir pareizi atpazīti).
ļaujiet 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, 0131 036 0, 0 0 1 , 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.00755215, 0.0353843.
/ * ... Tūkstošiem svaru vairāk seko ... * /

Pilns avota kods neiederētos šajā rakstā. Bet komplekti parasti ir diezgan gari pat tiem, kas šķiet triviāli testi.

Attēla gleznošana neironu tīklā

Šis koda kods tika ņemts no atpazīšanas () funkcijas, kas ierakstīta JavaScript.

Tas tika ņemts no demonstrācijas vietnē http://myselph.de

Šeit varat apskatīt visu avota kodu.

// vizualizēšanai / atkļūdošanai: krāsojiet ievadi neironu tīklā. if (document.getElementById ('preprocessing'). pārbaudīts == true)
{
    ctx.clearRect (0, 0, audekla platums, audekla augstums);
    ctx.drawImage (copyCtx.canvas, 0, 0);
    par (var y = 0; y <28; y ++) {
        priekš (var x = 0; x <28; x ++) {
           var bloķēt = ctx.getImageData (x * 10, y * 10, 10, 10);
           var newVal = 255 * (0,5 - nnInput [x * 28 + y] / 2);
           priekš (var i = 0; i <4 * 10 * 10; i + = 4) {
               block.data [i] = newVal;
               block.data [i + 1] = newVal;
               block.data [i + 2] = newVal;
               block.data [i + 3] = 255;
           }
       ctx.putImageData (bloks, x * 10, y * 10);
       }
   }
}

Daļējs koda gabals “ielīmē” attēla ievadi (brīvas rokas zīmējums), kas iepriekš tika sadalīts 10 x 10 blokos, saglabājot vidējās pelēktoņu vērtības šai attēla zonai.

Pēc tam tas pārbaudīs to ar apmācīto komplektu un pēc summu un / vai vidējo salīdzinājumu salīdzināšanas atgriezīs rezultāta iespējamību attiecībā uz to, cik precīzi jūsu HTML audekla zīmējums atbilst noteiktam skaitlim.

Nobeiguma vārdi

Mākslīgais intelekts ir plašs priekšmets. Katru dienu iznāk dažādu veidu mašīnmācīšanās modeļi un konsultācijas. Šī apmācība būtu jāizmanto tikai kā ievads kādam, kurš tikai sāk darbu!

Sekojiet man Twitter vietnē par bezmaksas grāmatu dāvanām

Paņemiet līdzi CSS vizuālās vārdnīcas kopiju. visu CSS īpašību diagrammas.

Twitter vietnē Paisuma vilnis ir konts, kas manas grāmatas atdod par brīvu.

Sekojiet man on @ js_tut, kur es ievietoju freemium JavaScript apmācības.