Site Overlay

Maskinlæring er sjovt! Del 3: Dyb indlæring og konvolutionelle neurale netværk

Vi kan træne denne type neurale netværk på få minutter på en moderne bærbar computer. Når det er færdigt, vil vi have et neuralt netværk, der kan genkende billeder af “8 “er med en ret høj nøjagtighed. Velkommen til en verden af billedgenkendelse (fra slutningen af 1980’erne)

Tunnel Vision

Det er virkelig fedt, at det rent faktisk har virket at indlæse pixels i et neuralt netværk for at opbygge billedgenkendelse! Maskinlæring er magisk! …ikke sandt?

Jamen, så enkelt er det selvfølgelig ikke.

Først er den gode nyhed, at vores “8”-genkender virkelig fungerer godt på simple billeder, hvor bogstavet er lige midt i billedet:

Men nu de rigtig dårlige nyheder:

Vores “8”-genkendelsesprogram fungerer slet ikke, når bogstavet ikke er helt centreret i billedet. Bare den mindste positionsændring ødelægger alt:

Dette skyldes, at vores netværk kun har lært mønstret for et perfekt centreret “8”. Det har absolut ingen idé om, hvad en excentrisk “8” er. Det kender præcis ét mønster og kun ét mønster.

Det er ikke særlig nyttigt i den virkelige verden. Problemer i den virkelige verden er aldrig så rene og enkle. Så vi må finde ud af, hvordan vi får vores neurale netværk til at fungere i tilfælde, hvor “8’eren” ikke er perfekt centreret.

Brute Force-idé nr. 1: Søgning med et skydevindue

Vi har allerede skabt et rigtig godt program til at finde en “8” centreret i et billede. Hvad nu hvis vi bare scanner hele vejen rundt om billedet for mulige “8 “er i mindre sektioner, en sektion ad gangen, indtil vi finder en?

Denne fremgangsmåde kaldes et glidende vindue. Det er den brute force-løsning. Den fungerer godt i nogle begrænsede tilfælde, men den er virkelig ineffektiv. Du er nødt til at kontrollere det samme billede igen og igen for at finde objekter af forskellig størrelse. Vi kan gøre det bedre end dette!

Brute Force-idé nr. 2: Flere data og et dybt neuralt netværk

Da vi trænede vores netværk, viste vi det kun “8 “er, der var perfekt centreret. Hvad hvis vi træner det med flere data, herunder “8 “s i alle forskellige positioner og størrelser rundt omkring på billedet?

Vi behøver ikke engang at indsamle nye træningsdata. Vi kan bare skrive et script til at generere nye billeder med “8 “erne i alle mulige forskellige positioner i billedet:

Vi skabte syntetiske træningsdata ved at skabe forskellige versioner af de træningsbilleder, vi allerede havde. Dette er en meget nyttig teknik!

Med denne teknik kan vi nemt skabe en uendelig mængde træningsdata.

Mere data gør problemet sværere for vores neurale netværk at løse, men det kan vi kompensere for ved at gøre vores netværk større og dermed i stand til at lære mere komplicerede mønstre.

For at gøre netværket større stabler vi bare lag på lag af knuder:

Vi kalder dette et “dybt neuralt netværk”, fordi det har flere lag end et traditionelt neuralt netværk.

Denne idé har eksisteret siden slutningen af 1960’erne. Men indtil for nylig var det simpelthen for langsomt at træne et så stort neuralt netværk til at være nyttigt. Men da vi først fandt ud af, hvordan vi kunne bruge 3d-grafikkort (som var designet til at lave matrixmultiplikation virkelig hurtigt) i stedet for normale computerprocessorer, blev det pludselig praktisk at arbejde med store neurale netværk. Faktisk kan præcis det samme NVIDIA GeForce GTX 1080-videokort, som du bruger til at spille Overwatch, bruges til at træne neurale netværk utroligt hurtigt.

Men selv om vi kan gøre vores neurale netværk rigtig stort og træne det hurtigt med et 3d-grafikkort, vil det stadig ikke føre os hele vejen til en løsning. Vi er nødt til at være klogere på, hvordan vi behandler billederne i vores neurale netværk.

Tænk over det. Det giver ikke mening at træne et netværk til at genkende et “8” øverst i et billede separat fra at træne det til at genkende et “8” nederst i et billede, som om det var to helt forskellige objekter.

Der burde være en måde at gøre det neurale netværk smart nok til at vide, at et “8” hvor som helst i billedet er den samme ting uden al den ekstra træning. Det er der heldigvis!

Løsningen er konvolution

Som menneske ved man intuitivt, at billeder har et hierarki eller en konceptuel struktur. Overvej dette billede:

Gratuitous picture of my son

Som menneske genkender du øjeblikkeligt hierarkiet i dette billede:

  • Grunden er dækket af græs og beton
  • Der er et barn
  • Barnet sidder på en hoppepude
  • Shoppepuden er oven på græsset

Det vigtigste er, at vi genkender ideen om et barn, uanset hvilken overflade barnet befinder sig på. Vi behøver ikke at genindlære ideen om barn for hver mulig overflade, det kan optræde på.

Men lige nu kan vores neurale netværk ikke gøre dette. Det tror, at et “8” i en anden del af billedet er en helt anden ting. Det forstår ikke, at det at flytte et objekt rundt i billedet ikke gør det til noget andet. Det betyder, at det er nødt til at genindlære identifikationen af hvert objekt i alle mulige positioner. Det er noget lort.

