Die hier vorgestellten Experimente mit dem neuronalen Netz sind kurz gehalten und nur beispielhaft. Sie sollen zu eigenen Untersuchungen und zu weiteren und umfangreicheren Arbeiten anregen. Bei allen angegeben Beispielen
Im Kern lernt ein neuronales Netz durch das Training, bei Eingabe eines bestimmten Vektors einen Vektor auszugeben, der möglichst nahe zu einem vorgegebenen Zielvektor ist. Bei einem ersten Experiment wurde die Lernentwicklung eines Netzes untersucht. Dazu wurde beobachtet, wie sich ein Ausgabevektor mit zunehmender Anzahl an Lernschritten (runs) entwickelt. Verwendet wurde ein Netz, bestehend aus drei Schichten mit jeweils vier Neuronen. Die Konfigurationsdatei netzKonfig.txt im Daten-Verzeichnis enthielt lediglich die folgenden fünf Zeilen:
Als Eingabevektor wurde
und als Zielvektor
vorgegeben. Dieses Vektorpaar wurde als einziges in die lernPaare.txt-Datei des Daten-Verzeichnisses aufgenommen:
Danach wurde das Programm mit jeweils gesteigerten Run-Angaben gestartet und abgefragt. Der Startwert mit 0 Lernschritten wurde dadurch erreicht, dass mit dem Abfragen-Skript auf die *.start-Dateien im Daten-Verzeichnis zugegriffen wurde. Die Versuchsreihe führte zu folgenden Ergebnissen:
| Lernschritte | Ausgabevektor |
|---|---|
| 0 | 0,48 0,52 0,53 0,45 |
| 1 | 0,47 0,53 0,52 0,44 |
| 2 | 0,47 0,53 0,52 0,44 |
| 3 | 0,47 0,53 0,52 0,44 |
| 4 | 0,47 0,54 0,51 0,43 |
| 5 | 0,46 0,54 0,51 0,43 |
| 10 | 0,45 0,55 0,49 0,42 |
| 25 | 0,40 0,60 0,44 0,38 |
| 50 | 0,33 0,67 0,37 0,31 |
| 100 | 0,21 0,78 0,24 0,21 |
| 250 | 0,10 0,90 0,11 0,10 |
| 500 | 0,06 0,94 0,06 0,06 |
| 1.000 | 0,04 0,96 0,04 0,04 |
| 2.500 | 0,03 0,97 0,03 0,03 |
| 5.000 | 0,02 0,98 0,02 0,02 |
| 10.000 | 0,02 0,98 0,02 0,02 |
| 20.000 | 0,01 0,99 0,01 0,01 |
Die Werte der Komponenten des Ausgabevektors nähern sich mit zunehmender Lerndauer denen des Zielvektors an und zeigen die Lernentwicklung. Die Frage, welche Wertkombination des Ausgabevektors als ausreichend nahe am Ziel angesehen werden soll, kann nur anwendungsbezogen beantwortet werden.
Mit den nächsten Experimenten soll ein Weg hin zu der Art und Weise aufgezeigt werden, mit der Sprachmodelle (das sind im Kern Satzergänzungssysteme) neuronale Netze verwenden. Dort wird mit speziell belegten Ausgabe- und Zielvektoren gearbeitet. Sie werden One-Hot-Vektoren genannt und sind dadurch charakterisiert, dass jeweils genau eine ihrer Komponenten maximal (nahe bei 1) und alle anderen minimal (nahe bei 0) belegt sind.
Solche Vektoren können zu Zähl- und Identifikationszwecken verwendet werden. Häufig stehen sie für natürliche Zahlen. Es ist üblich, für sie eine vereinfachte Schreibweise zu verwenden, bei der ein Wert nahe bei 0 als 0 und einer nahe bei 1 als 1 angegeben wird. So steht beispielsweise (0 1 0) für den dreistelligen One-Hot-Vektor (0,01 0,99 0,01). Man beachte beim Arbeiten mit diesen Vektoren, dass sie, bevor sie dem Netz übergeben werden können, in ihre Ursprungsform umgeschrieben werden müssen.
Für den folgenden Versuch wurde ein dreischichtiges Netz mit einem (einzigen) Neuron in der Eingabeschicht, drei in der versteckten und zwei in der Ausgabeschicht eingerichtet. Die netzKonfig.txt-Datei hatte folgendes Aussehen:
Zu diesem Netz gehören einstellige Eingabe- und zweistellige Ausgabevektoren. Das Netz wurde mit den folgenden beiden Vektorpaaren trainiert, die hier in ihrer One-Hot-Form angegeben werden:
Hier wird ein Zielkonflikt beim Trainieren sichtbar. Solche Konflikte entstehen immer dann, wenn zwei oder mehr zu lernende Vektorpaare den gleichen Eingabevektor haben. Im obigen Beispiel wird durch das Training verlangt, dass bei Eingabe von ein und demselben Eingabevektor, nämlich dem One-Hot-Vektor (1), sowohl der One-Hot-Vektor (1 0) als auch der One-Hot-Vektor (0 1) näherungsweise ausgegeben werden sollen. Die beiden Komponenten des Ausgabevektors waren bereits nach 500 Lernschritten (runs) auf zwei Nachkommastellen gesättigt. Die Abfrage des Netzes brachte das Ergebnis:
Jedes der beiden Zielmuster wurde zu etwa 50% erreicht. (Es sind Näherungswerte, die auf zwei Stellen abgeschnitten worden sind.) Das heißt, dass sich der Lernvorgang gleichmäßig auf die beiden Zielvektoren verteilt hat. Der Zielkonflikt hat zu einer Ausgabe geführt, die es erlaubt, den Lernprozess statistisch zu interpretieren. Um diesen Sachverhalt weiter zu untersuchen, wurde ein dreischichtiges Netz mit einem Neuron in der Eingabeschicht und jeweils vier in der versteckten und der Ausgabeschicht mit der folgenden netzKonfig.txt-Datei eingerichtet:
Zunächst wurden damit folgende Vektorpaare trainiert, die hier als One-Hot-Vektoren angegeben werden, und die vor ihrer Verwendung in der lernPaare.txt-Datei umgeschrieben werden müssen:
500 Lernschritte (runs) reichten aus, um die statistische Interpretationsmöglichkeit des Lernvorgangs zu bestätigten. Eine Abfrage lieferte das vom Autor auf zwei Nachkommastellen abgeschnittene Ergebnis:
Danach wurde bei gleichem Netz die Sammlung zu lernender Vektorpaare modifiziert zu:
Bei diesen sechs Lernpaaren wird bei jedem Lernschritt die erste Komponente des Zielvektors einmal, die zweite zweimal und die dritte dreimal erhöht, während die vierte unverändert bleibt. Eine Abfrage nach 500 Lernschritten zeigte erneut das statistische Lernverhalten des Netzes bei Zielkonflikten:
Die zugehörigen theoretischen Werte sind:
Damit ist ein Weg aufgezeigt, um beispielweise mit einer Sammlung deutscher Sätze ein neuronales Netz unter anderem so zu trainieren, dass es das Wort lernt, mit dem die vorgelegen Sätze meistens beginnen. Dazu wird zunächst jedem (!!!) Wort der Satzsammlung in einer 1-1-Beziehung ein One-Hot-Vektor zugeordnet. Dann wird eine Belegung eines Eingabevektors festgelegt, die als Kodierung des Sachverhalts Das erste Wort eines Satzes verwendet werden soll. Danach wird aus jedem Satz der vorgelegten Sätzesammlung ein Vektorpaar für die Datei lernPaare.txt abgeleitet. Jedes dieser Paare besteht aus dem Eingabevektor, der für Das erste Wort eines Satzes steht und dem One-Hot-Vektor des jeweiligen ersten Wortes. Das heißt, dass aus der Sätzesammlung die zu lernenden Vektorpaare abgeleitet werden. Man spricht von einem unüberwachten Lernen. Das Lernen des Netzes durch diese Zielkonflikte liefert für jedes erfasste Wort einen statistisch interpretierbaren Wert für seine Häufigkeit in der vorgelegten Sätzesammlung.
Mit den letzten, hier angeführten Experimenten soll darauf aufmerksam gemacht werden, dass der Verwendung von Feedforward-Netzen Grenzen gesetzt sind. Lernen mithilfe des Herbeiführens von Zielkonflikten ist ein Lernen, für das diese Netze gut geeignet sind. Weniger gut geeignet sind sie beispielsweise, um elementares Rechnen wie das paarweise Addieren von Zahlen zu lernen. Darauf soll im Folgenden etwas näher eingegangen werden.
Wird ein Netz mit einer Sammlung von Vektorpaaren trainiert, dann lernt es, zu dem Eingabevektor eines jeden Paars, einen Ausgabevektor zu liefern, der sich nur (möglichst) wenig von dem zugehörigen Zielvektor unterscheidet. Das Netz lernt, die Zielvektoren zu approximieren. Das bedeutet jedoch, dass bei den Ergebnisbewertungen ein Abstandsbegriff zwischen Vektoren verwendet wird. Das wiederum bedeutet, dass auf eine Art Struktur in der Vektorenpaarsammlung Bezug genommen wird. Dadurch wird ein Weg sichtbar, durch eine geeignete Gestaltung der Vektorenpaarsammlung den Abstand zwischen den Vektoren in den Lernvorgang des Netzes einzubeziehen. Das geschieht durch eine geeignete Kodierung der Eingabe- und Zielvektoren. Für Vektoren, deren Komponenten ausschließlich minimal (wie mit 0,01) oder maximal (wie mit 0,99) belegt werden, kann dabei die gleiche vereinfachte Schreibweise verwendet werden wie bei One-Hot-Vektoren. Damit wird beispielsweise der Vektor (0,99 0,01 0,99) als (1 0 1) notiert.
Werden Vektoren in der vereinfachten Schreibweise notiert, dann kann ein elementarer Abstandsbegriff eingeführt werden, nämlich als die minimale Anzahl an Komponenten, die in einem Vektor verändert werden müssen, um eine Gleichheit mit einem anderen Vektor zu erreichen. Als Beispiel können die beiden Vektoren (1 0 1) und (0 1 0) dienen. Sie haben den Abstand 3 voneinander. Dieser Sachverhalt kann folgendermaßen geschrieben werden:
Wenn ein neuronales Netz so trainiert werden soll, dass es natürliche Zahlen paarweise addieren kann, dann besteht ein erster Ansatz darin, die zu addierenden Zahlen als One-Hot-Vektoren zu kodieren. Der Eingabevektor muss die beiden Summanden und gegebenenfalls die Kodierung eines Rechenzeichens aufnehmen. Wird auf Letzteres verzichtet, was bei der vorliegenden Aufgabenstellung angemessen wäre, dann wird ein Netz mit einer Eingabeschicht benötigt, die beide zu addierenden Zahlen in einem gemeinsamen Eingabevektor akzeptiert. Additionsbeispiele wie
führen zu Vektorpaaren, bei denen der Eingabevektor die Kodierungen von a und b aufnehmen muss, und der Zielvektor die von c. Dabei fällt als Erstes auf, dass die Größe der zu addierenden Zahlen ein Netz mit ausreichend vielen Ein- und Ausgabe-Neuronen erfordert. Sollen beispielsweise die Zahlen von 0 bis 50 paarweise addiert werden können, dann wird für jeden der beiden Summanden eine One-Hot-Kodierung mit 51 Stellen und damit ein 102-stelliger Eingabevektor benötigt. Das heißt, dass ein Netz mit 102 Neuronen in der Eingabeschicht einzurichten ist. Das größtmögliche Additionsergebnis bei diesem Beispiel ist 100 (50 + 50), das heißt, dass ein Netz mit einer Ausgabeschicht mit 101 Neuronen erforderlich ist.
Die One-Hot-Kodierung erweist sich bereits bei diesem Beispiel mit noch recht kleinen Zahlen als unhandlich. Es gibt jedoch noch einen weiteren Sachverhalt, der ihre Verwendung beim Addieren von Zahlen als ungünstig erscheinen lässt. Er bezieht sich auf die Abstände zwischen den Eingabevektoren der Trainingsdaten. Sind das One-Hot-Vektoren, dann haben diese alle den gleichen Abstand voneinander, nämlich 2. Das heißt, dass hier unterschiedliche Vektorabstände nicht in den Lernvorgang eingehen können. Um die Folge eines derartigen Trainings zu verdeutlichen betrachte man die Situation, dass ein Netz mit folgenden Rechenbeispielen, bei denen die Addition 2+3 ausgelassen wurde, trainiert wird:
Durch das Training hat das Netz lediglich die einzelnen Zuordnungen gelernt. Es hat nicht gelernt, dass beispielsweise die Zahlen 1 und 2 näher zusammenliegen als 1 und 4. Wird nach dem Training nach dem Ergebnis von 2+3 gefragt, dann wird das Netz dazu eine zufällig zustande gekommene Antwort geben. Es hat nichts über die Abstände zwischen den Zahlen gelernt. Mit anderen Worten: Das Netz hat Rechenbeispiele gelernt, Rechnen jedoch nicht.
Mit Vektoren, deren Komponenten minimal bzw. maximal belegt werden, können natürliche Zahlen binär kodiert werden, beispielsweise folgendermaßen:
Bei dieser Zahlendarstellung ist die Stellenzahl der Ein- und Ausgabevektoren gegenüber einer One-Hot-Kodierung deutlich reduziert, und es gibt unterschiedliche Abstände zwischen den Vektoren:
Allerdings spiegeln die Abstände keine Nachbarschaftsbeziehung wider. Wird ein neuronales Netz wie bei dem Beispiel mit der One-Hot-Kodierung mit den Rechenausdrücken
trainiert, dann erweist sich die mitgelernte Abstandsinformation als zu schwach (zu wenig sequentiell), um verlässliche Ergebnisse für nicht explizit gelernte Berechnungen zu liefern. One-Hot- und Binärkodierungen sind für das Lernen von Berechnungen durch Feedforward-Netze nicht gut geeignet.
Es gibt jedoch eine Zahlenkodierung, die Nachbarschaftsbeziehungen in natürlicher Weise umsetzt. Dazu wird die ausschließlich minimale bzw. maximale Belegung der Vektorkomponenten aufgegeben. Zugelassen werden alle Double-Werte aus dem Bereich ]0, 1[. Ein Wert x aus einem Bereich natürlicher Zahlen wie beispielsweise aus [0, 1, 2, ... , n] kann durch die Berechnung x/n (n ungleich 0) nachbarschaftserhaltend auf einen Wert aus ]0, 1[ abgebildet werden, wobei das Divisionsergebnis 0 durch 0,01 (oder 0,001, oder ...) und 1 als 0,99 (oder 0,999, oder ...) ersetzt wird. Beispielsweise ergibt sich für den Bereich [0, 1, 2, 3] folgende als Normierung bezeichnete Eingabekodierung:
Die zugehörige Ausgabekodierung muss maximal den Wert 6 (3+3) darstellen können (minimal 0):
Das zugehörige Netzwerk benötigt eine Eingabeschicht mit lediglich zwei Neuronen, während die Ausgabeschicht mit einem auskommt. Um zu demonstrieren, dass bei dieser Kodierung Nachbarschaftsbeziehungen in den Lernvorgang eingehen, wurde ein dreischichtiges Netz mit zwei Neuronen in der Eingabeschicht, drei in der versteckten Schicht und einem Neuron in der Ausgabeschicht eingerichtet. Die netzKonfig.txt-Datei lautete:
Trainiert wurde das Netz mit den Rechenbeispielen:
Die Experimente zeigten erst nach 3.000 Lernschritten (runs) eine Sättigung beim Ausgabewert auf zwei Nachkommastellen. Die angestrebten Werte konnten nicht weiter angenähert werden. Ein Abfragen des Netzes zeigte das Erlernen der drei Trainingsbeispiele:
Die folgende Abfrage zeigt, dass bei dieser Ein- und Ausgabekodierung nicht nur die drei trainierten Rechenbeispiele gelernt wurden:
Das Ergebnis zeigt, dass das Netz auch eine nur implizit trainierte Berechnung gelernt hat, wenn auch nicht ganz so gut wie die explizit trainierten. Durch die hier verwendete Ein- und Ausgabekodierung ist beim Training auch die Nachbarschaftsbeziehung zwischen Zahlen in den Lernvorgang einbezogen worden. Das Netz hat gelernt, dass 2 näher bei 1 liegt als 3 und 4 näher bei 3 als 5. Man beachte jedoch, dass Zielvektoren lediglich näherungsweise erreicht werden können, was die Frage nach der Trennschärfe der jeweiligen Ausgabewerte aufwirft. Sie kann durch Verkleinern der Schrittweite für den Gradientenabstieg und durch Einbeziehen weiterer Stellen der Double-Zahlen verbessert werden, beschränkt die Einsetzbarkeit dieses Verfahrens jedoch auf einen schmalen Zahlenbereich. Insgesamt ist festzuhalten, dass Feedforward-Netze nicht gut geeignet sind, um unter anderem Rechnen zu lernen.