Inhaltsverzeichnis

Navigation: 🤖 Teil 1 - 🤖 Teil 2 - 🤖 Teil 3 - 🤖 Teil 4Loading ⌛Loading ⌛

🤖 Wie funktioniert maschinelles Lernen 2

🎯 In dieser Reihe erfährst du, wie ein Computer mithilfe von Daten lernen kann.

Inhaltsverzeichnis


1. Das Problem näherungsweise beschreiben


Abb.1: Fehlerfunktion1).

Im Teil 1 hast du gelernt, dass mit Machine Learning Probleme gelöst werden können, bei welchen eine Eingabe in eine Ausgabe überführt werden soll. Dabei müssen Ein- und Ausgabe mit Zahlen dargestellt werden können. Mathematisch formuliert geht es darum, für ein gegebenes Problem die Funktion $f(x)$ zu finden, welche die Ausgabe $y$ für die Eingabe $x$ produziert, d.h. für welche gilt: $y = f(x)$.

Beim Machine Learning wird die „wahre“ Funktion $f(x)$ durch eine „Stellvertreter-Funktion“ $f_{ML}(x)$ ersetzt („$_{ML}$“ steht hier für Machine Learning). Die Stellvertreter-Funktion $f_{ML}(x)$ beinhaltet mehrere Parameter, welche als Gewichte $w$ bezeichnet werden2). Das Ziel besteht darin, die Gewichte $w$ so einzustellen, dass $y=f_{ML}(x)$ möglichst gut für alle „echten“ Eingaben $x$ und Ausgaben $y$ gilt, d.h. dass $f_{ML}(x)$ der wahren Funktion $f(x)$ möglichst nahekommt.

Dem Computer muss mit einer Zahl gesagt werden, ob die Gewichte $w$ gut eingestellt sind oder nicht. Häufig wird dafür ein Fehler $e$ berechnet3). Je nach Einstellung der Gewichte $w$ wird dieser Fehler kleiner oder grösser. Abb.1 zeigt den Zusammenhang zwischen dem Fehler $e$ und den Einstellungen der Gewichte $w$. Die rote Kurve wird als Fehlerfunktion bezeichnet und trägt üblicherweise den Buchstaben $J$. Somit ist $e = J(w)$. Beim Machine Learning wird diejenige Gewicht-Einstellung $w^{*}$ gesucht, für welche der Fehler $e$ minimal wird, d.h. für welche gilt: $e_{min} = J(w^{*})$.

⚠️ Beim Machine Learning wird nicht das Problem selbst gelöst. Das Problem wird näherungsweise mit einer Stellvertreter-Funktion beschrieben. Die Lösung des Problems wird näherungsweise durch das Minimieren einer Fehlerfunktion ersetzt. Nur wenn Stellvertreter-Funktion und Fehlerfunktion gut zum Problem passen, kann das Problem in guter Näherung gelöst werden. Passen diese schlecht, dann wird zwar auch ein Problem gelöst, aber vermutlich nicht das gesuchte.


Beim Machine Learning wird nicht das Problem selbst gelöst. Es wird stellvertretend durch das Anpassen von Gewichten eine Fehlerfunktion minimiert. Daher muss immer geprüft werden, inwieweit eine durch Machine Learning gefundene Lösung in der Praxis tatsächlich brauchbar ist.


2. Die Näherung mithilfe von Daten annähern

Im vorangehenden Kapitel haben wir als Näherung das Problem durch $f_{ML}(x)$ und die Problemlösung durch $e_{min}=J(w^*)$ ersetzt. Um die Gewicht-Einstellung $w^*$ finden zu können, müssen wir zumindest in der Lage sein, für eine beliebige, gegebene Gewicht-Einstellung $w^♡$ den Fehlerwert $e^♡ = J(w^♡)$ zu berechnen. Der Fehlerwert $e^♡$ soll dabei nicht nur für ein einzelnes Datenbeispiel ausgerechnet werden, sondern am besten für alle möglichen Datenbeispiele hinweg. Z.B. sollte bei einer Gesichtserkennung der Fehlerwert nicht nur mit dem Gesicht von Peter bestimmt werden, sondern basierend auf allen möglichen Gesichtern.

