Deep learning för att se ett ansikte och klassificera tecken på stroke

Ett användningsområde för machine learning är att kunna ge binära svar på diagnosfrågor vi vill ställa. Exempelvis, har denna bild på ett ansikte tecken på stroke, eller inte. Ja eller nej? Är den här bilden på en frisk cell eller en cancercell?

För detta skulle vi behöva en snäv AI, närmare bestämt ett upptränat neuralt nätverk, per diagnosfråga. Denna bloggpost går igenom i grova drag vad det innebär, hur det tekniska flödet ser ut, med mera.

Deep learning och neuralt nätverk?

Deep learning är ett av flera angreppssätt inom machine learning för att göra kunskap av lite större informationsmängder. Wikipedia har fått ihop den något yxiga förklaringen nedan, men misströsta inte, det finns också ett videoklipp som är på en mer begriplig nivå.

”Deep learning är baserad på en uppsättning algoritmer som försöker modellera abstraktioner i data på hög nivå genom att använda många processlager med komplexa strukturer, bestående av många linjära och icke-linjära transformationer.”
Deep learning – Wikipedia

Geoffrey Hinton – gudfadern av deep learning – förklarar bakgrunden bra på under fyra minuter.

Arkitekturen bakom machine learning – först input layer

Låt oss börja med delarna i input layer.

Feature detection – att se mönster

En feature kan vara en cancercell och hur den skiljer sig från en frisk cell. För att hitta en sådan cell i en röntgenbild behöver man utveckla (eller få tag på) en feature detector, det innebär en maskinell beskrivning av vad i geometrin som skiljer en cancercell från en frisk cell.

En annan sorts bild med tydliga mönster är ett fotografi av ett ansikte.

Hur skulle du exempelvis beskriva en människas ansikte för en maskin? Även här handlar det om geometri. Ett ansikte består av formen av två horisontella streck på samma höjd (ögonbryn), två ellipser på samma höjd (ögon) med ett horisontellt streck mellan (näsa) och under det strecket finns ett horisontellt streck (mun).

Har personen på bilden drabbats av stroke?

Stroke handlar om hjärnskador på grund av en blodpropp eller blödning i hjärnan. Det är viktigt att man så snabbt som möjligt kan identifiera ett strokeanfall för att rädda så mycket som möjligt av hjärnan så den inte drabbas av syrebrist.

I teorin skulle man kunna ha en bild på en människa och leta efter de kännetecken som finns för stroke. Du skulle alltså kunna ha viss hjälp av en app. Detta beror på att ett vanligt symtom är att man råkar ut för förlamning i ena kroppshalvan. Ena halvan av ansiktet börjar “hänga”. Nu är inte vänster och höger halva av ansiktet identiska till att börja med, så det man behöver leta efter är att ena halvan ser förlamad ut jämfört med den andra.

Feature maps

En feature map är en förenkling av vad dessa egenskaper/features innebär. Eftersom du kan vilja ha ett gäng egenskaper eller varianter av dem finns det ett delmoment (convolutional layer) där dessa feature map appliceras i jakt på fynd.

Convolution – att reducera informationen utan att förstöra all data

Convolution är att minska bildens storlek men att försöka behålla så mycket information som möjligt. Detta gör man för att korta ner beräkningstiden, om man inte gör det blir det en tung uppgift bara att hitta ett ansikte i en bild och tänk då på filmer som har minst 24 bilder per sekund man behöver analysera.

Pooling

Sedan bearbetas dina feature maps genom en teknik som kallas pooling och poängen är att göra dina features mer flexibla. Tänk dig variationen på ögonbryn i alla fotografier du tagit. Vissa är buskiga, andra vältrimmade, ibland saknas de helt och emellanåt är det svårt att urskilja om det är två stycken eller ett enda.

En vinst med pooling är att det motverkar det som kallas för overfitting, alltså att maskinen drar för långtgående slutsatser baserat på de exempel den tränats med.

Efter att pooling har gjort informationen mer flexibel är det dags att omforma informationen till ett format så det är kompatibelt med hur ett artificiellt neuralt nätverk (ANN) vill ha det, en process som kallas flattening för att den matris av pixlar/information som vi jobbat med så här långt ska bli en lång lista/vektor med data. Det här är vad som kallas input layer.

