Site Overlay

Maskininlärning är roligt! Del 3: Djupinlärning och konvolutionella neurala nätverk

Vi kan träna den här typen av neurala nätverk på några minuter på en modern bärbar dator. När det är klart har vi ett neuralt nätverk som kan känna igen bilder av ”8:or” med ganska hög noggrannhet. Välkommen till en värld av bildigenkänning (från slutet av 1980-talet)!

Tunnelvision

Det är verkligen häftigt att det faktiskt fungerade att bara mata in pixlar i ett neuralt nätverk för att bygga upp bildigenkänning! Maskininlärning är magiskt! …eller hur?

Nja, så enkelt är det förstås inte.

För det första är den goda nyheten att vår ”8”-igenkänning verkligen fungerar bra på enkla bilder där bokstaven står mitt i bilden:

Men nu de riktigt dåliga nyheterna:

Vår ”8”-igenkänning misslyckas helt och hållet när bokstaven inte är helt centrerad i bilden. Bara den minsta positionsförändring förstör allt:

Detta beror på att vårt nätverk bara lärt sig mönstret för en perfekt centrerad ”8”. Det har absolut ingen aning om vad en ocentrisk ”8” är. Det känner till exakt ett mönster och endast ett mönster.

Det är inte särskilt användbart i den verkliga världen. Problemen i den verkliga världen är aldrig så rena och enkla. Så vi måste ta reda på hur vi ska få vårt neurala nätverk att fungera i fall där ”8:an” inte är perfekt centrerad.

Brute Force Idé nr 1: Sökning med ett skjutfönster

Vi har redan skapat ett riktigt bra program för att hitta en ”8:an” som är centrerad i en bild. Vad händer om vi bara söker runt hela bilden efter möjliga ”8:or” i mindre sektioner, en sektion i taget, tills vi hittar en?

Detta tillvägagångssätt kallas för ett glidande fönster. Det är en brute force-lösning. Det fungerar bra i vissa begränsade fall, men det är verkligen ineffektivt. Du måste kontrollera samma bild om och om igen för att leta efter objekt i olika storlekar. Vi kan göra bättre än så!

Brute Force Idé nr 2: Mer data och ett djupt neuralt nät

När vi tränade vårt nätverk visade vi det bara ”8:or” som var perfekt centrerade. Vad händer om vi tränar det med fler data, inklusive 8:or i alla olika positioner och storlekar runt om i bilden?

Vi behöver inte ens samla in nya träningsdata. Vi kan bara skriva ett skript som genererar nya bilder med ”8:or” i alla möjliga olika positioner i bilden:

Vi skapade syntetiska träningsdata genom att skapa olika versioner av de träningsbilder som vi redan hade. Detta är en mycket användbar teknik!

Med hjälp av denna teknik kan vi enkelt skapa en oändlig mängd träningsdata.

Mer data gör problemet svårare för vårt neurala nätverk att lösa, men vi kan kompensera detta genom att göra vårt nätverk större och därmed kunna lära oss mer komplicerade mönster.

För att göra nätverket större staplar vi bara upp lager på lager av noder:

Vi kallar detta för ett ”djupt neuralt nätverk” eftersom det har fler lager än ett traditionellt neuralt nätverk.

Den här idén har funnits sedan slutet av 1960-talet. Men fram till nyligen var det helt enkelt för långsamt att träna ett så här stort neuralt nätverk för att det skulle vara användbart. Men när vi väl kom på hur man kan använda 3d-grafikkort (som var utformade för att göra matrismultiplikationer riktigt snabbt) i stället för vanliga datorprocessorer blev det plötsligt praktiskt att arbeta med stora neurala nätverk. Faktum är att exakt samma NVIDIA GeForce GTX 1080-videokort som du använder för att spela Overwatch kan användas för att träna neurala nätverk otroligt snabbt.

Men trots att vi kan göra vårt neurala nätverk riktigt stort och träna det snabbt med ett 3d-grafikkort, så kommer det fortfarande inte att leda oss hela vägen till en lösning. Vi måste vara smartare när det gäller hur vi bearbetar bilderna i vårt neurala nätverk.

Tänk efter. Det är inte vettigt att träna ett nätverk att känna igen en ”8” högst upp i en bild separat från att träna det att känna igen en ”8” längst ner i en bild som om det vore två helt olika objekt.

Det borde finnas något sätt att göra det neurala nätverket tillräckligt smart för att veta att en ”8” var som helst i bilden är samma sak utan all den extra träningen. Som tur är finns det ett sådant!

Lösningen är konvolution

Som människa vet du intuitivt att bilder har en hierarki eller konceptuell struktur. Tänk på den här bilden:

Gratuitous picture of my son

Som människa känner du omedelbart igen hierarkin i den här bilden:

  • Miljön är täckt av gräs och betong
  • Det finns ett barn
  • Barnet sitter på en hopphäst
  • Hopphästen är ovanpå gräset

Det viktigaste är att vi känner igen idén om ett barn, oavsett vilken yta barnet befinner sig på. Vi behöver inte lära oss idén om barn på nytt för varje tänkbar yta som det kan dyka upp på.

Men just nu kan vårt neurala nätverk inte göra detta. Det tror att en ”8” i en annan del av bilden är en helt annan sak. Det förstår inte att om man flyttar ett föremål runt i bilden blir det inte något annat. Detta innebär att det måste lära sig att identifiera varje objekt i alla möjliga positioner. Det suger.

Vi måste ge vårt neurala nätverk förståelse för translationsinvarians – en ”8” är en ”8” oavsett var i bilden den dyker upp.