🫣 In der Vergangenheit wurden Gesichtserkennungsverfahren relativ unkritisch mit Bildern aus dem Internet trainiert. Da es im Internet viel mehr Bilder von hellhäutigen Männern als von dunkelhäutigen Frauen gibt, wurden in der Folge Gesichter von dunkelhäutigen Frauen deutlich schlechter erkannt – eine unbeabsichtigte, algorithmische Diskriminierung. Seit dem wird versucht, mit Gesichtern zu trainieren, welche möglichst alle Alter, Ethnien etc. abdecken. Für die perfekte Gesichtserkennung müsste man eigentlich mit unendlich vielen Gesichtern trainieren, welche alle denkbaren Gesichtsvarianten abdecken.

😭 Jetzt die schlechte Nachricht, wir können nur schon aus praktischen Gründen nie unendlich viele Daten berücksichtigen und wir werden kaum je alle denkbaren Datenvarianten für ein Problem zusammentragen können. Somit können wir die wahren Fehlerwerte nur mit den Daten annähern, die wir haben. Je mehr Daten verfügbar sind (und je besser diese alle denkbaren Varianten abdecken), desto besser kann der wahre Fehlerwert $e^♡ = J(w^♡)$ angenähert werden. Da $f_{ML}(x)$ und $J(w)$ selbst nur Näherungen der Wirklichkeit darstellen, wird damit „nur“ eine Näherung der Näherung berechnet.


✍ Auftrag Mehr ist mehr

👉 Hier lernst du, dass viele Daten meist bessere Näherungen ergeben als wenige.

  • Wenn du auf den Button Würfle! klickst, wird 100 Mal gewürfelt und die Anzahl Sechser wird gezählt. Theoretisch müssten 1/6 aller Würfe Sechsen sein, d.h. 16.66… also rund 17 Sechsen. Diese Zahl wird bei Erwarteten Anzahl Sechsen (auch „Erwartungswert“ genannt) angegeben. Klicke mehrfach auf den Button Würfle! und beobachte wie stark die tatsächlich Gewürfelte Anzahl Sechsen von der Erwartete Anzahl Sechsen prozentual abweicht.
  • Mit dem Slider kannst du die „Anzahl Würfe“ verstellen (von 100 bis 1'000'000). Damit änderst du auch die Erwartete Anzahl Sechsen. Würfle mehrmals mit verschiedenen Slider-Einstellungen. Wie gut wird die Erwartete Anzahl Sechsen bei wenigen Würfen getroffen? Wie gut wird die Erwartete Anzahl Sechsen bei vielen Würfen getroffen?
  • Was bedeutet das dafür, wie gut der Fehler $e=J(w)$ anhand von Daten abgeschätzt werden kann? Halte deine Überlegungen im Textfeld fest. Loading ⌛
  • Vergleiche danach deine Antwort mit der unseren am Ende dieses Auftrags.

Unsere Antwort


3. Die Näherung der Näherung algorithmisch annähern

In den beiden vergangenen Kapitel wurde als Näherung das Problem durch $f_{ML}(x)$ und die Problemlösung durch $e_{min}=J(w^*)$ ersetzt und gezeigt, dass der wahre Fehlerwert $e^♡$ für eine gegebene Gewicht-Einstellung $w^♡$ mit einer beschränkten Anzahl Datenpunkte nur näherungsweise berechnet werden kann. Jetzt geht es darum, für eine gegebene Fehlerfunktion $J(w)$ diejenige Gewicht-Einstellung $w^*$ zu finden, für welche $e_{min} = J(w^*)$ gilt.

