AI og maskinlæring: Hvordan man lærer dem visuelt

Jeg oprettede denne tutorial som et entry-level stykke om kunstig intelligens.

Ethvert nyt emne skal præsenteres på sprog, der matcher den studerendes evneriveau på det tidspunkt. Så forvent ikke skøre matematiske formler endnu.

Vi vil især se på Machine Learning alias Deep Learning.

Dybden på et neuralt netværk bestemmes af antallet af inputlag.

Maskinlæringsalgoritmer vejer sandsynligheden for et bestemt datasæt i forhold til et specifikt mønster.

Tænker i områder

Neuroner i din hjerne er bestemt ikke digitale, men de ligner binær logik som enten til eller fra tilstand. Men i software bruger vi i stedet en række værdier.

Resultatet af en beregningscyklus i en AI-operation er et præcisionsestimat i området mellem 0,0 - 1,0. I sidste ende - der produceres en outputværdi baseret på hvor godt inputdata matcher et specifikt mønster, hvor 1,0 er 100% matchende (du når sjældent det, men 0,95 - 0,97 er godt.)

Dette mønster trænes normalt, før der kan frembringes meningsfulde resultater. Mere om dette lidt senere i denne tutorial. Men først er her ML på sit mest basale.

Det hele begynder med neurale netværk - en softwareimitation af neuronernes fysiske struktur i en hjerne.

Enkel neurale netværksstruktur

Maskinlæring i sin mest basale form - et meget simpelt neuralt netværk.

I dette minimalistiske eksempel vises et inputlag bestående af 3 inputnoder.

Et flere sæt input pr. Lag er normalt tilvejebragt. Hvert input samles fra en slags kilde. Som en matrix af pixels fra et billede, der bruges til ansigtsgenkendelse, for eksempel / eller andre data. Det afhænger af formålet med, hvad du prøver at opnå med din AI-algoritme.

Både input- og outputværdier er flydende pt. numre mellem 0,0 og 1,0.

Logistisk føres data under netværksdrift fra venstre mod højre. Dog ... Tilbageudbredelse bruges undertiden til at optimere det neurale netværk. Det er når vi rejser rundt i netværket. Men i øjeblikket behøver vi ikke bekymre os om det.

Sum

Summen af ​​flere indtastningsnoder er bare, hvad det lyder som. Det er den samlede sum af vægtene fra hver knude fra det forrige inputlag. Efter beregning af summen overføres den derefter til aktiveringsfunktionen til behandling.

Aktiveringsfunktion

Aktiveringsfunktionen konverterer summen af ​​inputværdier til en outputværdi.

Men hvordan fungerer det nøjagtigt?

Vi er nødt til at se på et andet aspekt af maskinlæring.

Kan du huske de matematiske ligninger fra gymnasiet? Parabolas - nogen?

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

En aktiveringsfunktion er bogstaveligt talt kun en matematisk ligning. Så for dem med en matematisk baggrund kan dette muligvis være lidt lettere at forstå. Hvis ikke - læs videre til de visuelle diagrammer og resten af ​​denne tutorial, så det begynder at synke ind!

Årsag til, at vi ikke kan bruge enkle lineære ligninger, skyldes deres begrænsninger.

De er ikke tilstrækkelige til at oprette nyttige neurale netværk.

Neurale netværk er designet omkring mere komplekse ligninger. F.eks. Er funktionen Sigmoid (også kendt som logistisk) ganske almindelig. (Vi ser på et par forskellige i afsnittet nedenfor).

De tager alle form af f (x) = ... og knaster derefter x-værdien på en måde, der er unik for denne funktion. Hvorfor dette betyder noget, og hvorfor vi har forskellige AF-funktioner, vil blive tydeligere lidt senere.

Hvad sker der, når vi har fået vores resultat?

AF overfører beregnet værdi til den næste knude og i det væsentlige som delvis input til en af ​​aktiveringsfunktionerne i en knude i det næste indgangssæt.

Du kan tænke på det som at tage et sæt flere input. Og overfører den beregnede værdi til den næste knude. Det er værdiporten mellem input-sæt.

Forskellige typer aktiveringsfunktioner

Ligesom der er forskellige typer matematiske ligninger ... der er forskellige typer aktiveringsfunktioner.

Nøjagtigt hvordan de knuser tal for at nå frem til den endelige outputværdi er tæt relateret til uddannelse af et eksisterende netværk først. Så vi kan ikke gå så dybt ind i emnet endnu, fordi systemet generelt ikke er baseret på noget så simpelt som at beregne og returnere et numerisk resultat.

Men hvad vi kan gøre - for at uddybe vores forståelse hidtil - er at se på den visuelle repræsentation af hver matematisk ligning bag forskellige aktiveringsfunktioner!

Dette er en visuel tutorial. Og for at give dig en grundlæggende idé om, hvad du vil kæmpe med her, er en tabel over det klassiske sæt matematisk ligninger, som mange klassiske aktiveringsfunktioner kan være baseret på.

Den mest basale AF er repræsenteret ved f (x) = x eller identitetsfunktionen.

Et par grundlæggende velkendte matematiske formler.

