Home » Data Science » Neuronales Netzwerk mit PyBrain

Neuronales Netzwerk mit PyBrain

Neuronale Netze gelten als eine der modernsten Methoden des maschinellen Lernens, die dahinterliegende Mathematik und Logik schreckt allerdings viele davon ab, sich näher damit zu beschäftigen. Um die grundlegenden Prinzipien zu verstehen reicht allerdings schon das Lesen einiger Einführungen wie bei Wikipedia oder Videos wie dieses bei YouTube. Hat man den Grundaufbau dahinter verstanden kann man mit Hilfe moderner, einfach zu nutzender Bibliotheken schnell ein eigenes Netz entwerfen und für einfache Anwendungsfälle nutzen.
Um das zu demonstrieren habe ich für diesen Beitrag mit Hilfe der Bibliothek pybrain für die Sprache Python ein künstliches neuronales Netzwerk erstellt, dessen Ziel es ist, anhand eines eingegebenen Vornamens festzustellen, ob es sich bei dem Namen um einen weiblichen oder männlichen handelt. Den Quellcode dazu habe ich bei Github bereitgestellt, Ihr findet ihn hier: binspeak/learn-gender-from-names.

Der Code veranschaulicht die Abläufe, die bei der Nutzung neuronaler Netze im Allgemeinen immer gleich ablaufen:

1. Daten einlesen und aufbereiten

Um das Netzwerk trainieren zu können liegen im data-Ordner des Repositories zwei Dateien mit insgesamt fast 10.000 nach Geschlecht getrennten Vornamen. Das Script liest diese Daten ein und fügt zu jedem Namen einen Erwartungswert für die Ausgabe hinzu (1 für weibliche, 0 für männliche Namen).
An dieser Stelle steckt auch der oft komplizierteste Teil der Arbeit mit neuronalen Netzen. Die Erstellung eines geeigneten Models, d.h. die Definition der Eingangsvariablen für das Netz und die Transformation vorhandener Daten. Da ein Computer nicht mit Buchstaben rechnen kann, muss jede Eingabe entweder binär (0 oder 1), kategorisiert (z.B. 0,1,2,3) oder kontinuierlich (z.B. alle Zahlen zwischen 0 und 1) sein.
Außerdem muss man definieren, welche Parameter überhaupt ins Netzwerk fließen sollen. Einige der erfolglosen Varianten, die ich hier ausprobiert habe, waren:

  • Länge des Namens
  • Verhältnis von Vokalen und Konsonanten
  • Erster / Letzter Buchstabe ist ein Vokal
  • Anzahl Vokale

Da all dies keine guten Ergebnisse brachte (Im Gegensatz z.B. zu einer Regressionsanalyse mit diesen Werten, dazu aber an anderer Stelle mehr) habe ich schließlich entschieden als Eingabe die ASCII-Nummern (abzgl. 96 um bei 1 anzufangen) aller Buchstaben zu übergeben und mich auf sechs Eingangsknoten zu beschränken. Sie stehen für die drei Buchstaben am Anfang des Namens und die drei am Ende. Der Name thomas wird damit z.B. zur Eingabe  [20, 8, 15, 13, 1, 19]

2. Aufbau des Netzes

Dank pybrain ist das ein sehr einfacher Teil, es reicht eine Zeile Code

net = buildNetwork(6, 5, 1, bias=True)

Damit wird ein Netz mit sechs Neuronen im input layer, fünf im hidden layer und einem im output layer erzeugt und angegeben, das ein Bias- Neuron in jeder Ebene hinzugefügt werden soll. Die Gewichte jedes Neurons werden automatisch mit zufälligen Werten vorbelegt. PyBrain bietet hier jede Menge Einflussmöglichkeiten die auch komplexe Netze ermöglichen, dazu sei die Dokumentation empfohlen.

3. Training

Um nun das Netzwerk mit den vorhandenen Daten zu trainieren ist folgender Code zuständig:

trainer = BackpropTrainer(net, dataset)
trainer.trainUntilConvergence(maxEpochs=max_epochs)

Ein Backpropagation-Trainer wird mit den geladenen Daten und dem Netzwerk initialisiert und das Training wird gestartet, das sich auf eine feste Anzahl Iterationen beschränken lässt.

4. Netzwerk nutzen

Ist das Training abgeschlossen, kann es zur Bestimmung des Geschlechts eines Vornamens verwendet werden. Dazu muss lediglich folgender Aufruf ausgeführt werden:

net.activate(<input>)

Wobei <input> hier wieder für sechs Integer-Werte steht, die aus dem gegebenen Namen extrahiert werden. Als Ausgabe erhält man einen Wert zwischen 0 und 1, der wie folgt interpretiert werden kann: liegt der Wert über 0.5, klassifiziert das neuronale Netz den Namen als weiblich, sonst als männlich.

Will man mit dem Script einen konkreten Namen testen, kann man es entweder in einer Python Shell starten oder als Eingabe-Parameter beliebige Namen mitgeben:

python learn.gender-from-names.py markus annika george diana

Zusammenfassung

Das Script definiert einige einstellbare Parameter die unterschiedlichen Einfluss auf das Netzwerk haben. Die Ergebnisse, die auch im Output des Scriptes zu sehen sind, zeigen meistens eine Trefferquote von ca 80 % was angesichts des beschränkten Datenraumes durchaus annehmbar ist, auch wenn ein Mensch sicher noch eine deutlich höhere Trefferquote hat. Ich bin mir sicher das man mit  einer geeigneten Feinjustierung ein noch besseres Ergebnis erzielen kann aber als Demonstration ist diese einfache Variante in meinen Augen sehr gut geeignet. Für Verbesserungsvorschläge oder für den Hinweis auf Fehler bin ich sehr dankbar, nutzt also gerne die Kommentarfunktion unter diesem Beitrag.

PyBrain bietet einen wirklich einfachen Einstieg in neuronale Netze den man konsequent erweitern kann um sein eigenes Verständnis zu verbessern. Leider scheint die Entwicklung im Moment still zu stehen, weshalb ich bereits mit einigen anderen Bibliotheken wie Caffe oder Keras experimentiere. Mit denen lässt sich dann das Training sogar auf GPUs durchführen, was sicher eine enorme Leistungssteigerung mitbringt.

Ich hoffe bald davon berichten zu können!

Leave a Reply