🫣 Leider lässt sich die Gewicht-Einstellung $w^*$ in den wenigsten Fällen exakt berechnen, d.h. das wahre $w^*$ kann nur angenähert werden. Somit kann Machine Learning im Endeffekt nur Näherungen der Näherungen eines Problems annähern. Erstaunlicherweise führt das Ganze trotzdem meist zu bemerkenswerten Resultaten.

Machine-Learning-Verfahren sind keine exakten Verfahren, sie können Sachverhalte nur näherungsweise beschreiben und nur näherungsweise berechnen. Somit werden Machine-Learning-Lösungen kaum je zu 100% fehlerfrei funktionieren.

Im Folgenden werden drei gängige Strategien vorgestellt, mit welchen die gesuchte Gewicht-Einstellung $w^*$ angenähert werden kann. Jedes dieser Verfahren basiert dabei auf einer durch mehrere Gewichte $w$ anpassbaren Funktion $f_{ML}(x)$ und einer Fehlerfunktion $J(w)$.

💡 Manche Fehlerfunktionen $J(w)$ brauchen für die Berechnung des Fehlers Datenpaare $(x, d)$, wobei $x$ die Eingabe darstellt und $d$ den zugehörigen „desired Output“ (die zugehörige „erwünschte Ausgabe“). Bei solchen Fehlerfunktionen wird von „supervised Learning“ (überwachten Lernen) gesprochen. Andere Fehlerfunktionen kommen nur mit den Eingangswerten $x$ aus. Hierbei wird von „unsupervised Learning“ (unüberwachten Lernen) gesprochen. Alle der nachfolgenden Beispiele beziehen sich auf supervised Learning.


3.1 Iterative Verfahren

Bei den iterativen Verfahren wird ausgehend von einer zufällig erzeugten Gewicht-Einstellung $w_0$ versucht, die Gewichte in mehreren Schritten in Richtung $w^*$ zu verändern. Iterativ bedeutet in mehreren Wiederholungen. Für die iterativen Verfahren eignen sich viele Stellvertreter-Funktionen $f_{ML}(x)$ und Fehlerfunktionen $J(w)$, jedoch nicht alle. Damit eine gezielte, schrittweise Verbesserung berechnet werden kann, müssen $f_{ML}(x)$ und $J(w)$ gewissen mathematischen Bedingungen genügen 4).

Neuronale Netze werden meist mit iterativen Verfahren trainiert. Dabei wird als anpassbare Funktion $f_{ML}(x)$ eine neuronale Netz-Funktion verwendet. Als Fehlerfunktion $J(w)$ wird mehrheitlich eine Funktion verwendet, welche für jeden Dateneingang $x$ den Ausgangswert des neuronalen Netzes $y$ mit dem desired Output $d$ vergleicht. Um von einer Einstellung der Gewichte zu einer besseren zu kommen, wird häufig ein „Gradientenverfahren“ genutzt. Was das genau ist und wie das genau funktioniert, wird in den Teilen 3 und 4 dieser Reihe erklärt.


✍ Auftrag neuronales Netz iterativ trainieren

👉 Hier erfährst du, wie ein iteratives Verfahren arbeitet.