Der er flere andre. Men de er lidt mere komplekse.

Grundlæggende bruges disse funktioner til at bestemme den resulterende knudeværdi.

Hvordan præcist bestemmer en aktiveringsfunktion dens værdi?

Det er, hvad en AF er. Det indtaster et input i form af et tal og producerer en returværdi mellem 0,0-1,0 (undertiden er området +/- uendelig). De aktuelle formler er beskrevet ovenfor. Du kan skrive disse ligninger igen som funktioner i Python, JavaScript eller et hvilket som helst andet programmeringssprog.

Hvis du er i matematik og har meget tid på dine hænder, vil du elske at skrive disse funktioner ud i kode! Men ofte behøver du ikke. Og det skyldes, at allerede eksisterende A.I. biblioteker tager sig af det for dig. På denne måde kan du fokusere på at opbygge dit neurale netværk og træne det til et specifikt formål.

Hver knude bærer en beregnet vægt

Så disse aktiveringsfunktioner giver en værdi.

Den vigtigste ting at bemærke på dette tidspunkt - hvert punkt er en vægt.

Denne vægt måler sandsynligheden for, at et bestemt mønster blev matchet.

Men flere lag med input-sæt er mulige, som vist i det næste eksempel.

Koder i et lidt mere avanceret neuralt netværk forbundet til hinanden.

Hver enkelt knude kommunikerer med hver enkelt knude i det næste inputlag, der udgør denne tværbundne kommunikationsvej.

Antallet af elementer i hvert lag er vilkårligt. Det behøver ikke at være det samme tal som vist i diagrammet ovenfor. Afhængigt af hvilket problem du prøver at løse.

Det kræver en vis intuition og kreativitet at bestemme antallet af input-noder, du vil bruge i hvert lag. Men selv at løse det samme problem kan opnås ved forskellige neurale netværksstrukturer.

På grund af beregningenes ikke-lineære karakter er denne proces tvetydig.

Skjulte lag

Vi har netop diskuteret, hvordan et neuralt netværk kan have flere inputlag. De kan betragtes som lodrette rækker af knudepunkter.

Alle de indre lag mellem den første indgangsrække og outputnoden kaldes ofte skjulte lag. Det giver mening, fordi det er her, det meste af det grimme AI-behandlingsarbejde udføres. Grundlæggende er det AI-mysteriumboksen.

Forskellige typer af neurale netværksmønstre

Til tider kan ML virke meget som at skabe et netværksmønster, der passer til mønstre.

Neurale netværk findes i forskellige former og former.

Forskellige typer af neurale netværksstrukturer er mere egnede til at løse bestemte typer problemer forbundet med deres struktur.

OK - Men hvordan skriver vi koden?

Det var meget teori.

Men hvordan implementerer vi det egentlig i kode?

Du kan bruge et bibliotek som Tensorflow.js til at komme i gang.

Men det gør ikke noget godt, fordi der stadig er så meget at dække.

OK - Men hvordan giver det meningsfulde resultater?

Vi har diskuteret strukturen af ​​et neuralt netværk indtil dette punkt.

Vi talte om aktiveringsfunktioner, dataindgange og skjulte lag.

Vi talte også om vægte, der blev sendt frem og tilbage til de simulerede forbindelser.

For at en ikke-lineær maskinlæringsalgoritme kan producere et fornuftigt resultat, skal det først trænes i et sæt af eksisterende data.

Du starter altid med at vælge data til at træne din AI-algoritme.

Det afhænger af, hvilket problem du prøver at løse.

Hvis du vil genkende numre i et billede, starter du med billeder med cifre.

Genkendelse af numre fra et skærmbillede

Det klassiske AI-eksempel er at lære et neuralt netværk at genkende tal mellem 0 - 9. På samme måde som du kan træne en maskinalgoritme til at genkende A-Z-bogstaver eller endda dele af et menneskeligt ansigt - et øje eller en mund på en fotografi repræsenterer også en bestemt type form eller mønster, der er fælles for alle mennesker, men som kan synes lidt anderledes.

Husk, at alt, hvad vi har at gøre med her, er mønstre.

Når algoritmen genkender et mønster, er det aldrig et 100% match. Men jo tættere vi kan komme 1,0 (100%), desto mere sandsynligt repræsenterer den form, vi leder efter, hvad den blev trænet til at genkende.

Hvis vi brugte en standard font, ville vi ikke engang skulle udføre noget AI-arbejde. Vi kunne blot scanne hvert ciffer for nøjagtigt pixelmønster. Men det vigtigste punkt med AI er at genkende et mønster i uklarhed.

Først skal vi have en form for et medium, der vil blive brugt som et stykke træningsdata. Hvert ciffer kan repræsenteres af et billede:

De samme cifre skrevet flere gange giver lidt anderledes mønster. Billedet taget fra JavaScript AI-demoen, der findes på http://myselph.de/neuralNet.html

Du kan nemt genkende hvert ciffer ved synet. Men en AI-algoritme skal trænes til at genkende lignende mønstre, fordi mens de er ens, er de stadig ikke 100% identiske.

