II. Hoe neurale netwerken worden gebouwd

Zoals we eerder al hebben gezegd, zijn neuronen eenvoudige verwerkingseenheden. In hoofdstuk 4 hebben we lineaire en logistische regressie besproken. De essentiële technische details van neurale netwerken kunnen als lichte variaties van hetzelfde idee worden beschouwd.

Opmerking

Gewichten en inputwaarden

Een basismodel voor kunstmatige neuronen bevat een aantal adaptieve parameters, die net als bij lineaire en logistische regressie gewichten worden genoemd. Net als bij regressie worden deze gewichten gebruikt als multiplicatoren voor de inputwaarden van het neuron, die bij elkaar worden opgeteld. De som van de gewichten maal de inputwaarden wordt de lineaire combinatie van de input genoemd. Je kunt je de parallel met de kassabon vast nog wel herinneren : je vermenigvuldigt het bedrag van elk product met zijn prijs per eenheid en telt dit op voor het totaalbedrag.

Als we een neuron met zes inputwaarden hebben (die overeenkomen met de hoeveelheden van de zes gekochte producten : aardappelen, wortelen, enzovoort), input1, input2, input3, input4, input5 en input6, hebben we ook zes gewichten nodig. De gewichten komen overeen met de prijzen van de producten. We noemen ze gewicht1, gewicht2, gewicht3, gewicht4, gewicht5 en gewicht6. Bovendien wil je net als bij lineaire regressie doorgaans een intercept toevoegen. Dit kan een vaste aanvullende waarde zijn, zoals de kosten voor de verwerking van een creditcardbetaling.

We kunnen de lineaire combinatie vervolgens als volgt berekenen : lineaire combinatie = intercept + gewicht1 × input1 + … + gewicht6 × input6 (waarbij de … een korte manier is om aan te geven dat de som betrekking heeft op alle producten van 1 t/m 6).

Zo kun je bijvoorbeeld op het volgende uitkomen :

10.0 + 5.4 × 8 + (-10.2) × 5 + (-0.1) × 22 + 101.4 × (-5) + 0.0 × 2 + 12.0 × (-3) = -543.0

Oefening laden...

De gewichten zijn bijna altijd geleerd uit gegevens op basis van dezelfde ideeën als die worden gebruikt bij lineaire of logistische regressie en die we eerder hebben besproken. Voordat we hier verder op ingaan, behandelen we een andere belangrijke fase die een neuron doormaakt, voordat het een signaal verzendt.

Activatie en output

Als de lineaire combinatie is berekend, verricht het neuron nog een handeling. Het neemt de lineaire combinatie en haalt deze door een zogenaamde activatiefunctie. Enkele typische voorbeelden van de activatiefunctie zijn :

  • identiteitsfunctie : niets doen en de lineaire combinatie als output leveren ;
  • stapfunctie : als de waarde van de lineaire combinatie hoger is dan nul een schokje afgeven (AAN) en anders niets doen (UIT) ;
  • sigmoïde functie : een “zachte” versie van de stapfunctie.

Bij de eerste activatiefunctie is het neuron precies hetzelfde als lineaire regressie. Daarom wordt de identiteitsfunctie in neurale netwerken zelden gebruikt : dit levert niets nieuws en interessants op.

Opmerking

Hoe neuronen activeren

Echte, biologische neuronen communiceren door scherpe, elektrische schokjes genaamd “spikes” te verzenden, waardoor hun uitgaande signaal elk moment aan of uit staat (1 of 0). Met de stapfunctie wordt dit gedrag geïmiteerd. In kunstmatige neurale netwerken wordt echter doorgaans het tweede soort activatiefuncties gebruikt, waardoor zij op elk moment een constant numeriek activatieniveau afgeven. Om een beetje een vreemde vergelijking te maken : echte neuronen communiceren met iets wat op morse lijkt, terwijl kunstmatige neuronen communiceren door de hoogte van hun stem aan te passen, alsof ze jodelen.

zelfrijdende auto

De output van het neuron, dat wordt bepaald door de lineaire combinatie en de activatiefunctie, kan worden gebruikt om een voorspelling of een beslissing te genereren. Als het netwerk bijvoorbeeld is ontworpen om een stopbord voor een zelfrijdende auto te herkennen, kan de input bestaan uit de pixels van een afbeelding die is gemaakt door een camera aan de voorkant van de auto en kan de output worden gebruikt om een stopprocedure te activeren waardoor de auto stopt voor het bord.