💡 Das folgende neuronale Netz besitzt zwei Eingänge, die x- und die y-Koordinaten der abgebildeten Kreise und Kreuze. Weiter besitzt es einen einzigen Ausgang $y$ der Werte von 0 bis 1 annehmen kann. Alle Ausgangswerte $y>0.5$ werden als Kreuze erkannt, alle Ausgangswerte $y\le0.5$ als Kreise. Als Fehlerfunktion wird der mean squared error (MSE) genutzt, welcher den Mittelwert aller Differenzquadrate $(y - d)^2$ bezeichnet. Der desired Output $d$ wird dabei für einen Kreis auf $d=1$ gesetzt und für ein Kreuz auf $d=0$. Die rote Linie stellt die Ausgangswerte $y = 0.5$ dar und wird als „decision Boundary“ bezeichnet.

  • Starte das neuronale Netz ein paar mal. Das neuronale Netz wird mit den Daten links trainiert. Wie gut das trainierte neuronale Netz ist, wird mit den nicht für das Training verwendeten „Validationsdaten“ rechts geprüft. Eine Epoche bezeichnet einen Trainingsdurchgang. Beachte wie schrittweise der MSE (in der Console) und somit auch die Klassifikationsrate (Prozentsatz korrekt) verbessert werden. Beachte auch, dass jedes Training von anderen zufällig gewählten Gewicht-Einstellungen aus gestartet wird und somit zu einem anderen Trainingsverlauf führt.
  • Verändere die Trainings- und Updateparameter oben im Programmcode. Versuche ein paar Minuten lang zu erreichen, dass die Trainings- und Validationsergebnisse möglichst gleich und möglichst gut sind. Wenn du genug hast, halte deine besten Resultate im Textfeld fest.
    • Die LERNRATE bestimmt die Lerngeschwindigkeit, wobei bei einer zu hohen Lernrate das neuronale Netz „wild hin und her springt“.
    • Die ANZAHL_HIDDEN_NEURONEN ist mit der Anzahl Gewichte verknüpft. Je höher dieser Wert, desto mehr Gewichte. Bei zu wenigen Gewichten kann nicht genügend gelernt werden, bei zu vielen Gewichten tritt „Overfitting“ auf, d.h. die Trainingsdaten werden auswendig gelernt (= gute Trainingsresultate, aber schlechte Validationsresultate).
    • Mit ANZAHL_EPOCHEN und EPOCHEN_FUER_GRAFIK_UPDATE kann eingestellt werden, wie lange trainiert und wie oft die Resultate und die Grafik aktualisiert werden soll.

Loading ⌛


3.2 Statistische Verfahren


Abb.2: Illustration Naive Bayes5).

Bei den statistischen Verfahren wird ermittelt, wie die Daten wertmässig verteilt sind. Dabei wird eine bestimmte, vorgegebene „Form“ der Verteilung als Funktion $f_{ML}(x)$ genutzt und diese mithilfe der Einstellung mehrerer Gewichte $w$ möglichst gut an die Daten angepasst. Für die Anpassung der Gewichte $w$ werden in der Regel die Eingangsgrössen $x$ jedes Datenpunktes und die zugehörigen desired Outputs $d$ berücksichtigt. Die statistischen Verfahren sind so konstruiert, dass durch die Hinzunahme aller Daten direkt die Gewicht-Einstellung $w^*$ geschätzt wird, für welche $e_{min}=J(w^*)$ gilt, wobei $J(w)$ eine verfahrensspezifische, statistische Fehlerfunktion ist 6).

Da die wahre Verteilung der Daten normalerweise nicht bekannt ist, stellt die Wahl einer vorgegebenen „Form“ für die Verteilung eine Näherung dar. Weiter treffen die gängigen statistischen Verfahren für ihre Berechnungen zusätzliche vereinfachende Annahmen, welche ebenfalls als Näherungen angesehen werden können.

Ein einfaches statistisches Verfahren ist der Naive Bayes Klassifikator, welcher verschiedene Klassen unterscheiden kann. Dabei wird für jede Klasse deren Häufigkeit ermittelt und für jede Klasse und jede Eingangsgrösse ein eigenes Histogramm aus den Daten erstellt. Ein Beispiel ist in Abb.2 illustriert. Es geht darum, mit zwei Eingangsgrössen $x_1$ und $x_2$ die beiden Klassen $A$ und $B$ zu unterscheiden. Das Histogramm in der Abbildung oben zeigt die Eingangsgrösse $x_1$ für die Datenpunkte, welche zur Klasse $A$ gehören. Ebenso (aber hier nicht abgebildet) werden drei weitere Histogramme für die Eingangsgrössen der Datenpunkte der Klasse $A$ sowie für die Eingangsgrössen $x_1$ und $x_2$ der Datenpunkte der Klasse $B$ erstellt. Die Abbildung unten zeigt, wie der Datenraum durch die Histogramme in „Zellen“ unterteilt wird. Für jede Zelle wird basierend auf den Histogrammen Auftretenswahrscheinlichkeiten der Klassen $A$ und $B$ berechnet. Daraufhin wird jede Zelle derjenigen Klasse zugeordnet, welche den höheren Wahrscheinlichkeitswert aufweist.