For at opnå dette kan vi opdele det primære mønster i mindre blokke og implementere noget, der kaldes funktionsekstraktion.

Funktionsekstraktion

For at identificere et ciffer implementerer algoritmen et funktionsekstraktionssystem, der opdeler fælles mønstre til modstykker, der er relevante for konstruktion af det komplette ciffer / symbol / bogstav / osv.

Essensen af ​​et mønster forbliver den samme. For eksempel er 0 for det meste en cirkel - du kan opdele den i mindre mønstre med en bue på hver af siderne:

Hvis vi kun kan træne vores algoritme til at genkende disse 4 unikke mønstre og kontrollere for deres tilstedeværelse inden for et lokaliseret område af et billede, kan vi beregne mængden af ​​sikkerhed, som det kan siges, at det kan være et nul.

Det er det samme for andre cifre. For eksempel er ciffer 1 en enkelt lodret bjælke. Eller måske med en mindre linje i en svag vinkel øverst.

Nummer 2 er en halv cirkel på toppen, en diagonal linje og en vandret linje.

Nummer 3 kan opdeles i to halvbuer.

Nummer 4 kan betragtes som 3 linjer: lodret, vandret og diagonalt.

…og så videre.

Hvad hvis det er et håndskrevet ciffer? Det har stadig de samme egenskaber som det ciffer: de samme kanter, de samme sløjfer.

Hvad hvis cifferet vises på en hastighedsbegrænsning på gaden fra en indirekte vinkel på et fotografi? Ligesom vores egen vision skulle AI være i stand til at rumme for en eller anden type fejlbegivenhed.

Er dette en fem, tre eller otte?

Prøv denne AI JavaScript-demo, der giver dig mulighed for at tegne noget på skærmen og få den foruddannede algoritme til at fortælle dig, hvad du lige tegnet.

Algoritmen vil forsøge at give dig det bedste match, selvom det, du tegner, ikke rigtig er et tal. Stadig kan du se kunstigt intellekt på arbejdet med at forsøge at give den nærmeste tilnærmelse, det kan mønstre.

Hvordan ser det uddannede sæt ud?

Her er et uddrag af træningsdataene fra algoritmen. Det er bare en liste over vægte, der er gemt i en meget lang række (tusinder af værdier):

// Neuralnetværkets vægte (enheds-enhedsvægte og enhedsfordelinger) // Træning blev udført i Matlab med MNIST-datasættet.
// disse data er for en 784-200-10 enhed med logistisk ikke-linearitet
// i det skjulte og softmax i outputlaget. Indgangen er en
// [-1; 1] gråt niveau billede, baggrund == 1, 28x28 pixels lineariseret
// i kolonne rækkefølge (dvs. kolonne1 (:); kolonne2 (:); ...) i-th output
// at være det maksimale betyder, at netværket mener, at inputkoderne er kodet
// (i-1) vægtene nedenfor viste en 1,92% fejlprocent på testen
// datasæt (9808/10000 cifre genkendt korrekt).
lad 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,006 0,008, 0,008, 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, 0,0297246,
/ * ... tusinder vægter mere følger ... * /

Den komplette kildekode passer ikke ind i denne artikel. Men sætene er normalt ret lange, selv for hvad der synes at være trivielle test.

Maling af billedinput i neuralt net

Denne bit kode blev hentet fra genkend () -funktionen skrevet i JavaScript.

Det blev taget fra demoen på http://myselph.de

Du kan tjekke hele kildekoden her.

// til visualisering / fejlsøgning: male input til det neurale net. if (document.getElementById ('forbehandling'). markeret == sand)
{
    ctx.clearRect (0, 0, lærred. bredde, lærred. højde);
    ctx.drawImage (copyCtx.canvas, 0, 0);
    for (var y = 0; y <28; y ++) {
        for (var x = 0; x <28; x ++) {
           var-blok = ctx.getImageData (x * 10, y * 10, 10, 10);
           var nyVal = 255 * (0,5 - nnInput [x * 28 + y] / 2);
           for (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 (blok, x * 10, y * 10);
       }
   }
}

Dette delvise stykke kode “indsætter” billedindgangen (en frihåndstegning), der tidligere var opdelt i 10 x 10 blokke, der gemmer gennemsnitlige gråtoneværdier for det område af billedet.

Det vil derefter kontrollere det mod det træne sæt, og efter at have sat summen / og gennemsnitlige sammenligninger imod det, vil sandsynligheden for resultatet blive returneret med hensyn til, hvor tæt din HTML lærredstegning matcher et bestemt ciffer.

Afsluttende ord

Kunstig intelligens er et stort emne. Der er forskellige typer maskinindlæringsmønstre og tutorials der kommer ud hver dag. Denne tutorial skal kun tjene som en introduktion til en person, der lige er startet!

Følg mig på Twitter for gratis bog Giveaways

Grib din kopi af CSS Visual Dictionary inkl. diagrammer over alle CSS-egenskaber.

På Twitter Tidal Wave er den konto, der giver mine bøger gratis.

Følg mig på @ js_tut, hvor jeg poster freemium JavaScript-tutorials.