Neuronale Netze sind eine der aktuell wichtigsten Technologien im Bereich Machine Learning und künstlicher Intelligenz. Sie revolutionieren verschiedene Anwendungsgebiete, von Strategiespielen bis hin zur Bild- und Spracherkennung. Dieses Tutorial bietet einen umfassenden Einstieg in die Welt der neuronalen Netze mit Python.
Einführung in neuronale Netze
Wenn wir von "Neuronalen Netzen" sprechen, meinen wir artifizielle neuronale Netze (ANN). Die Idee eines ANN basiert auf biologischen neuronalen Netzen, wie sie z.B. im menschlichen Gehirn vorkommen. Die Basiseinheit eines neuronalen Netzes - sowohl eines artifiziellen als auch eines lebendigen - ist das Neuron.
Biologische Grundlagen
Die Signalverarbeitung im Neuron beginnt bei der Aufnahme von Signalen anderer Zellen an den Dendriten. Jedes Neuron hat zahlreiche, weitverzweigte Dendriten, die an viele andere Zellen angrenzen. Somit kann jedes Neuron quasi aufspüren, falls andere Zellen aktiv sind. Innerhalb der Zelle löst das Signal üblicherweise eine Reaktion aus. Dabei gibt es viele verschiedene Arten, wie Zellen auf Signale reagieren. Manche reagieren graduell (umso größer der Input, umso größer der Output) andere hingegen diskret (nur bei Überschreitung eines bestimmten Schwellwerts wird ein Output generiert). Das Axon ist nun quasi der Ausgabekanal. Falls ein Signal innerhalb der Zelle ausgelöst wurde, ist es die Aufgabe des Axons dieses Signal an andere Zellen weiter zu leiten. Diese Prozesse laufen kontinuierlich und jederzeit in unserem Körper ab.
Künstliche neuronale Netze (KNNs)
Ein künstliches neuronales Netz ist eine Methode des maschinellen Lernens im Bereich der künstlichen Intelligenz. Es basiert, wie der Name bereits verrät, auf dem biologischen Konzept von Neuronen. Diesem Prinzip folgend sind KNNs aufgebaut. Es besitzt Input- (Eingabe, zum Beispiel ein Foto eines Tiers), Zwischen- und Output- (Ausgabe, zum Beispiel die Kategorisierung Hund / Katze) Ebenen. Während die Eingabe der Aufnahme der Signale entspricht, wird in den mittleren Ebenen ("Layers") entschieden wie das Netz darauf reagiert, um den Output zu generieren.
Die Besonderheit an künstlichen neuronalen Netzen im Vergleich zu anderen Algorithmen, besonders auch zu anderen Machine Learning ist, dass KNNs abstrakte Zwischenkonzepte lernen können. Einfach gesagt nutzt ein neuronales Netz Lernmaterial (zum Beispiel Bilder) um daraus ein allgemeines Konzept ("Modell") zu lernen.
Lesen Sie auch: Einführung in neuronale Netze
Das Perzeptron
Ein einfacher Weg künstliche neuronale Netze auch visuell zu erklären ist das Perzeptron, das 1958 von Rosenblatt vorgestellt wurde. Die Eingangssignale werden mit den Gewichten (engl. "weights") multipliziert, jeder Eingang hat sein zugeordnetes Gewicht. Wenn also ein Signal ankommt, wird es mit dem Wert des Gewichts des individuellen Eingangs multipliziert, das diesem Eingang zugeordnet ist. So hat ein Neuron mit drei Eingängen auch drei Gewichte, die individuell angepasst werden können. Danach werden die Eingangssignale summiert. Es ist auch möglich, einen sogenannten Bias "b" dazu zu addieren, der ein von anderen Neuronen unabhängiges Eingangssignal darstellt. Schliesslich wird er Ausgangswert festgelegt. Die einfachste Form einer Aktivierungsfunktion ist eine Binärfunktion.
Benötigte Bibliotheken
Um das folgende neuronale Netz zu bauen, brauchst du zum einen TensorFlow und zum anderen Keras - beide kannst du leicht mit pip installieren.
- TensorFlow: Ist sozusagen der Motor des Modells. Hier findet der Lernprozess statt, bei dem das neuronale Netz optimiert wird. Diese Programmbibliothek taucht zwar nirgends im Code auf, wird aber trotzdem von Keras als Backend benötigt.
- Keras: Ist das in Python geschriebene und leicht zu bedienende Armaturenbrett, mit dessen Hilfe wir das Modell definieren und es dann an TensorFlow übergeben.
- sklearn: Wird benötigt, um die Rohdaten in Trainings- und Testdaten zu splitten.
Aufbau eines einfachen neuronalen Netzes
Wir bauen ein simples neuronales Netz mit einer versteckten Schicht (engl.: „hidden layer“). Hierbei sind alle Inputvariablen mit allen Knoten der versteckten Schicht verbunden. Der Einfachheit halber gibt es in der versteckten Schicht genauso viele Knoten wie es Inputvariablen gibt. Diese Knoten wiederum sind mit einem Output verbunden.
Datenvorbereitung
Als nächstes spielen wir die Daten ein und definieren die Trainings- und Testdaten. Als Beispiel nehme ich einen Auszug aus den Wohnungsdaten aus dieser Beitragsreihe. Unser Ziel ist es, mit Hilfe des neuronalen Netzes vorherzusagen, ob sich in einer neu zu vermietenden Wohnung schon eine Küche befindet oder nicht. Die Variablen X und y liegen schon als Numpy-Arrays vor und müssen nur noch in Trainings- und Testdaten gesplittet werden.
Modell erstellen mit Keras
Mit der Funktion Sequential() bauen wir ein Modell, bei dem wir manuell Schicht für Schicht zum neuronalen Netz hinzufügen können. Das tun wir mit der Methode add(), in der wir die Art der Schicht definieren. In diesem Fall fügen wir mit Dense() eine reguläre Schicht hinzu, bei der jeder Knoten dieser Schicht mit jedem Knoten der nächsten Schicht verbunden ist. Innerhalb dieser Funktion definieren wir zunächst die Anzahl der Knoten (16) und die Anzahl der Inputvariablen (dieser Schritt ist nur in der ersten Schicht notwendig). Außerdem bestimmen wir mit dem Argument kernel_initializer den Anfangszustand aller Gewichtungen zwischen den Knoten, welche während des Trainings optimiert werden. Der ersten und einzigen versteckten Schicht fügen nun noch eine weitere „Schicht“ hinzu.
Lesen Sie auch: Das Nervensystem verstehen
Modell kompilieren und trainieren
Bevor wir das Modell trainieren, muss es erst kompiliert werden. Hier definieren wir kurz gesagt, wie der Lernprozess ablaufen soll. Wir sagen dem Algorithmus, welche Fehlerfunktion auf welche Art und Weise minimiert werden soll und welche Kennzahl während der Optimierung ausgegeben werden soll.
Wir schieben die kompletten Daten insgesamt 10-mal durch das neuronale Netz. In jedem dieser Durchgänge werden die Daten in Batches (deutsch: „Stapel“, „Stoß“, „Ladung“) von je 25 Instanzen - in unserem Fall 25 Wohnungen - in das Netz eingespeist. Nach jedem Batch wird eine Fehlerfunktion berechnet und die Gewichte zwischen den Knoten werden entsprechend angepasst, sodass der Schätzfehler kleiner wird. Während der Algorithmus arbeitet, wird der Fortschritt vom Programm ausgegeben. Nach 10 Durchgängen hat unser Modell eine Präzision von über 98% erreicht.
Neuronale Netze im Detail
Neuronale Netze bestehen im Prinzip immer aus vier Bestandteilen:
- Dem Input-Layer
- Dem/den Hidden-Layer/n
- Dem Output-Layer
- Kanten, die die einzelnen Layer verbinden
Genauer verbinden die Kanten einzelne Knoten innerhalb der Layer, wobei jeder "Knoten" als eine Art Container für einen numerischen Wert fungiert. Die Kanten zwischen den Knoten sind mit Gewichten versehen, die definieren wie der Input über die Kante zum nächsten Knoten berechnet wird.
Input-Layer
Der Input sind die zu lernenden Konzepte und bestehen zum Beispiel aus annotierten Bildern, Text oder einfach numerischen Werten. Ganz konkret ist beispielsweise der Grauwert eines Pixels eines Bildes ein typischer Inputwert für ein neuronales Netz. Folglich kommt ein Inputlayer schon bei einer sehr spärlichen Größe eines Bildes von nur 32 x 32 Pixel auf 1024 Input-Knoten. Bei einer Größe von 256 x 256 sprechen wir bereits über 65.536 Pixel.
Lesen Sie auch: Funktionsweise Neuronaler Netze
Üblicherweise besteht der Input eines neuronalen Netzes aus einem "Stimulus", also Bildern, Texten, Sound oder ähnlichem. Um beim Beispiel des Bildes zu bleiben: Hier besteht der Input normalerweise aus dem Grauwert jedes einzelnen Pixels. Bei tabellarischem Input wäre jedes Feature ein Input-Wert, wie beispielsweise alle Attribute eines Kunden (z.B. Dauer Mitgliedschaft, Geburtsjahr, Anzahl an genutzten Services..).
Hidden-Layer
Das oder die Hidden-Layer stehen zwischen Input und Output und repräsentieren den Status von (Teil-)Konzepten. Es gibt eine Bandbreite an möglichen Parametern in den Hidden Layern. Alleine die Frage wie viele "versteckte Schichten" bei einem Netzwerk eingesetzt werden muss aus vielen Blickwinkeln betrachtet werden. Nehmen wir das Beispiel eines Inputs von 256 x 256 Pixeln, also 65.536 Input-Knoten. Bei einer einfachen Deep Learning Topologie mit zwei Hidden Layern und Vollverknüpfung heisst dies, dass Kanten zwischen allen Knoten aller vier Schichten gewichtet werden. Führt man diesen Gedanken weiter, erkennt man dass jedes dieser 8,5 Milliarden Gewichte bei jedem Trainings-Stimulus berechnet und aktualisiert werden muss.
Output-Layer
Als letztes Layer steht der Output-Layer, also die Ausgabe. Die Ausgabe kann verschiedene Formen annehmen, je nach Art des neuronalen Netzes. Die wohl häufigste Ausgabe ist eine Kategorie (“Label”), welches vorher trainiert wurde. Alternativ sind allerdings auch Vorhersagen von Werten. Welche Form der Output auch annimmt, die Ausgabe ist auch das Ergebnis das weiterverarbeitet werden kann. Im Gegensatz zu den Hidden-Layer, den Kanten und deren Gewichte, die aufgrund der schieren Masse nicht bzw. kaum direkt interpretierbar sind, ist der Output sehr einfach zu verstehen. Daher erfüllt das Output-Layer zwei wichtige Funktionen. Zum Einen erlaubt es während des Trainings eine Entscheidung zu fällen, um diese Entscheidung mit der Realität gegenzuprüfen, ob das neuronale Netz bereits ausreichend trainiert ist.
Kanten und Gewichte
Der wichtigste Teil in jedem neuronalen Netzwerk sind die Kanten und die dazugehörigen Gewichte. Eine Kante verbindet zwei Knoten aus zwei verschiedenen Layern oder auch innerhalb eines Layers miteinander. Jede Kante ist mit einem Gewicht versehen, welches definiert, wie der Wert des Ursprungsknoten (z.B. Grauwert eines Pixels) in den Zielknoten übertragen wird. Diese Gewichte sind das Herzstück von Deep Learning, denn sie repräsentieren das gelernte Konzept. Um abermals das Beispiel des Bildes mit einem Hund oder einer Katze zu bemühen, kann ein neuronales Netz lernen, dass ein hoher Identifikator für die Kategorie "Katze" spitze Ohren sind. Somit würden Pixel, die sich dort befinden, wo üblicherweise Ohren befinden, in einer eher spitz zulaufenden Weise hoch gewichtet werden.
Training neuronaler Netze
Das Herzstück von künstlichen neuronalen Netzwerken ist das Training. Hierzu wird der Input genutzt, um iterativ die Gewichte der einzelnen Kanten zu definieren. Das neuronale Netz versucht also die Gewichte so zu definieren, um in den Endknoten (Output) das korrekte Label zu erreichen. Genauer definiert nutzt das KNN den Input (zum Beispiel Grauwert 100 an Pixelposition 222), multipliziert ihn mit dem Gewicht der Kante (zum Beispiel 0.5) um das Ergebnis (Wert 50) im Knoten des Hidden Layers zu speichern. Im Outputlayer angekommen definiert die sogenannte Activation Function (Deutsch Aktivierungsfunktion), ob das künstliche Netz feuert oder nicht - identisch mit dem neurobiologischen Vorbild. Es gibt eine hohe Bandbreite an Aktivierungsfunktionen, welche alle unterschiedliche Stärken und Schwächen haben.
Doch damit hat das Netz bisher erst den Input klassifiziert, noch nicht gelernt, also die Gewichte angepasst. Dazu nutzt man die Antwort des Netzes und vergleicht sie mit dem vorher definierten Label um gegebenenfalls einen Fehler des Netzes festzustellen. Die ausführliche Definition von back propagation ist etwas komplexer und verlangt eigentlich nach einem eigenen Artikel, aber einfach gesagt wird dabei berechnet wie sich die Gewichte eigentlich hätten verhalten sollen und dementsprechend in eine Richtung korrigiert, die ein besseres Ergebnis erwarten lassen (gradient descent). Dieser Vorgang - Input einspeisen, Fehler berechnen und Gewichte korrigieren - wird solange durchgeführt, bis ein Abbruchkriterium erreicht wird. Das Abbruchkriterium ist meist durch eine bestimmten Anzahl an Epochen definiert, wobei eine Epoche beendet ist, wenn alle Trainings-Stimuli einmal angewandt wurden.
Ist der Trainingsprozess durchgeführt und das Netz hat alle Gewichte einem (auf den Trainingsdaten) optimalen Wert zugeführt, kann es eingesetzt werden. Vorher zur Seite gelegte Daten (Test-Set) werden dem Deep Learning Modell zugeführt und die Ergebnisse validiert. Genügt die Performanz, also sind die Vorhersagen zu Genüge korrekt, kann das Netz auf neuen, unbekannten Input angewandt werden.
Daten und Labels
Je nachdem welche Aufgabe das Netz oder Deep Learning Modell dann erledigen soll muss für das Training noch ein sogenanntes Label mitgeliefert werden. Im Falle einer kategorialen Zuordnung (“Klassifikation”) beinhaltet dieses Label eben die Kategorie, in die das Beispielbild fällt. Die Labels sind insofern absolut fundamental, da sie als Kontrolle dienen, welche Aufgabe das neuronale Netz lernt.
Zu Beginn eines Trainings existieren die Knoten der verschiedenen Layer, in welche das (Zwischen-)Ergebnis jedes Wertes eingetragen werden. Dazwischen steht der Knoten mit seinem Gewicht. Folglich muss man sich bei Initialisierung auch überlegen, wie man die Gewichte festlegt. Das Problem ist, werden die Gewichte ungünstig initialisiert kann dies dazu führen, dass alle Hidden Layer das gleiche lernen oder sehr langsam lernen.
Anwendungsgebiete neuronaler Netze
Im Prinzip gibt es drei Hauptanwendungsgebiete von künstlichen neuronalen Netzen und Deep Learning.
- Klassifikation: Die Classification, auf Deutsch “Klassifikation”, also das Einordnen von einem Input in eine Kategorie. Klassifikation ist eine Art von Machine Learning Algorithmus, die Input in eine Kategorie einordnet. Dabei kommt die Classification aus der Kategorie “Supervised Learning”, also dem überwachten Lernen. Die Beispiele die wir mehrfach angeführt haben (Handschrifterkennung, Hund / Katze) sind eben aus der Kategorie Classification. Es gibt eine ganze Bandbreite an Beispielen für die Anwendung von Classifiern. Von der Gesichtserkennung über die Erkennung von Betrugsversuchen im Banking bis zur Abschätzung ob ein Kunde noch länger Kunde bleiben wird fallen viele Ideen in die Vorhersage von Kategorien.
- Regression: Ein weiteres Beispiel aus der Kategorie des Überwachten Lernens sind Anwendungsfälle aus dem Bereich der Regression. Als Regression bezeichnet man generell Prädiktion von Werten. Ein Label im Bereich der Regression entspricht nicht einer Kategorie wie in der Klassifikation, sondern vielmehr einem kontinuierlichen Wert. Ein sehr bekanntes Beispiel ist die Vorhersage von Umsatzzahlen in einem Unternehmen. Mit einem solchen Regressionsmodell lassen sich dann entsprechend zukünftige Zahlen vorhersagen. Als Beispiele gibt es Saleszahlen, Rücksendungen, Temperatur, optimaler Preis und vieles mehr.
- Clustering: Als dritte Hauptkategorie des Einsatzes von Deep Learning und künstlichen neuronalen Netzen gilt das Clustering. Clustering bezeichnet das Erkennen von Gruppen von Datenpunkten anhand ähnlicher Merkmale. Im Gegensatz zur Classification und Regression sind Clustering Algorithmen sogenannte Unsupervised Machine Learning Algorithmen, zu Deutsch unüberwachtes Lernen, und brauchen keine Vorinformation über das Ergebnis. Dabei sei gesagt, dass es eher unüblich ist, ein künstliches neuronales Netz für Clustering einzusetzen.
Verschiedene Arten von neuronalen Netzen
Es gibt inzwischen eine ganze Reihe an Klassen von neuronalen Netzen. Dabei hat jede Art gewisse Vor- und Nachteile und teilweise werden bestimmte Klassen nur auf bestimmte Probleme angewandt.
- Perceptron: Das einfachste neuronaler Netze, das nur aus einem Input-Layer, einer Aktivierungsfunktion und dem entsprechenden Output besteht. Hidden-Layer sucht man in dieser Version vergebens.
- Feedforward artificial neural network (FFNN): Die nächste Stufe, bei der Information zwar nur in eine Richtung bewegt wird, aber mittels einem Hidden Layer auch Teilkonzepte repräsentiert werden können.
- Deep Learning (DL): Neuronale Netze die mehr als ein Hidden Layer haben. Diese Topologie erlaubt es dem Netzwerk, auch Zwischenkonzepte (wie zum Beispiel Kanten oder Farbverteilungen) zu lernen.
- Recurrent neural networks (RNNs, z.B. Long short term memory networks): Rekurrente neuronale Netze beachten im Vergleich zu normalen feedforward Netzen auch temporale Sequenzen, indem sie sich quasi gewisse Information “zwischenspeichern”. RNNs gelten als eine der stärksten Art von neuronalen Netzen, vor allem in Bereichen der Zeitreihenanalyse.
LSTM-Netzwerke zur Zeitreihenprognose
Ein konkretes Beispiel für die Anwendung von RNNs ist die Prognose von Zeitreihen, wie z.B. dem Stromverbrauch. Hierbei kommen oft Long Short-Term Memory (LSTM) Netzwerke zum Einsatz.
Datenvorbereitung und Modellierung
Für die Datenvorbereitung und Erstellung des Prognosemodells wird ein Jupyter Notebook erstellt. In Anaconda wird zunächst eine neue Umgebung (engl. environment) mit dem Namen "tf" eingerichtet. Mit Hilfe des Befehls pip install keras wird z.B. die Keras-Bibliothek installiert. Über das Menü "New" wird ein neues Python3-Notizbuch mit dem Namen elab2go-Demo-PY5 angelegt.
Die Bibliotheken müssen vor Verwendung installiert sein. Pakete (engl. packages) nach keras, tensorflow etc. sowie Funktionen und Klassen aus diesen Bibliotheken. Das sklearn-Packet metrics enthält Funktionen, mit denen man die Güte eines Vorhersagemodells bewerten kann.
Die Spalte Verbrauch (unsere Rohdaten für die Zeitreihe) wird in einen DataFrame series extrahiert. Eine stationäre Zeitreihe hat zu allen Zeitpunkten den gleichen Erwartungswert und die gleiche Varianz. Stationarität ist eine wünschenswerte Eigenschaft, um ein funktionierendes Prognosemodell erstellen zu können.
Die Daten werden in Trainings- und Testdaten aufgeteilt. D.h. wir ein NumPy-Array train_s. Beim überwachten Lernen liegt für jeden Datensatz der Input-Daten (X) eine bekannte Bewertung (Y) vor, d.h. der Merkmale enthält. Konkret werden aus der Zeitreihe z.B. extrahiert. und aus den Testdaten die Numpy-Arrays X_Test und Y_Test.
Ein Modell wird erstellt, indem seine Netzwerk-Topologie festgelegt wird, d.h. mit der Zielausgabe Y_Train übereinstimmt. Die Sequential-Klasse ermöglicht das sequentielle Zusammenfügen von Schichten (engl. layers). Füge dem Modell in einer for-Schleife N_LAYER versteckte LSTM-Schichten hinzu. und der dropout-Parameter, der festlegt, welcher Anteil an Ausgangsknoten der Schicht beim Trainieren "vergessen" werden soll. Jede Zelle einer LSTM-Schicht erwartet eine dreidimensionale Eingabe. Eine LSTM-Schicht, die eine Eingabesequenz von Zeitreihendaten verarbeitet, wird jedoch einen einzelnen Wert als 2D-Array zurückliefern. Als letzte Schicht fügen wir eine Dense-Schicht hinzu. Standardschicht eines neuronalen Netzwerkes. Standardmäßig wird keine Aktivierungsfunktion verwendet, d.h. unverändert weitergegeben.
Die Methode compile() konfiguriert das Modell, d.h. für die Trainingsphase vor. Das Trainieren des Modells geschieht mit Hilfe der Funktion fit(). trainiert daran in einer festgelegten Anzahl von Iterationen ("Epochen") das Neuronale Netzwerk, d.h. epochs: Anzahl der Epochen, d.h. Trainingsdurchläufen des Algorithmus. batch_size: Größe eines Batchs. danach mit den nächsten 64 etc. validation_split: Anteil der Trainingsdaten, die für die Validierung verwendet werden.
Validierung und Prognose
Mit Hilfe des Testdatensatzes wird das Modell validiert, d.h. es wird eine Prognose erstellt und für diese werden Performancemetriken ausgewertet. geeignete Performance-Maße, um die Güte einer Prognose zu bewerten. dadurch wird die Auswirkung einzelner Abweichungen gemittelt. predict() bzw. inverse_transform() akzeptiert zu werden. D.h. ersten beiden Spalten enthalten.
In diesem Schritt wird das zuvor erstellte Neuronale Netzwerk eingesetzt, um eine Prognose für das Jahr 2020 zu erstellen.
Herausforderungen bei der Entwicklung neuronaler Netze
Neuronale Netze zur Bilderkennung zu entwickeln, ist eine Herausforderung. Als vor einigen Jahren die Studentin Fei-Fei Li mit Programmen zur Bilderkennung anfing, hatten diese Anwendungen einen stark geometrieorientierten Ansatz. Ihre Software suchte in Bildern abstrakte, geometrische Figuren und versuchte, aus diesen zu schließen, was auf dem Bild zu sehen ist. Wenn das zu erkennende Objekt eine andere Position einnimmt oder nur teilweise sichtbar ist, erweist sich ein solches Vorgehen als schwieriges Unterfangen.
Der heutige Ansatz orientiert sich mehr daran, wie ein Mensch lernt, Objekte in Bildern zu erkennen. Als Kind sieht er etwas, deutet darauf und bekommt von den Eltern oder im Kindergarten erklärt, dass es sich hierbei um eine Katze handelt. Will man diesen Prozess in einem Computer nachstellen, so folgerte Fei-Fei Li, benötigt man als Erstes sehr viele Bilder, deren Inhalt bekannt ist.
Lineare Separierbarkeit und das XOR-Problem
Wie wir im vorherigen Kapitel unseres Tutorials über maschinelles Lernen gezeigt haben, genügte ein neuronales Netzwerk, das nur aus einem Perzeptron besteht, um unsere Beispielklassen zu trennen. Natürlich haben wir diese Klassen sorgfältig entworfen, damit es funktioniert. Es gibt viele Klassen-Cluster, bei denen es nicht funktioniert. Unsere bisherigen Klassen waren linear separierbar. lineare Separierbarkeit ergibt Sinn in der euklidischen Geometrie. Andernfalls, falls eine solche Trennlinie nicht existiert, bezeichnet man die beiden Klassen als nicht linear separierbar.
Perzeptron für die AND-Funktion
In unserem nächsten Beispiel programmieren wir ein einfaches Neuronales Netzwerk, welches die logische AND-Funktion implementiert. Wir haben im vorherigen Kapitel gelernt, dass ein neuronales Netzwerk mit einem Perzeptron und zwei Eingan als Trennlinie interpretiert werden kann, d. h. eine Gerade, die zwei Klassen teilt. Wir haben auch herausgefunden, dass ein solches primitives neuronales Netzwerk nur in der Lage ist, Geraden durch den Ursprung zu beschreiben.
Perzeptron mit Bias
Ein Perceptron mit zwei Eingangswerten und einem Bias-Wert entspricht einer allgemeinen Geraden. Während sich die Eingangswerte ändern können, bleibt der Bias-Wert immer konstant. Tupel mit den Werten der Gewichte. Wir erstellen ein anderes Beispiel mit linear trennbaren Datensätzen, für die wir auch einen Bias-Knoten zur Trennung benötigen.
Das XOR-Problem
Im folgenden Abschnitt werden wir das XOR-Problem für neuronale Netzwerke einführen. Es ist das einfachste Beispiel eines nicht linear trennbaren neuronalen Netzwerks. Egal welche Gerade man wählt, es wird einem niemals gelingen, die blauen Punkte auf einer Seite und den orangefarbenen Punkten auf der anderen Seite zu haben. Dies ist in der folgenden Abbildung dargestellt. Die orangefarbenen Punkte befinden sich auf der orangefarbenen Linie. Dies bedeutet, dass dies keine Trennlinie sein kann. Wenn wir diese Zeile parallel bewegen - egal in welche Richtung, es gibt immer zwei orangefarbene und einen blauen Punkt auf einer Seite und nur einen blauen Punkt auf der anderen Seite. Wenn wir die orangefarbene Linie nicht parallel bewegen, gibt es auf beiden Seiten einen blauen und einen orangefarbenen Punkt, außer wenn die Linie einen orangefarbenen Punkt durchläuft. Um dieses Problem zu lösen, müssen wir eine neue Art von neuronalen Netzwerken einführen, ein Netzwerk mit sogenannten verborgenen Schichten (hidden layers). Wir benötigen nur eine verborgene Schicht mit zwei Neuronen. Eine arbeitet wir ein AND-Gatter und die andere wie ein OR-Gatter. Wie bereits erwähnt, können wir keine Trennlinie finden, die die orangefarbenen Punkte von den blauen Punkten trennt. Sie können jedoch durch zwei Linien getrennt werden, z. B. Um dieses Problem zu lösen benötigen wir ein Netzwerk der folgenden Art, d. h. Das Perzeptron N1 bestimmt eine Trennlinie, z. B.