Die Häufigkeit der Klassen und die Höhen der einzelnen Histogramm-Balken stellen im Naive Bayes Klassifikator die Gewichte $w$ dar. Durch „Zählen“ der Daten wird so direkt die Gewicht-Einstellung $w^*$ geschätzt, für welche $e_{min}=J(w^*)$ gilt, wobei $J(w)$ den sogenannten „Bayes Fehler (EPE)“ bezeichnet7). Für das Zählen genügt es, alle Trainingsdaten einmal anzusehen, d.h. es genügt eine Epoche für das Training.

Falls du wissen möchtest, wie der Naive Bayes Klassifikator genau aufgebaut ist, klicke hier!


✍ Auftrag Naive Bayes Klassifikator

👉 Hier erfährst du, wie ein statistisches Verfahren arbeitet.

💡 Um den statistischen Naive Bayes Klassifikator mit dem neuronalen Netz aus Kapitel 3.1 vergleichen zu können, werden hierfür dieselben Daten wie in 3.1. versendet. D.h. zwei Eingangsgrössen (die x- und die y-Koordinaten der Kreise und Kreuze) und als Ausgang $y$ die Wahrscheinlichkeit, dass ein Datenpunkt $x$ zur Klasse der Kreuze gehört. Somit werden auch hier alle Ausgangswerte $y>0.5$ werden als Kreuze erkannt (und blau eingefärbt) und alle Ausgangswerte $y<0.5$ als Kreise erkannt (und grün eingefärbt).

💡 Speziell ist, dass alle Ausgangswerte mit $y = 0.5$ weiss eingefärbt werden. Hier kann sich der Klassifikator für keine der beiden Klassen entscheiden. Die Anzahl der betroffenen Kreise oder Kreuze wird im Programm mit zwei ?? gekennzeichnet und nicht für die Berechnung der Klassifikationsrate oder der Anzahl falsch klassifizierter Datenpunkte berücksichtigt.

💡 Aus Gründen der Vergleichbarkeit wird als Fehlerfunktion nicht der Bayes-Fehler, sondern der MSE berechnet und angegeben.

  • Starte den Naive Bayes Klassifikator ein paar mal. Es wird immer dasselbe Resultat ausgegeben und das Training dauert immer nur 1 Epoche.
  • Verändere den einzigen Trainingsparameter im Programmcode und suche das Resultat, bei dem die Trainings- und Validationsergebnisse möglichst gleich und möglichst gut sind. Wie vergleicht sich der Naive Bayes Klassifikator für dieses Problem mit dem neuronalen Netz aus 3.1? Halte deine besten Resultate im Textfeld fest.
    • Die ANZAHL_INTERVALLE bestimmt die Feinheit der Histogramme, mit welchen die Daten statistisch ausgewertet werden. Je höher dieser Wert, desto mehr Gewichte. Bei zu wenigen Gewichten kann nicht genügend gelernt werden, bei zu vielen Gewichten tritt „Overfitting“ auf, d.h. die Trainingsdaten werden auswendig gelernt (= gute Trainingsresultate, aber schlechte Validationsresultate).

Loading ⌛


3.3 Stochastische Verfahren

