Dieser Artikel ist älter als zwei Jahre und womöglich veraltet!

Wieso mein Feedreader jetzt selbst denken kann

Anmerkung: Ich habe seit diesem Artikel Vieles dazu gelernt. Die damalige Herangehesweise konnte aus verschiedenen Gründen nicht funktionieren. Ich habe mich entschieden, den originalen Artikel trotzdem online zu lassen.

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

Aufbau eines künstlichen neuronalen Netzwerkes
Aufbau eines künstlichen neuronalen Netzwerkes (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:

1from pybrain.tools.shortcuts import buildNetwork
2from pybrain.structure.modules import SoftmaxLayer
3
4net = buildNetwork(5, 2, outclass=SoftmaxLayer)

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

1from pybrain.datasets import SupervisedDataSet
2
3ds = 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.

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

Trainiert wird dann so:

1from pybrain.supervised.trainers import BackpropTrainer
2
3trainer = BackpropTrainer(net)
4
5for i in range(0, 100): # so viel man will
6  trainer.train()

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

1print 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.

1Total error: 0.32
2Total error: 0.32
3Total error: 0.32
4Total error: 0.32
5Total error: 0.32
6Total error: 0.32
7[...]

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.

Überschrift
Eine Überschrift eingeben...
Ergebnis
...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!