Het netwerk leert of wordt aangepast als de gewichten worden veranderd om ervoor te zorgen dat het netwerk de juiste output genereert, net als bij lineaire of logistische regressie. Veel neurale netwerken zijn erg groot en de grootste netwerken bevatten honderden miljarden gewichten. Het kan een enorme uitdaging zijn om deze allemaal te optimaliseren en hiervoor is een enorme rekenkracht nodig.

Oefening laden...

Perceptron : de moeder van alle kunstmatige neurale netwerken

De perceptron is een chique naam voor een eenvoudig neuronenmodel met de stap-activatiefunctie die we hierboven hebben besproken. Dit was een van de eerste officiële modellen voor neurale berekening en vanwege de essentiële rol ervan in de geschiedenis van neurale netwerken, is het niet onredelijk om dit de “moeder van alle kunstmatige neurale netwerken” te noemen.

Het kan als eenvoudige classificatie worden gebruikt voor binaire-classificatietaken. Psycholoog Frank Rosenblatt introduceerde in 1957 een methode voor het leren van de gewichten van de perceptron uit gegevens, genaamd het perceptronalgoritme. We zullen dit algoritme niet gedetailleerd bestuderen. Het volstaat om te zeggen dat het bijna net zo eenvoudig is als de naaste-buurclassificatie. Het basisbeginsel is om één voor één trainingsgegevens in te voeren in het netwerk. Elke onjuiste classificatie leidt tot de aanpassing van het gewicht.

Opmerking

AI-hyperbool

Na zijn ontdekking was er veel aandacht voor het perceptronalgoritme, niet in de laatste plaats vanwege de optimistische beweringen van de uitvinder ervan, Frank Rosenblatt. Een klassiek voorbeeld van een AI-hyperbool is een artikel dat de New York Times op 8 juli 1958 publiceerde :
“De marine heeft vandaag het embryo van een elektronische computer onthuld dat naar verwachting in staat zal zijn te lopen, praten, kijken, zich voort te planten en zich bewust te zijn van zijn bestaan.”

Niet alleen fans van neurale netwerken hebben de neiging om optimistisch te zijn. De opkomst en ondergang van de AI-benadering met op logica gebaseerde systemen had dezelfde kenmerken van een AI-hype en mensen beweerden dat de definitieve doorbraak aanstaande was. Zowel begin jaren 60 als eind jaren 80 was het resultaat dat de financiering voor het onderzoek ineenstortte en er sprake was van een AI-winter.

De geschiedenis van het debat dat er uiteindelijk toe leidde dat er vanaf de jaren 60 gedurende meer dan 20 jaar bijna volledig werd gestopt met de benadering met neurale netwerken is fascinerend. In het artikel A Sociological Study of the Official History of the Perceptrons Controversy van Mikel Olazaran (dat in 1996 werd gepubliceerd in Social Studies of Science, 1996) worden de gebeurtenissen vanuit sociologisch oogpunt beschouwd. Als je het vandaag de dag leest, stemt dit tot nadenken. Als je verhalen leest over beroemde AI-helden die algoritmen voor neurale netwerken hadden ontwikkeld die binnenkort het niveau van menselijke intelligentie zouden bereiken en zelfbewust zouden worden, zie je dat deze vergelijkbaar zijn met beweringen die tijdens de huidige hype worden gedaan. Je hoeft het bovenstaande artikel niet eens helemaal te lezen (vluchtig scannen is voldoende) om interessante achtergrondinformatie bij het actuele nieuws te verkrijgen. Bekijk bijvoorbeeld eens een artikel in MIT Technology Review van september 2017, waarin Jordan Jacobs, medeoprichter van het Vector Institute for AI dat miljoenen dollars waard is, Geoffrey Hinton (een boegbeeld van de huidige deep-learningtrend) met Einstein vergelijkt vanwege zijn bijdragen aan de ontwikkeling van algoritmen voor neurale netwerken in de jaren 80 en daarna. Denk ook nog eens aan het Human Brain Project uit het vorige deel.

Volgens Hinton “is het feit dat het niet werkt slechts een tijdelijke ergernis” (hoewel Hinton volgens het artikel om de bovenstaande bewering lacht, dus het is moeilijk te zeggen hoe serieus hij dit meent). Het Human Brain Project zou “dicht bij een grote sprong voorwaarts voor het doorgronden van het bewustzijn zijn“. Klinkt dat je niet bekend in de oren ?

Niemand weet zeker wat er in de toekomst zal gebeuren, maar gezien het grote aantal eerdere aankondigingen van aanstaande doorbraken is het aan te raden om kritisch te blijven. In het laatste hoofdstuk komen we terug op de toekomst van AI, maar eerst gaan we bekijken hoe kunstmatige neurale netwerken worden gebouwd.

