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
- CRE208 - Neuronale Netze
- Hardware & KI #2: Zum aktuellen Stand von künstlicher Intelligenz
- T3N Filterblase 20: Wie relevant sind künstliche Intelligenz und neuronale Netze für die Wirtschaft?
- Chaos Radio CR221: Künstliche Intelligenz
- Omega Tau 259: Maschinelles Lernen und neuronale Netze
- Deep Dive #6: KI und Machine Learning
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
Die 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