Seitenanfang

DIY Neurales Netz

In letzter Zeit habe ich wieder Mal viel Zeit alleine auf Autobahnen verbracht und neuerdings dazu Podcasts über Neurale Netze und künstliche Intelligenz mitgenommen. Mit der unglaublichen Vorbildung von rund 10 Stunden Podcasts entstand im letzten Stau schließlich das Grundkonzept für ein neurales Netz, implementiert in Go.

Podcast-Tipps

Ziel

Meine DIY-Lösung soll weder Hunde noch Katzen erkennen, sondern sinnvolle Wörter von Buchstabenmüll unterscheiden können. Den Zeichensatz beschränke ich dafür auf Großbuchstaben, Zahlen, Leerzeichen und den Punkt, die maximale Länge auf 20 Zeichen.

Als Trainingsdaten verwende ich 60.840 meinen Bedingungen entsprechenden Wörter aus einem deutschen Wörterbuch für Linux sowie 100.000 mit pwgen produzierte zufällige Zeichenkombinationen.

Die ersten Testmengen sind die gleichen wie die Trainingsmengen. Das widerspricht zwar in gewisser Weise der Anforderung, Neuronale Netze müssten auch andere als die bisher gesehenen Daten erfolgreich verarbeiten können, aber für einen ersten Test meiner DIY-Lösung halte ich dieses Vorgehen für ausreichend.

Input-Layer

photo5346137306379167893.jpgDie Eingangsdaten (d.h. jedes einzelne Wort) werden von einer Eingangsverarbeitung (Input-Layer) zu einem hochdimensionalen Vektor verrechnet. Genau genommen hat jeder Datenvektor 2244 Dimensionen. Der Wertebereich jedes Vektorelements bewegt sich meist zwischen 0 und 1, aber Werte bis zu 20 sind theoretisch möglich.

Der Datenvektor besteht im Einzelnen aus fünf Komponenten.

Länge des Wortes

Die ersten 20 Elemente haben alle bis auf eines den Wert 0, nur das Element für die Länge des Wortes wird auf 1 gesetzt. Das Wort "Neuron" (6 Zeichen lang) würde hier (0 0 0 0 0 1 0 0 0 ... 0) entsprechen.

Ich habe mich gegen die simple Angabe der Länge als ein Element entschieden, um nicht einfach nur die Durchschnittslänge einfließen zu lassen. Vielleicht sind Wörter mit 7 Zeichen sehr selten bzw. unwahrscheinlich während 6 und 8 Zeichen häufig vorkommen.

Konsonanten und Vokale

Ein Element gibt das Verhältnis von Konsonanten zu Vokalen als Zahl zwischen 0 und 1 an. Alle anderen Zeichen werden ignoriert.

Positionen der Sonderzeichen

Für jede der 20 möglichen Zeichen eines Wortes gibt es ein Element, das bei einem Sonderzeichen auf 1 und ansonsten auf 0 gesetzt wird. Als Sonderzeichen zählen alle Zeichen außer Buchstaben.

Zwei-Zeichen-Kombinationen

Mein Zeichensatz umfasst insgesamt 38 Zeichen. Für jede mögliche Kombination (38 * 38 = 1444) wird gezählt, wie oft diese im gegebenen Wort vorkommt.

Dieses Kriterium unterstützt die Tendenz unserer Sprache, eher Lautkombinationen als Buchstaben zu nutzen. Ein "nn", "ch" oder "ei" sollte sich zu einem Hinweis auf ein echtes Wort entwickeln während "zy" oder "90" eher selten sind.

"sch" wird sich sowohl im "sc" als auch im "ch" zeigen, da zur Erstellung dieses Teils des Datenvektors ein Sliding-Window-Verfahren genutzt werden soll. Dabei werden immer zwei aufeinander folgende Zeichen betrachtet und danach um ein Zeichen weitergesprungen. Das Beispielwort "Neuron" wird somit als "Ne", "eu", "ur", "ro" und "on" interpretiert.

Zeichenpositionen

Nicht jeder Buchstabe kommt an jeder Stelle gleich häufig vor. Um diese Besonderheiten zu berücksichtigen, besteht der letzte Teil des Datenvektors aus Elementen, die wieder 0 oder 1 annehmen können. Sie repräsentieren die Positionen jedes Buchstaben im Wort. Die ersten 20 Elemente geben an, an welchen Stellen der Buchstabe "A" steht, die folgenden 20 stehen für "B" und so weiter.

Für 20 Positionen und 38 Buchstaben gibt es insgesamt 760 Elemente.

Im nächsten Teil wittmen wir uns dem eigentlichen neuronalen Layer...

 

Noch keine Kommentare. Schreib was dazu

Schreib was dazu

Die folgenden HTML-Tags sind erlaubt:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>