Eine Regel, die niemand geschrieben hat
Eine Buchungs-App sagt dem Verleih, dass der Samstag voll wird. Niemand hat dort „wenn warm und trocken am Wochenende“ programmiert. Die App begann mit Zahlen ohne Bedeutung und korrigierte sie, einen vergangenen Tag nach dem anderen.
Dieses Korrigieren ist bei einem neuronalen Netz mit „Lernen“ gemeint. Es ist Rechnen, das Sie von Hand nachvollziehen können.
Am Ende dieser Lektion
Notiz
Ich kann erklären, wie ein kleines neuronales Netz lernt.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Neuron | addiert seine gewichteten Eingaben und einen Bias, dann entscheidet es | |
| Gewicht | wie stark eine Eingabe zählt | |
| Bias | eine addierte Zahl, die die Entscheidung verschiebt | |
| Lernrate | wie groß jede Korrektur ist | 0.1 |
| Epoche | ein Durchlauf über alle Trainingszeilen | |
| Versteckte Schicht | Neuronen zwischen den Eingaben und der Antwort |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Perzeptron addiert und entscheidet dann
Ein Perzeptron ist ein einzelnes Neuron. Es multipliziert jede Eingabe mit ihrem Gewicht, addiert alles und addiert den Bias.
Liegt die Summe über 0, antwortet es mit 1, hier „voll“. Sonst antwortet es mit 0, „ruhig“. Ein großes positives Gewicht schiebt in Richtung voll, ein negatives in Richtung ruhig.
Beispiel: zwei Tage durch ein Neuron
| Tag | Eingaben: Temperatur, Regen, Wochenende | Gewichte 0,5, -0,9, 0,6, Bias -1 | Summe | Antwort |
|---|---|---|---|---|
| Warmer Samstag | 2,0, 0,0, 1 | 1,0 + 0 + 0,6 - 1 | 0,6 | 1, voll |
| Kalter, nasser Mittwoch | 0,7, 1,1, 0 | 0,35 - 0,99 + 0 - 1 | -1,64 | 0, ruhig |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Korrektur von Hand
# Ein voller Tag: Temperatur in Zehnergrad, Regen in cm, Wochenende.
tag = [2.0, 0.0, 1]
ziel = 1
gewichte = [0.0, 0.0, 0.0]
bias = 0.0
rate = 0.1
summe = bias
for n in range(3):
summe = summe + gewichte[n] * tag[n]
schaetzung = 0
if summe > 0:
schaetzung = 1
fehler = ziel - schaetzung
for n in range(3):
gewichte[n] = round(gewichte[n] + rate * fehler * tag[n], 2)
bias = round(bias + rate * fehler, 2)
print("Schätzung:", schaetzung, "Fehler:", fehler)
print("Gewichte:", gewichte, "Bias:", bias)
# Tragen Sie die neuen Gewichte und den Bias in Zeile 4 und 5 ein.
# Starten Sie erneut. Ist der Fehler jetzt 0?
Lernen heißt Gewichte korrigieren
Das Training beginnt mit Gewichten von 0. Für jede Zeile schätzt das Perzeptron. Der Fehler ist die wahre Antwort minus die Schätzung: 1, 0 oder -1.
Jedes Gewicht verschiebt sich dann um Lernrate mal Fehler mal seine Eingabe. Ein Durchlauf über alle Zeilen ist eine Epoche. Das Training endet nach einer festen Zahl von Epochen oder wenn eine Epoche fast nichts mehr ändert.
Ein Perzeptron am Jahr trainieren
docker exec jupyter python3 steps/perceptron.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine gerade Grenze reicht nicht immer
Ein Perzeptron trennt seine Eingaben mit einer einzigen geraden Grenze. Manche Muster lassen sich so nicht trennen.
Das bekannteste ist XOR: Die Antwort ist 1, wenn genau eine von zwei Eingaben 1 ist. Keine gerade Linie bringt die beiden Einsen auf eine Seite und die beiden Nullen auf die andere. Der Notebook-Block unten probiert es aus.
Beispiel: ODER und XOR nebeneinander
| Erste Eingabe | Zweite Eingabe | ODER | XOR |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 1 |
| 1 | 0 | 1 | 1 |
| 1 | 1 | 1 | 0 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Im Notebook eingeben: ODER und XOR
from sklearn.linear_model import Perceptron
from sklearn.neural_network import MLPClassifier
X = [[0, 0], [0, 1], [1, 0], [1, 1]]
oder = [0, 1, 1, 1]
xor = [0, 1, 1, 0]
print(Perceptron(random_state=0).fit(X, oder).score(X, oder))
print(Perceptron(random_state=0).fit(X, xor).score(X, xor))
# Eine versteckte Schicht aus 4 Neuronen.
netz = MLPClassifier(hidden_layer_sizes=(4,), solver="lbfgs", max_iter=1000, random_state=1).fit(X, xor)
print(netz.score(X, xor))
Schichten und viele kleine Korrekturen
Eine versteckte Schicht ist eine Reihe von Neuronen zwischen den Eingaben und der Antwort. Jedes zieht seine eigene Grenze, das letzte Neuron verbindet sie. So wird XOR gelöst.
Netze entscheiden weich statt mit einer harten Stufe. So lässt sich jedes Gewicht ein wenig in die Richtung schieben, die den Fehler senkt. Der Fehler wird von der Antwort rückwärts durch jede Schicht gereicht. Das heißt Backpropagation.
Drei Netzgrößen am Jahr
docker exec jupyter python3 steps/network.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele denken, ein größeres Netz sei immer ein besseres. Hier erreichten 2, 8 und 32 versteckte Einheiten alle 0,87, weil das Muster in drei Eingaben einfach ist. Zusätzliche Neuronen kosten Zeit und können den Zufall lernen. Beginnen Sie klein und wachsen Sie nur, wenn eine Testmenge es rechtfertigt.
Weiterführend: drei Lernraten
Trainieren Sie in Ihrem Notebook das Perzeptron aus perceptron.py mit drei Lernraten: eta0=0.01, eta0=1 und eta0=10. Notieren Sie jedes Mal die Durchläufe und die Genauigkeit.
Erklären Sie in zwei Sätzen, warum die Lernrate bei manchen Modellen mehr zählt als bei anderen. Hinweis: Was geschieht mit der Entscheidung, wenn alle Gewichte und der Bias mit derselben Zahl malgenommen werden?