Bei den stochastischen Verfahren werden die Werte aller Gewichte $w$ zufällig gewürfelt (Zufallszahlen) und anschliessend der Fehler mit den verfügbaren Daten berechnet. Dies wird viele Male wiederholt und am Ende die Gewichte-Einstellung mit dem kleinsten erzielten Fehler verwendet. Somit wird die Gewichte-Einstellung $w^*$ für welche $e_{min}=J(w^*)$ gilt, durch Zufall angenähert.

Mit dieser Vorgehensweise können, im Gegensatz zu den in den Kapiteln 3.1 und 3.2 vorgestellten Verfahren, alle Varianten von Stellvertreter-Funktionen $f_{ML}(x)$ und Fehlerfunktionen $J(w)$ ohne Einschränkung verwendet werden.

Bekannte stochastische Verfahren sind


✍ Auftrag Monte-Carlo

👉 Hier erfährst du, wie ein stochastisches Verfahren arbeitet.

💡 Um alle Resultate mit dem Neuronalen Netz aus 3.1 und dem Naive Bayes Klassifikator aus 3.2 vergleichen zu können, werden hier wiederum dieselben Daten verwendet. Im ersten Programm wird das Monte-Carlo Verfahren dazu verwendet, die Gewichte im neuronalen Netz aus 3.1 zu würfeln. Im zweiten Programm werden damit die Gewichte des Naive Bayes Klassifikators aus 3.2 gewürfelt. In beiden Experimenten kann gewählt werden, ob die Gewicht-Einstellung mit dem kleinsten MSE oder die Gewicht-Einstellung mit der höchsten Klassifikationsrate gesucht werden soll.

  • Teste das „Monte-Carlo neuronale Netz“ und den „Monte-Carlo Naive Bayes Klassifikator“ und beachte dabei Folgendes.
    • Neuronales Netz und Naive Bayes: Bei der OBJEKTIVE mse wird jeweils die Gewicht-Einstellung mit dem tiefsten MSE genommen, bei korrekt dasjenige mit der höchsten Klassifikationsrate.
    • Neuronales Netz: Mit MIN_WEIGHT und MAX_WEIGHT kann eingestellt werden, im welchem Zahlenbereich die Gewichte $w$ gewürfelt werden sollen (die Default-Einstellung sollte einigermassen ok sein).
  • Probiere verschiedene Parametereinstellungen aus (beim neuronalen Netz kannst du vermutlich auch 10-Mal so viele Epochen verwenden, beim Naive Bayes gut 100-Mal so viele).
  • Wie vergleichen sich die vier Varianten: neuronales Netz aus 3.1, Naive Bayes aus 3.2, neuronales Netz und Naive Bayes aus 3.3? Halte deine Beobachtungen im Textfeld fest.
  • Lies danach am Ende dieses Auftrags unsere Meinung dazu, wie sich die vier Varianten miteinander vergleichen lassen.

Loading ⌛


Monte-Carlo neuronales Netz


Monte-Carlo Naive Bayes

Unsere Meinung


4. Fortsetzung folgt...

Jetzt hast du schon einiges über die Funktionsweise, Umsetzungsvarianten, Möglichkeiten und Grenzen maschinellen Lernens gelernt. Im 🤖 Teil 3 erfährst du detaillierter, wie mit einem iterativen Verfahren schrittweise Gewichte so angepasst werden können, dass der Fehler im Mittel über mehrere Schritte hinweg abnimmt.


Eigene Notizen

Loading ⌛

1) , 5)
eigene Darstellung, CC0 1.0
2)
Gewicht heisst im Englischen „weight“, daher das $w$.
3)
Alternativ kann auch eine Punktzahl verwendet werden, welche am Ende möglichst gross sein soll.
4)
Konkret müssen $f_{ML}(x)$ und $J(w)$ nach den Gewichten $w$ ableitbar sein.
6)
Diese Fehlerfunktionen werden üblicherweise als Verlust- oder Risikofunktionen bezeichnet.