Hidden layer – där magin händer

Skiss över ett neuralt nätverk
Skiss över ett neuralt nätverk. Grönt är inputlagret, blått är hidden layer och gult är output layer.

Fram till nu har vi tittat på arkitekturen för det som kallas för “input layer”. I ovanstående bild är det de gröna ringarna. Processen går från vänster till höger. Det gömda lagret är de blåa cirklarna, är de som tar ett beslut om vad som är vad. I denna förenklade skiss är det bara fem neuroner, men i verkligheten är det många fler och mycket mer komplicerat. En neuron kan exempelvis vara specialiserad på att identifiera ögonbryn, en annan att hitta näsor på bilder och en tredje letar efter skrattgropar på kinderna.

Var och en skickar sitt besked till outputlagret och det är hur säker neuronen är på att den kunde detektera det den är specialiserad på.

Nu finns det ingen neuron som säger ja eller nej kring ifall bilden innehåller skrattgropar, det är en grov förenkling. Det här med nätverk av neuroner kallas ibland för en svart låda då de är svåra att analysera fullt ut hur de fungerar. Det är nätverket som svarar på frågor snarare än enskilda beslutsmässiga neuroner.

Hidden layer kallas ibland också får “fully connected layer”.

Output layer

I outputlagret sker det slutgiltiga beslutet.

Neuronen i outputlagret har som uppgift att försöka lista ut vad alla dessa signaler från neuronerna före innebär för och vilka som är viktiga för respektive slutsats/diagnos. De flesta ansikten kommer att innehålla ögonbryn om det är ett ansikte på bild, så vad betyder det dolda nätverkets signaler om vi försöker lista ut om det är en person med stroke (eller inte) på bilden?

I vårt fall med en potentiell stroke är det kanske vissa neuroner som bör ha en utslagsröst? Maskinen tränas genom de bildexempel där den har både bild och facit. Baserat på de bilderna kommer den försöka hitta mönster. Exakt vad den lär sig beror på vad bilderna föreställer. Om det enda som skiljer de med stroke från de utan är ifall det finns skrattgropar på bilden kommer den att lägga stor vikt vid skrattgropar, samma om friska är mörkhåriga och sjuka är blonda kommer det verka viktigt.

Därför är det avgörande med ett balanserat underlag så maskinen inte hänger upp sig på knäppa detaljer. Denna process kallas för fitting, att få kunskapsmodellen att vara lagom specialiserad. Overfitting är att alltid tro att en vit fläck på en gräsmatta är ett får, underfitting att inte kunna bestämma sig om det är ett får, parasoll eller en fläck med snö.

Om vi tränat det neurala nätverket på att identifiera katter eller hundar istället

Om outputlagret består av flera neuroner, som en för katt och en för hund, kommer hund-neuronen att förutom att vara noggrann med att lyssna på neuronen som har koll på slokande öron och lära sig att om neuronen för spetsiga öron är “aktiverad” är det troligen en katt det handlar om. Så outputlagret har saker som talar för ett visst beslut och saker som talar emot.

Ett neuralt nätverk på träningsläger

En viktig del i att träna upp kunskapsmodeller i machine learning handlar om att värdera hur stor kostnad eller skada som uppstår vid felaktiga förutsägelser.

”In ML, cost functions are used to estimate how badly models are performing. Put simply, a cost function is a measure of how wrong the model is in terms of its ability to estimate the relationship between X and y. This cost function (you may also see this referred to as loss or error.) can be estimated by iteratively running the model to compare estimated predictions against “ground truth” — the known values of y.”
Machine learning fundamentals (I): Cost functions and gradient descent

Det finns många sätt att räkna på kostnaden av fel och sätta en bestraffande funktion till sitt nätverk så den jobbar i rätt riktning. Några förslag på sådan fördjupning finns i länkarna nedan.

Läs och lär mer om Convolutional Neural Networks

Kommentera

E-postadressen publiceras inte. Obligatoriska fält är märkta *