Vi skal give vores neurale netværk forståelse for translationsinvarians – et “8” er et “8”, uanset hvor i billedet det dukker op.

Vi gør det ved hjælp af en proces, der kaldes konvolution. Ideen om konvolution er inspireret dels af datalogi og dels af biologi (dvs. gale videnskabsmænd, der bogstaveligt talt puttede i kattehjerner med mærkelige sonder for at finde ud af, hvordan katte behandler billeder).

Hvordan konvolution fungerer

I stedet for at indlæse hele billeder i vores neurale netværk som ét gitter af tal vil vi gøre noget meget smartere, der udnytter idéen om, at et objekt er det samme, uanset hvor det vises i et billede.

Her er hvordan det kommer til at fungere, trin for trin –

Stræk 1: Opdel billedet i overlappende billedfliser

Som vores glidende vinduessøgning ovenfor, skal vi lade et glidende vindue passere over hele det oprindelige billede og gemme hvert resultat som en separat, lille billedflise:

Derved har vi forvandlet vores originale billede til 77 små billedfliser af samme størrelse.

Strin 2: Indfør hver enkelt billedflise i et lille neuralt netværk

Forrige indførte vi et enkelt billede i et neuralt netværk for at se, om det var et “8-tal”. Vi gør nøjagtig det samme her, men vi gør det for hver enkelt billedflise:

Gentag dette 77 gange, én gang for hver flise.

Der er dog et stort twist: Vi beholder de samme neurale netværksvægte for hver enkelt flise i det samme originale billede. Med andre ord behandler vi alle billedfliser lige meget. Hvis der vises noget interessant i en given flise, markerer vi den pågældende flise som interessant.

Stræk 3: Gem resultaterne fra hver flise i et nyt array

Vi ønsker ikke at miste overblikket over arrangementet af de oprindelige fliser. Så vi gemmer resultatet fra behandlingen af hver flise i et gitter i samme arrangement som det oprindelige billede. Det ser således ud:

Med andre ord har vi startet med et stort billede og er endt med et lidt mindre array, der registrerer, hvilke dele af vores oprindelige billede der var de mest interessante.

Strin 4: Downsampling

Resultatet af trin 3 var et array, der kortlægger, hvilke dele af det oprindelige billede, der er de mest interessante. Men dette array er stadig ret stort:

For at reducere arrayets størrelse, downsample vi det ved hjælp af en algoritme kaldet max pooling. Det lyder fancy, men det er det slet ikke!

Vi kigger bare på hvert 2×2 kvadrat i arrayet og beholder det største tal:

Tanken her er, at hvis vi har fundet noget interessant i en af de fire inputfliser, der udgør hvert 2×2 gitterkvadrat, beholder vi bare den mest interessante bit. Dette reducerer størrelsen af vores array, mens vi beholder de vigtigste bits.

Sidste trin: Foretag en forudsigelse

Så langt har vi reduceret et gigantisk billede ned til et ret lille array.

Guess what? Det array er bare en masse tal, så vi kan bruge det lille array som input til et andet neuralt netværk. Dette endelige neurale netværk vil afgøre, om billedet er et match eller ej. For at adskille det fra konvolutionstrinnet kalder vi det et “fuldt forbundet” netværk.

Så fra start til slut ser hele vores pipeline i fem trin således ud:

Og vi tilføjer endnu flere trin

Vores billedbehandlingspipeline er en række trin: konvolution, max-pooling og til sidst et fuldt forbundet netværk.

Når du løser problemer i den virkelige verden, kan disse trin kombineres og stables lige så mange gange, som du vil! Du kan have to, tre eller endda ti konvolutionslag. Du kan smide max pooling ind, hvor du vil, for at reducere størrelsen af dine data.

Den grundlæggende idé er at starte med et stort billede og hele tiden koge det ned, trin for trin, indtil du til sidst har et enkelt resultat. Jo flere konvolutionstrin du har, jo mere komplicerede funktioner vil dit netværk være i stand til at lære at genkende.

Det første konvolutionstrin kan f.eks. lære at genkende skarpe kanter, det andet konvolutionstrin kan genkende næb ved hjælp af sin viden om skarpe kanter, det tredje trin kan genkende hele fugle ved hjælp af sin viden om næb, osv.

Her er, hvordan et mere realistisk dybt konvolutionelt netværk (som du ville finde i en forskningsartikel) ser ud:

I dette tilfælde starter de et billede på 224 x 224 pixel, anvender konvolution og max pooling to gange, anvender konvolution tre gange mere, anvender max pooling og har derefter to fuldt forbundne lag. Slutresultatet er, at billedet klassificeres i en af 1000 kategorier!

Konstruktion af det rigtige netværk

Så hvordan ved du, hvilke trin du skal kombinere for at få din billedklassifikator til at virke?

Honestly, you have to answer this by doing a lot of experimentation and testing. Du skal måske træne 100 netværk, før du finder den optimale struktur og de optimale parametre til det problem, du løser. Maskinlæring indebærer en masse forsøg og fejl!

Bygning af vores fugleklassifikator

Nu ved vi endelig nok til at skrive et program, der kan afgøre, om et billede er en fugl eller ej.

Som altid har vi brug for nogle data for at komme i gang. Det gratis CIFAR10-datasæt indeholder 6.000 billeder af fugle og 52.000 billeder af ting, der ikke er fugle. Men for at få endnu flere data vil vi også tilføje Caltech-UCSD Birds-200-2011 datasættet, som indeholder yderligere 12.000 fuglebilleder.

Her er nogle få fugle fra vores kombinerede datasæt:

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.