Johannes Mittendorfer

Entwicklung

Wieso mein Feedreader jetzt selbst denken kann

Nach dem Ende der Prüfungsphase an der Uni habe ich jetzt endlich Zeit gefunden die angesammelten Artikel in meinem Feedreader nachzulesen. Das würde sogar Spaß machen, wären da nicht inzwischen zu viele davon und dabei nur etwa ein Viertel oder die Hälfte, die mich auch wirklich interessiert.
Johannes Mittendorfer am 20.07.2015

Will ich mir das wirklich antun? Aber was, wenn ich die interessanten Dinge dabei verpasse? Könnte nicht ein Computer die Themen auswählen, die ich lesen will? - Kann er.

Möglich ist das zum Beispiel mit einem Filter, der nach dem Satz von Bayes arbeitet und mit statistischen Methoden die Wahrscheinlichkeit berechnet. Das klingt aber nicht sehr aufregend. Deshalb habe ich mich für den derzeitigen Super-Star des Computerlernens entschieden: Einem künstlichen neuronalen Netzwerk.

Künstliche Neuronale Netzwerke

Neuronales Netzwerk
Aufbau eines künstlichen neuronalen Netzwerkes (Dake, Mysid [CC BY 1.0], via Wikimedia Commons)

Dabei werden Neuroen verwendet, also Nervenzellen, wie sie auch bei uns im Gehirn vorkommen. Diese werden eingeteilt in eine Eingabeschicht, eine Ausgabeschicht und verdeckte Schichten (engl. hidden layers) dazwischen.

Die Verbindungen zwischen den Schichten sind gewichtet und beschreiben die Weiterleitung eines Reizes bzw. eines Signals, wodurch dann das Ergebnis entsteht. Diese Werte werden anschließend durch eine Funktion in den Bereich zwischen 0 und 1 gemappt.

Durch das Vergleiches mit den Ergebnissen aus den Trainingsdaten kann sich das Netzwerk mit dem Backpropagation-Algorithmus selbst ständig verbessern.

Wer sich noch weiter mit der Theorie beschäftigen möchte, der findet im zugehörigen Wikipedia-Artikel alles, was er braucht: Künstliches neuronales Netz

pybrain

Um das Netzwerk umzusetzen, habe ich Python verwendet und die pybrain Bibliothek. Darin sind bereits alle Algorithmen enthalten und der Aufbau fällt relativ leicht. Mit der folgenden Zeile lässt sich zum Beispiel ein Netzwerk mit fünf Eingabeneuronen und 2 Ausgabeneuronen erzeugen:

from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure.modules import SoftmaxLayer

net = buildNetwork(5, 2, outclass=SoftmaxLayer)

Als nächstes lädt man die Trainingsdaten in einer Form, die vom Netzwerk gelernt werden kann:

from pybrain.datasets import SupervisedDataSet

ds = SupervisedDataSet(5, 2)

Wichtig ist dabei, die gleiche Anzahl an Neuronen wie beim Aufbau des Netzes zu verwenden!

Mit der addSample Methoden werden anschließend die Beispiele hinzugefügt.

ds.addSample([0,1,1,0,0], (0, 1))  # nur ein dummes Beispiel

Trainiert wird dann so:

from pybrain.supervised.trainers import BackpropTrainer

trainer = BackpropTrainer(net)

for i in range(0, 100):   # so viel man will
  trainer.train()

Und schon bekommt man mit etwas Glück ein zufriedenstellendes Ergebnis:

print net.activate([0,0,0,0,1]);

Meine Artikel

Ich möchte also den Titel eines Artikels als Eingabe definieren und dann einen Wert erhalten, der angibt, wie wahrscheinlich mich der Artikel interessiert. Das erste Problem ist, Trainingsdaten zu bekommen. Dazu habe ich ein Plugin für meinen Feedreader geschrieben, der durch Drücken auf den Knopf “Interessant” oder “Langweilig” den Titel und die Berwertung protokolliert.

Leider erwartet so ein Netzwerk aber immer die gleiche Anzahl von Eingaben und diese sollten zudem Zahlen sein. Beides erfüllen Titel von Artikeln eher selten. Die Lösung ist ein Wörterbuch aufzubauen, in dem jedes Wort mit einem Index verbunden ist. Dann wird für jedes Wort im Wörterbuch die Häufigkeit des Vorkommens im Titel angegeben. Ich brauche also so viele Eingabeneuronen, wie ich Wörter im Wörterbuch habe. Füllwörter habe ich vorher entfernt.

So sollte es also gehen. Tut es aber nicht, denn das Netzwerk will einfach nicht lernen.

Total error: 0.32
Total error: 0.32
Total error: 0.32
Total error: 0.32
Total error: 0.32
Total error: 0.32
[...]

Das liegt daran, dass ich zuerst nur ein Ausgabeneuron verwendet habe. Es ist aber so, dass für jede Klasse der Klassifizierung ein eigenes Ausgabeneuron vorhanden sein muss. Also brauch ich davon zwei. Und schon geht es.

Noch schnell alles in eine flask-Anwendung verpacken und per fastcgi deployen, dann ist es einsatzbereit.

Eingabefeld des Netzwerkes
Eine Überschrift eingeben...
Ausgabe des Netzwerks
...und ein Ergebnis erhalten. Aktienkurse interessieren mich nicht wirklich.

Manchmal liegt die AI noch ziemlich daneben, aber das liegt vermutlich daran, dass ich oft selbst nicht so genau weiß, was mich interessiert. Zurzeit zeigt mein Feedreader dieses Ergebnis nur unter dem Artikel an, aber in Zukunft hoffe ich dadurch die Feeds filtern oder zumindest sortieren zu können.

Eines ist es auf jeden Fall: Faszinierend. Faszinierend, wie es möglich ist, Computern etwas beizubringen, ohne sich einen Algorithmus zu überlegen, der nach genauen Regeln vorgeht, denn mit Neuronalen Netzwerken geht es fast von selbst!

PS: Auf das Thema gestoßen, bin ich aufgrund der Bachelorarbeit eines Freundes. Der geneigte Leser möge sich diese hier durchlesen: Recognizing Musical Notation using Artificial Neural Networks

PPS: Ich werde die entsprechende Vorlesung erst im nächsten Semester besuchen. Wenn Sie hier im Theorieteil auf Fehler oder Ungenauigkeiten stoßen: Lassen Sie es mich wissen!

Kommentare