Vi kommer att göra detta med hjälp av en process som kallas konvolution. Idén om konvolution är inspirerad dels av datavetenskap och dels av biologi (dvs. galna forskare som bokstavligen petar i katthjärnor med konstiga sonder för att ta reda på hur katter bearbetar bilder).

Hur konvolutionen fungerar

Istället för att mata in hela bilder i vårt neurala nätverk som ett rutnät av siffror kommer vi att göra något mycket smartare som drar nytta av idén om att ett objekt är detsamma oavsett var det dyker upp i en bild.

Här är hur det kommer att fungera, steg för steg –

Steg 1: Dela upp bilden i överlappande bildbrickor

Likt vår glidande fönstersökning ovan ska vi skicka ett glidande fönster över hela originalbilden och spara varje resultat som en separat, liten bildbricka:

Med hjälp av detta förvandlade vi vår originalbild till 77 lika stora små bildbrickor.

Steg 2: Mata in varje bildbricka i ett litet neuralt nätverk

Tidigare matade vi in en enda bild i ett neuralt nätverk för att se om det var en ”8”. Vi gör exakt samma sak här, men vi gör det för varje enskild bildbricka:

Upprepa detta 77 gånger, en gång för varje bricka.

Det finns dock en stor förändring: Vi behåller samma neurala nätverksvikter för varje enskild kakel i samma originalbild. Med andra ord behandlar vi varje bildruta lika. Om något intressant dyker upp i en viss bricka markerar vi den brickan som intressant.

Steg 3: Spara resultaten från varje bricka i en ny array

Vi vill inte förlora kontakten med arrangemanget av de ursprungliga brickorna. Därför sparar vi resultatet från bearbetningen av varje kakel i ett rutnät i samma arrangemang som originalbilden. Det ser ut så här:

Med andra ord har vi börjat med en stor bild och avslutat med en något mindre matris som registrerar vilka delar av vår ursprungliga bild som var mest intressanta.

Steg 4: Downsampling

Resultatet av steg 3 var en array som kartlägger vilka delar av den ursprungliga bilden som är mest intressanta. Men den matrisen är fortfarande ganska stor:

För att minska storleken på matrisen downsamplar vi den med hjälp av en algoritm som kallas max pooling. Det låter tjusigt, men det är det inte alls!

Vi tittar bara på varje 2×2 kvadrat i matrisen och behåller det största antalet:

Tanken är att om vi hittat något intressant i någon av de fyra inmatningsrutor som utgör varje 2×2 rutnätskvadrat, så behåller vi bara den mest intressanta biten. Detta minskar storleken på vår array samtidigt som vi behåller de viktigaste bitarna.

Slutsteget: Gör en förutsägelse

So långt har vi reducerat en gigantisk bild ner till en ganska liten array.

Gissa vad? Den matrisen är bara en massa siffror, så vi kan använda den lilla matrisen som indata till ett annat neuralt nätverk. Detta sista neurala nätverk kommer att avgöra om bilden är en matchning eller inte. För att skilja det från konvolutionssteget kallar vi det för ett ”fullt anslutet” nätverk.

Så från början till slut ser hela vår pipeline i fem steg ut så här:

Ansättande av ännu fler steg

Vår bildbehandlings-pipeline består av en serie steg: konvolution, max-pooling och till sist ett fullt anslutet nätverk.

När du löser problem i den verkliga världen kan dessa steg kombineras och staplas hur många gånger som helst! Du kan ha två, tre eller till och med tio konvolutionslager. Du kan slänga in max pooling närhelst du vill för att minska storleken på dina data.

Den grundläggande idén är att börja med en stor bild och kontinuerligt koka ner den, steg för steg, tills du slutligen har ett enda resultat. Ju fler konvolutionssteg du har, desto mer komplicerade egenskaper kommer ditt nätverk att kunna lära sig att känna igen.

Till exempel kan det första konvolutionssteget lära sig att känna igen skarpa kanter, det andra konvolutionssteget kan känna igen näbbar med hjälp av kunskapen om skarpa kanter, det tredje steget kan känna igen hela fåglar med hjälp av kunskapen om näbbar, osv.

Här ser ett mer realistiskt djupt konvolutionellt nätverk (som du skulle hitta i en forskningsrapport) ut:

I det här fallet startar de med en bild på 224 x 224 pixlar, tillämpar konvolution och max pooling två gånger, tillämpar konvolution tre gånger till, tillämpar max pooling och har sedan två fullt sammankopplade lager. Slutresultatet är att bilden klassificeras i en av 1000 kategorier!

Konstruktion av rätt nätverk

Så hur vet du vilka steg du måste kombinera för att få din bildklassificerare att fungera?

Ärligt talat måste du svara på det här genom att göra en massa experiment och tester. Du kanske måste träna 100 nätverk innan du hittar den optimala strukturen och de optimala parametrarna för det problem du löser. Maskininlärning innebär en hel del trial and error!

Bygg vår fågelklassificerare

Nu vet vi äntligen tillräckligt för att skriva ett program som kan avgöra om en bild är en fågel eller inte.

Som alltid behöver vi lite data för att komma igång. Den kostnadsfria datamängden CIFAR10 innehåller 6 000 bilder av fåglar och 52 000 bilder av saker som inte är fåglar. Men för att få ännu mer data kommer vi också att lägga till Caltech-UCSD Birds-200-2011 som innehåller ytterligare 12 000 bilder av fåglar.

Här är några av fåglarna från vår kombinerade datamängd:

Lämna ett svar

Din e-postadress kommer inte publiceras.