Neuronen samenvoegen : netwerken

Eén neuron zou in het echte leven in de meeste toepassingen veel te simpel zijn om beslissingen te nemen en voorspellingen te doen. Om het volledige potentieel van neurale netwerken te benutten, kunnen we de output van een neuron gebruiken als de input voor andere neuronen en hun output wordt weer gebruikt als input voor andere neuronen, enzovoort. De output van het hele netwerk wordt verkregen als de output van een bepaalde verzameling neuronen, die de outputlaag wordt genoemd. Hier komen op terug nadat we hebben besproken hoe neurale netwerken zich door parameters te leren uit gegevens, aanpassen om verschillende gedragingen te genereren.

Belangrijke termen

Lagen

De architectuur van het netwerk bestaat vaak uit lagen. De inputlaag bestaat uit neuronen die hun input direct uit de gegevens krijgen. Bij het herkennen van afbeeldingen gebruikt de inputlaag bijvoorbeeld de pixelwaarden van de input als input. Het netwerk heeft doorgaans ook verborgen lagen die de output van andere neuronen als input gebruiken, en waarvan de output weer als input van andere lagen neuronen wordt gebruikt. De outputlaag genereert ten slotte de output van het gehele netwerk. Alle neuronen van een bepaalde laag krijgen input van neuronen uit de eerdere laag en geven hun output aan de volgende laag.

Een klassiek voorbeeld van een meerlagig netwerk is de zogenaamde meerlagige perceptron. Zoals we hierboven hebben besproken, kan het perceptronalgoritme van Rosenblatt worden gebruikt om de gewichten van een perceptron te leren. Voor een meerlagige perceptron is het overeenkomstige leerprobleem veel moeilijker en het duurde lang voordat er een werkende oplossing werd gevonden. Uiteindelijk werd deze gevonden : het backpropagation-algoritme leidde er eind jaren 80 toe dat neurale netwerken weer opbloeiden. Ook nu nog vormt dit vaak de kern van de meest geavanceerde deep-learningoplossingen.

Opmerking

Intussen in Helsinki…

De weg(en) naar het backpropagation-algoritme is/zijn lang en moeizaam. Een interessant onderdeel van de geschiedenis heeft te maken met de afdeling computerwetenschap van de Universiteit van Helsinki. Ongeveer drie jaar naar de oprichting van de afdeling in 1967 schreef een student genaamd Seppo Linnainmaa een masterscriptie. Het onderwerp van de scriptie was “Cumulatieve afrondingsfouten van algoritmen als een Taylor-benadering van individuele afrondingsfouten” (de scriptie is in het Fins geschreven, dus dit is een vertaling van de daadwerkelijke titel “Algoritmin kumulatiivinen pyöristysvirhe yksittäisten pyöristysvirheiden Taylor-kehitelmänä”).

De methode voor automatische differentiatie die in de scriptie was uitgewerkt, werd later door andere onderzoekers gebruikt om de gevoeligheid van de output van een meerlagig neuraal netwerk met betrekking tot de individuele gewichten te kwantificeren. Dit is het basisbeginsel van backpropagation.

Een eenvoudige classificatie voor neurale netwerken

Om een relatief eenvoudig voorbeeld van het gebruik van een classificatie voor neurale netwerken te geven, nemen we een taak die erg lijkt op het herkennen van cijfers met MNIST, namelijk het indelen van afbeeldingen in twee klassen. Allereerst creëren we een classificatie om aan te geven of een afbeelding een kruis (x) of een cirkel (o) bevat. Onze afbeeldingen worden hier weergegeven als pixels die gekleurd of wit zijn en deze staan in een raster van 5 × 5. In dit formaat zien onze afbeeldingen van een kruis en een cirkel (of om eerlijk te zijn meer een ruit) er als volgt uit :

Om een classificatie voor een neuraal netwerk te bouwen moeten we het probleem zodanig formaliseren dat we dit kunnen oplossen met de methoden die we hebben geleerd. Onze eerste stap is om de informatie in de pixels weer te geven met numerieke waarden die als input voor een classificatie kunnen worden gebruikt. Laten we een 1 gebruiken als het vakje gekleurd is en een 0 als het wit is. Hoewel de symbolen in de bovenstaande afbeelding verschillende kleuren hebben (groen en blauw), wordt in onze classificatie de informatie over de kleur genegeerd en uitsluitend de informatie gekleurd/wit gebruikt De 25 pixels in de afbeelding vormen de inputwaarden van onze classificatie.

