Twee lagen
Eén neuron kon "precies één" niet: er past geen rechte lijn tussen. Met twee lagen achter elkaar lukt het wel. De uitkomst van de eerste laag is de invoer van de tweede.
Voorspel
def neuron(invoer, gewichten, bias):
som = bias
for i in range(len(invoer)):
som = som + invoer[i] * gewichten[i]
if som > 0:
return 1
return 0
tussen = [neuron([1, 1], [1, 1], 0), neuron([1, 1], [1, 1], -1)]
print(tussen)
print(neuron(tussen, [1, -2], 0))
De eerste laag is de laag uit de vorige stap: OF en EN. Wat print dit programma?
Antwoord
[1, 1]
0
Bij 1 1 zeggen OF en EN allebei 1. Het laatste neuron rekent 1 - 2 = -1,
en zegt 0.
Zo werkt het
Het laatste neuron kijkt niet naar de invoer zelf, maar naar wat OF en EN
ervan vinden. Met gewichten [1, -2] zegt het: OF pleit voor ja, EN pleit
dubbel zo hard voor nee. Dat is precies één: minstens één, maar niet allebei.
neuron en laag staan in de verborgen code onder de editor.
De laag ertussen heet een verborgen laag: je ziet hem niet aan de invoer
of aan de uitkomst. Hier kreeg je de gewichten van de verborgen laag. Je
leer kan ze niet vinden, want die weet alleen wat de laatste uitkomst had
moeten zijn, niet wat OF en EN hadden moeten zeggen. Keras, de bibliotheek van
Traffic, leert ook de gewichten van verborgen lagen. Hoe, legt het hoorcollege
van CS50 uit.
Onderzoek
- Draai de code. Doet het netwerk precies één?
- Zet de gewichten van het laatste neuron op
[1, -1]. Werkt het nog? - Zet ze op
[1, 0]. Welke regel doet het netwerk nu? - Welke gewichten voor het laatste neuron geven EN?
Wat zie je?
0 0 -> [0, 0] -> 0
0 1 -> [1, 0] -> 1
1 0 -> [1, 0] -> 1
1 1 -> [1, 1] -> 0
Antwoorden
- Ja: alleen bij
0 1en1 0komt er 1 uit. - Ja. Bij
1 1is de som dan 1 - 1 = 0, en dat is niet groter dan 0. - OF: het laatste neuron kijkt alleen nog naar het OF-neuron.
[0, 1]: dan kijkt het alleen naar het EN-neuron.
Opdracht: allebei hetzelfde
Maak een netwerk dat 1 zegt als de twee invoeren gelijk zijn: allebei 0 of allebei 1. Ook dat kan één neuron niet. Houd de eerste laag, OF en EN, en zoek gewichten en een bias voor het laatste neuron:
0 0 -> 1
0 1 -> 0
1 0 -> 0
1 1 -> 1
Begin klein, en breid de code stap voor stap uit:
- Draai de code: met gewichten
[0, 0]zegt het laatste neuron bij0 0nog 0. - Zet het in een loop in een loop over de vier combinaties.
- Zoek gewichten en een bias voor het laatste neuron.
Tip
Het laatste neuron ziet alleen tussen. Schrijf voor de vier combinaties op
wat tussen is. Bij welke van die lijsten moet het 0 zeggen?
Antwoord
Dit vervangt alles in de editor:
for a in [0, 1]:
for b in [0, 1]:
tussen = laag([a, b], [[1, 1], [1, 1]], [0, -1])
uit = neuron(tussen, [-1, 2], 1)
print(a, b, "->", uit)
0 0 -> 1
0 1 -> 0
1 0 -> 0
1 1 -> 1
tussen is [0, 0], [1, 0], [1, 0] en [1, 1]. Alleen bij [1, 0] moet
het laatste neuron 0 zeggen. Met gewichten [-1, 2] en bias 1 zijn de sommen
1, 0, 0 en 2. Andere getallen kunnen ook, zoals [-2, 2] met bias 1.
Door naar de grootste wint.