Om er zeker van te zijn dat we weten om welke pixel het gaat in de numerieke weergave, kunnen we besluiten om de pixels weer te geven in dezelfde volgorde waarin je tekst zou lezen, dus regel voor regel van boven naar beneden, waarbij elke regel van links naar rechts wordt gelezen. De eerste regel van het kruis wordt bijvoorbeeld weergegeven als 1,0,0,0,1 ; de tweede regel als 0,1,0,1,0, enzovoort. De volledige input voor het kruis is dan als volgt : 1,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,1,0,1,0,0,0,1.

We gebruiken het basisneuronenmodel, waarbij de eerste stap het berekenen van een lineaire combinatie van de inputwaarden is. Daarom hebben we voor elk van de inputpixels een gewicht nodig, dus in totaal 25 gewichten.

Ten slotte gebruiken we de stap-activatiefunctie. Als de lineaire combinatie negatief is, is de neuronactivatie 0 en we besluiten om dit te gebruiken om een kruis aan te geven. Als de lineaire combinatie positief is, is de neuronactivatie 1 en we besluiten om dit te gebruiken om een cirkel aan te geven.

Laten we proberen wat er gebeurt als alle gewichten dezelfde numerieke waarde hebben, namelijk 1. Met deze instelling is onze lineaire combinatie voor het kruis 9 (9 gekleurde pixels, dus 9 × 1, en 16 witte pixels, 16 × 0) en 8 voor de cirkel (8 gekleurde pixels, 8 × 1, en 17 witte pixels, 17 × 0). Anders gezegd : voor beide afbeeldingen is de lineaire combinatie positief en daarom worden ze allebei geclassificeerd als cirkels. Niet zo’n goed resultaat gezien het feit dat er maar twee afbeeldingen zijn om te classificeren.

Om het resultaat te verbeteren moeten we de gewichten zodanig aanpassen dat de lineaire combinatie negatief is voor een kruis en positief is voor een cirkel. Als we bekijken wat het verschil tussen kruizen en cirkels is, kunnen we zien dat cirkels geen gekleurde pixels in het midden hebben en kruizen wel. De pixels in de hoeken zijn bij het kruis gekleurd, maar bij de cirkel wit.

Nu kunnen we de gewichten aanpassen. Er zijn oneindig veel gewichten die we kunnen gebruiken. Het is bijvoorbeeld mogelijk om gewicht -1 toe te kennen aan de middelste pixel (de 13e pixel) en gewicht 1 aan de pixels in het midden van elk van de vier zijden van de afbeelding, waarbij alle andere gewichten 0 blijven. Voor de input van het kruis genereert de middelste pixel de waarde –1, waarbij de pixelwaarde of het gewicht van alle andere pixels 0 is, zodat –1 ook de totale waarde is. Dit leidt tot activatie 0, waardoor het kruis juist wordt geclassificeerd.

En hoe zit het met de cirkel ? Elk van de pixels in het midden van de zijden genereert de waarde 1, waardoor het totaal 4 × 1 = 4 is. Voor alle andere pixels is de pixelwaarde of het gewicht nul, zodat het totaal 4 is. Omdat 4 een positieve waarde is, is de activatie 1 en wordt de cirkel ook juist herkend.

Blijf of niet ?

We gebruiken nu dezelfde redenering om een classificatie voor smileys te bouwen. Je kunt gewichten aan de inputpixels van de afbeelding toekennen door erop te klikken. Door eenmaal te klikken komt het gewicht op 1 en als je nogmaals klikt op -1. De activatie 1 geeft aan dat de afbeelding als een blij gezicht wordt geclassificeerd, wat al dan niet juist is, en de activatie –1 geeft aan dat de afbeelding als een verdrietig gezicht wordt geclassificeerd.

Laat je niet ontmoedigen doordat het niet lukt om alle smileys juist te classificeren : met onze eenvoudige classificatie is dit namelijk helemaal niet mogelijk ! Dit is een belangrijk leerdoel : soms is perfectie gewoonweg niet mogelijk, omdat de classificatie te eenvoudig is. In dit geval is het neuron die een lineaire combinatie van de inputwaarden gebruikt, te eenvoudig voor de taak. Bekijk hoe je classificaties kunnen bouwen die in verschillende gevallen goed werken : sommige classificeren de meeste blije gezichten juist, terwijl ze het minder goed doen voor de verdrietige gezichten, of andersom.

Lukt het je om zes van de acht blije en verdrietige gezichten goed te classificeren ?

0/8 blije gezichten juist ingedeeld

0/8 trieste gezichten juist ingedeeld