Textanalyse mit neuronalen Netzen in Python

Data Science wäre ohne künstliche neuronale Netze und Deep Learning nicht vollständig. Dieser Artikel erklärt die Konzepte, Bestandteile, Algorithmen und Anwendungsfälle der Textanalyse mit neuronalen Netzen in Python.

Einführung in künstliche neuronale Netze

Ein künstliches neuronales Netz (KNN), englisch "artificial neural network" (ANN), ist eine Methode des maschinellen Lernens im Bereich der künstlichen Intelligenz. Es basiert auf dem biologischen Konzept von Neuronen. Ein KNN besteht aus Input- (Eingabe, z. B. ein Text), Zwischen- und Output- (Ausgabe, z. B. die Kategorisierung des Textes) Ebenen. Die Eingabe entspricht der Aufnahme der Signale, während in den mittleren Ebenen ("Layers") entschieden wird, wie das Netz darauf reagiert, um den Output zu generieren.

Die Besonderheit von KNNs im Vergleich zu anderen Algorithmen, insbesondere auch zu anderen Machine Learning-Methoden, ist, dass KNNs abstrakte Zwischenkonzepte lernen können. Ein neuronales Netz nutzt Lernmaterial (z. B. Texte), um daraus ein allgemeines Konzept ("Modell") zu lernen.

Biologische Inspiration: Neuronen

Die Idee für die Konstruktion von künstlichen neuronalen Netzen stammt aus der Neurobiologie. Neuronen übernehmen die Aufgabe der Signalweiterleitung und -konsolidierung im menschlichen Körper.

Die Signalverarbeitung im Neuron beginnt bei der Aufnahme von Signalen anderer Zellen an den Dendriten. Jedes Neuron hat zahlreiche, weitverzweigte Dendriten, die an viele andere Zellen angrenzen. Somit kann jedes Neuron quasi aufspüren, falls andere Zellen aktiv sind. Innerhalb der Zelle löst das Signal üblicherweise eine Reaktion aus. Dabei gibt es viele verschiedene Arten, wie Zellen auf Signale reagieren. Manche reagieren graduell (umso größer der Input, umso größer der Output) andere hingegen diskret (nur bei Überschreitung eines bestimmten Schwellenwerts wird ein Output generiert).

Lesen Sie auch: Beispiele für Epilepsie-Warnhinweise

Das Axon ist nun quasi der Ausgabekanal. Falls ein Signal innerhalb der Zelle ausgelöst wurde, ist es die Aufgabe des Axons dieses Signal an andere Zellen weiter zu leiten. Diese Prozesse laufen kontinuierlich und jederzeit in unserem Körper ab.

Das dargestellte Beispiel notiert nur die Verhaltensweise von bereits trainierten Neuronen. Der Gedankentransfer in die Welt der Informatik und somit die künstlichen Neuronen liegt darin, dass hier den Neuronen erst beigebracht werden muss, wie sie reagieren sollen. Und genau dies ist eine der Hauptaufgaben im Bereich Data Science bzw. Machine Learning.

Das Perzeptron als visuelle Erklärung

Ein einfacher Weg, künstliche neuronale Netze auch visuell zu erklären, ist das Perzeptron, das 1958 von Rosenblatt vorgestellt wurde. Als Beispiel hier die Funktionsweise eines Perzeptrons. Die drei Inputs (0.8, 0.2, 0.7) werden mit ihren Gewichten (0.5, 1, 0.1) multipliziert und aufsummiert (= 0.4 + 0.2 + 0.07 = 0.67).

Deep Learning: Mehrschichtiges Lernen

Ein weiterer Begriff, der oft im Zusammenhang mit neuronalen Netzen fällt, ist "Deep Learning" oder auf Deutsch "tiefes Lernen". Dabei ist Deep Learning eine Art von neuronalen Netzen, keine eigene Methode. Das hauptsächliche Merkmal von Deep Learning ist gut am deutschen Synonym "mehrschichtiges Lernen" zu erkennen.

Anwendungsfall: Handschrifterkennung

Einer der prominentesten Anwendungsfälle für die Leistung von neuronalen Netzen ist die Handschrifterkennung, genauer die Erkennung von handgeschriebenen Zahlen. Generell klingt die Wahrnehmung von Zahlen nicht besonders schwierig, vor allem da unser Gehirn sehr problemlos dazu fähig ist. Doch wer versucht, ein herkömmliches Computerprogramm zur Erkennung von Handschrift zu schreiben, erkennt schnell wie schwer es ist.

Lesen Sie auch: Die Entschlüsselung des Gehirns

Die Schwierigkeit liegt einerseits darin, dass Zahlen aus mehreren Komponenten (z.B. Striche, Kreise) aufgebaut sind, die je nach Anordnung einen anderen Sinn ergeben. Neuronale Netze lösen die Probleme durch zwei Herangehensweisen. Erstens nutzen sie eine Vielzahl an Trainingsdaten um die Varianz an möglichen Handschriften abzudecken. Dies führt dazu, dass ein Großteil an menschlichen Besonderheiten direkt von Anfang an durch Deep Learning mitbeachtet wird und nicht später gelernt werden muss. Zweitens lernt ein künstliches neuronales Netz nicht fixe Regeln, sondern eher die „Idee“ der Zahlen in abstrakter Weise.

Dass die Erkennung von handgeschriebenen Zahlen so gerne als Beispiel für künstliche neuronale Netze genutzt wird hat zwei Gründe. Zum Einen war die Erkennung von Zahlen für jedes Post-Unternehmen dieser Welt seit jeher eine Mammutaufgabe. Als zweiten Grund für die Beliebtheit des Anwendungsfalls „Zahlenerkennung“ kann man den 1998 veröffentlichten Datensatz „MNIST“ nehmen. Dieser enthält 70.000 Bilder von handgeschriebenen Zahlen und wird seitdem gerne als Leistungsmetrik von Machine Learning Algorithmen eingesetzt.

Die Bestandteile neuronaler Netze

Neuronale Netze bestehen im Prinzip immer aus vier Bestandteilen:

  • Dem Input-Layer
  • Dem/den Hidden-Layer/n
  • Dem Output-Layer
  • Kanten, die die einzelnen Layer verbinden

Genauer verbinden die Kanten einzelne Knoten innerhalb der Layer, wobei jeder "Knoten" als eine Art Container für einen numerischen Wert fungiert. Die Kanten zwischen den Knoten sind mit Gewichten versehen, die definieren wie der Input über die Kante zum nächsten Knoten berechnet wird.

Generell ist es wichtig, sich vorab Gedanken über die Anordnung, Vernetzung und vor allem auch Anzahl an Hidden Layern und der Knoten je Hidden Layer zu machen, da davon sehr stark die Anforderungen an die Rechenleistung und Infrastruktur definiert werden.

Lesen Sie auch: Psychologische Manipulation

Input-Layer

Der Input sind die zu lernenden Konzepte und bestehen zum Beispiel aus annotierten Bildern, Text oder einfach numerischen Werten. Ganz konkret ist beispielsweise der Grauwert eines Pixels eines Bildes ein typischer Inputwert für ein neuronales Netz. Folglich kommt ein Inputlayer schon bei einer sehr spärlichen Größe eines Bildes von nur 32 x 32 Pixel auf 1024 Input-Knoten. Bei einer Größe von 256 x 256 sprechen wir bereits über 65.536 Pixel.

Hidden-Layer

Das oder die Hidden-Layer stehen zwischen Input und Output und repräsentieren den Status von (Teil-)Konzepten. Es gibt eine Bandbreite an möglichen Parametern in den Hidden Layern. Alleine die Frage wie viele "versteckte Schichten" bei einem Netzwerk eingesetzt werden muss aus vielen Blickwinkeln betrachtet werden.

Nehmen wir das Beispiel eines Inputs von 256 x 256 Pixeln, also 65.536 Input-Knoten. Bei einer einfachen Deep Learning Topologie mit zwei Hidden Layern und Vollverknüpfung heisst dies, dass Kanten zwischen allen Knoten aller vier Schichten gewichtet werden. Führt man diesen Gedanken weiter, erkennt man dass jedes dieser 8,5 Milliarden Gewichte bei jedem Trainings-Stimulus berechnet und aktualisiert werden muss.

Output-Layer

Als letztes Layer steht der Output-Layer, also die Ausgabe. Die Ausgabe kann verschiedene Formen annehmen, je nach Art des neuronalen Netzes. Die wohl häufigste Ausgabe ist eine Kategorie ("Label"), welches vorher trainiert wurde. Alternativ sind allerdings auch Vorhersagen von Werten (z.B. Preise) möglich.

Welche Form der Output auch annimmt, die Ausgabe ist auch das Ergebnis das weiterverarbeitet werden kann. Im Gegensatz zu den Hidden-Layer, den Kanten und deren Gewichte, die aufgrund der schieren Masse nicht bzw. nur schwerlich interpretierbar sind, ist der Output meist die Essenz des gelernten Konzeptes.

Daher erfüllt das Output-Layer zwei wichtige Funktionen. Zum Einen erlaubt es während des Trainings eine Entscheidung zu fällen, um diese Entscheidung mit der Realität gegenzuprüfen, ob das neuronale Netz bereits ausreichend trainiert ist. Zum Anderen ist das Output-Layer die Basis für jegliche weitere Verarbeitung.

Kanten und Gewichte

Der wichtigste Teil in jedem neuronalen Netzwerk sind die Kanten und die dazugehörigen Gewichte. Eine Kante verbindet zwei Knoten aus zwei verschiedenen Layern oder auch innerhalb eines Layers miteinander. Jede Kante ist mit einem Gewicht versehen, welches definiert, wie der Wert des Ursprungsknoten (z.B. Grauwert eines Pixels) zum Zielknoten (z.B. eine Kategorie) übertragen wird.

Diese Gewichte sind das Herzstück von Deep Learning, denn sie repräsentieren das gelernte Konzept. Um abermals das Beispiel des Bildes mit einem Hund oder einer Katze zu bemühen, kann ein neuronales Netz lernen, dass ein hoher Identifikator für die Kategorie "Katze" spitze Ohren sind. Somit würden Pixel, die sich dort befinden, wo üblicherweise Ohren befinden, in einer eher spitz zulaufenden Weise hoch gewichtet werden.

Der Trainingsprozess

Üblicherweise besteht der Input eines neuronalen Netzes aus einem "Stimulus", also Bildern, Texten, Sound oder ähnlichem. Um beim Beispiel des Bildes zu bleiben: Hier besteht der Input normalerweise aus dem Grauwert jedes einzelnen Pixels. Bei tabellarischem Input wäre jedes Feature ein Input-Wert, wie beispielsweise alle Attribute eines Kunden (z.B. Dauer Mitgliedschaft, Geburtsjahr, Anzahl an genutzten Services..).

Je nachdem welche Aufgabe das Netz oder Deep Learning Modell dann erledigen soll muss für das Training noch ein sogenanntes Label mitgeliefert werden. Im Falle einer kategorialen Zuordnung ("Klassifikation") beinhaltet dieses Label eben die Kategorie, in die das Beispielbild fällt. Die Labels sind insofern absolut fundamental, da sie als Kontrolle dienen, welche Aufgabe das neuronale Netz lernt.

Zu Beginn eines Trainings existieren die Knoten der verschiedenen Layer, in welche das (Zwischen-)Ergebnis jedes Wertes eingetragen werden. Dazwischen steht der Knoten mit seinem Gewicht. Folglich muss man sich bei Initialisierung auch überlegen, wie man die Gewichte festlegt. Das Problem ist, werden die Gewichte ungünstig initialisiert kann dies dazu führen, dass alle Hidden Layer das gleiche lernen oder sehr langsam lernen.

Das Herzstück von künstlichen neuronalen Netzwerken ist das Training. Hierzu wird der Input genutzt, um iterativ die Gewichte der einzelnen Kanten zu definieren. Das neuronale Netz versucht also die Gewichte so zu definieren, um in den Endknoten (Output) das korrekte Label zu erreichen.

Genauer definiert nutzt das KNN den Input (zum Beispiel Grauwert 100 an Pixelposition 222), multipliziert ihn mit dem Gewicht der Kante (zum Beispiel 0.5) um das Ergebnis (Wert 50) im Knoten des Hidden Layers zu speichern. Im Outputlayer angekommen definiert die sogenannte Activation Function (Deutsch Aktivierungsfunktion), ob das künstliche Netz feuert oder nicht - identisch mit dem neurobiologischen Vorbild. Es gibt eine hohe Bandbreite an Aktivierungsfunktionen, welche alle unterschiedliche Stärken und Schwächen haben.

Doch damit hat das Netz bisher erst den Input klassifiziert, noch nicht gelernt, also die Gewichte angepasst. Dazu nutzt man die Antwort des Netzes und vergleicht sie mit dem vorher definierten Label um gegebenenfalls einen Fehler des Netzes festzustellen. Dieser Fehler wird dann zurückpropagiert.

Die ausführliche Definition von back propagation ist etwas komplexer und verlangt eigentlich nach einem eigenen Artikel, aber einfach gesagt wird dabei berechnet wie sich die Gewichte eigentlich hätten verhalten sollen und dementsprechend in eine Richtung korrigiert, die ein besseres Ergebnis erwarten lassen (gradient descent).

Dieser Vorgang - Input einspeisen, Fehler berechnen und Gewichte korrigieren - wird solange durchgeführt, bis ein Abbruchkriterium erreicht wird. Das Abbruchkriterium ist meist durch eine bestimmten Anzahl an Epochen definiert, wobei eine Epoche beendet ist, wenn alle Trainings-Stimuli einmal angewandt wurden.

Ist der Trainingsprozess durchgeführt und das Netz hat alle Gewichte einem (auf den Trainingsdaten) optimalen Wert zugeführt, kann es eingesetzt werden. Vorher zur Seite gelegte Daten (Test-Set) werden dem Deep Learning Modell zugeführt und die Ergebnisse validiert. Genügt die Performanz, also sind die Vorhersagen zu Genüge korrekt, kann das Netz auf neuen, unbekannten Input angewandt werden.

Anwendungsgebiete von KNNs und Deep Learning

Im Prinzip gibt es drei Hauptanwendungsgebiete von künstlichen neuronalen Netzen und Deep Learning. Dabei ist eine der Anwendung die häufigste:

  • Klassifikation: Die Einordnung von einem Input in eine Kategorie. Klassifikation ist eine Art von Machine Learning Algorithmus, die Input in eine Kategorie einordnet. Dabei kommt die Classification aus der Kategorie "Supervised Learning", also dem überwachten Lernen. Die Beispiele die wir mehrfach angeführt haben (Handschrifterkennung, Hund / Katze) sind eben aus der Kategorie Classification. Es gibt eine ganze Bandbreite an Beispielen für die Anwendung von Classifiern. Von der Gesichtserkennung über die Erkennung von Betrugsversuchen im Banking bis zur Abschätzung ob ein Kunde noch länger Kunde bleiben wird fallen viele Ideen in die Vorhersage von Kategorien.
  • Regression: Die Prädiktion von Werten. Ein Label im Bereich der Regression entspricht nicht einer Kategorie wie in der Klassifikation, sondern vielmehr einem kontinuierlichen Wert. Ein sehr bekanntes Beispiel ist die Vorhersage von Umsatzzahlen in einem Unternehmen. Mit einem solchen Regressionsmodell lassen sich dann entsprechend zukünftige Zahlen vorhersagen. Als Beispiele gibt es Saleszahlen, Rücksendungen, Temperatur, optimaler Preis und vieles mehr.
  • Clustering: Das Erkennen von Gruppen von Datenpunkten anhand ähnlicher Merkmale. Im Gegensatz zur Classification und Regression sind Clustering Algorithmen sogenannte Unsupervised Machine Learning Algorithmen, zu Deutsch unüberwachtes Lernen, und brauchen keine Vorinformation über das Ergebnis. Dabei sei gesagt, dass es eher unüblich ist, ein künstliches neuronales Netz für Clustering einzusetzen.

Klassen von neuronalen Netzen

Es gibt inzwischen eine ganze Reihe an Klassen von neuronalen Netzen. Dabei hat jede Art gewisse Vor- und Nachteile und teilweise werden bestimmte Klassen nur auf bestimmte Probleme angewandt.

  • Perceptron: Das einfachste neuronaler Netze, das nur aus einem Input-Layer, einer Aktivierungsfunktion und dem entsprechenden Output besteht. Hidden-Layer sucht man in dieser Version vergebens.
  • Feedforward artificial neural network (FFNN): Die nächste Stufe, bei der Information zwar nur in eine Richtung bewegt wird, aber mittels einem Hidden Layer auch Teilkonzepte repräsentiert werden können.
  • Deep Learning (DL): Neuronale Netze die mehr als ein Hidden Layer haben. Diese Topologie erlaubt es dem Netzwerk, auch Zwischenkonzepte (wie zum Beispiel Kanten oder Farbverteilungen) zu lernen.
  • Recurrent neural networks (RNNs, z.B. Long short term memory networks): Rekurrente neuronale Netze beachten im Vergleich zu normalen feedforward Netzen auch temporale Sequenzen, indem sie sich quasi gewisse Information "zwischenspeichern". RNNs gelten als eine der stärksten Art von neuronalen Netzen, vor allem in Bereichen der Time Series Analyse oder der Natural Language Verarbeitung.

Neuronale Netze in Python: Bibliotheken und Frameworks

Für die Implementierung neuronaler Netze in Python stehen verschiedene Bibliotheken und Frameworks zur Verfügung. Einige der wichtigsten sind:

  • Scikit-learn: Eine Open-Source-Bibliothek für maschinelles Lernen in Python, frei nutzbar unter der BSD Lizenz. Aufbauend auf den Python-Bibliotheken NumPy und SciPy bietet sie einfache und effiziente Werkzeuge für die Datenanalyse und -verarbeitung. Dadurch eignet sie sich für verschiedene Anwendungsbereichen wie Klassifikation, Regression, Clustering, Modellauswahl oder Daten-Vorverarbeitung. Für den Aufbau neuronaler Netze und Deep Learning-Modelle ist Scikit-learn jedoch weniger geeignet. Ein rudimentärer Aufbau von neuronalen Netzen ist zwar möglich, jedoch nicht so leistungsfähig wie mit spezialisierten Bibliotheken (bspw. TensorFlow oder PyTorch).
  • Keras: Eine benutzerfreundliche Open-Source-Bibliothek, die eine High-Level-API für die Entwicklung und das Training von Deep-Learning-Modellen bietet. Es ist in TensorFlow integriert und unterstützt verschiedene Backends, darunter TensorFlow, Theano und CNTK. Keras ist besonders bekannt für seine Einfachheit und Benutzerfreundlichkeit, was es ideal für Einsteiger und schnelle Prototypenentwicklung macht.
  • TensorFlow: Ein Open-Source-Framework für maschinelles Lernen, das von Google entwickelt wurde. Es wird häufig in der Forschung und in der Industrie für Deep Learning-Anwendungen wie Bild- und Texterkennung eingesetzt. TensorFlow ermöglicht es, Modelle auf verschiedenen Recheneinheiten wie CPUs, GPUs und TPUs (Tensor Processing Units) zu trainieren. Seit der Veröffentlichung von TensorFlow 2.0 im Oktober 2019 und dem damit verbundenen Umstieg auf die Keras API ist TensorFlow noch benutzerfreundlicher und leichter zu erlernen. Alleine lässt sich TensorFlow heute fast schon nicht mehr verwenden, da Keras gänzlich in die API integriert wurde und als High-Level-API für TensorFlow dient.
  • PyTorch: Wird häufig in der Forschung verwendet und bietet eine breite Palette an Funktionen für maschinelles Lernen.
  • Hugging Face: Eine führende Plattform für natürliche Sprachverarbeitung (NLP) und maschinelles Lernen, die eine breite Palette an Tools und Bibliotheken anbietet. Diese Modelle, basierend auf modernen Architekturen wie BERT, GPT und T5, können einfach angepasst und in verschiedensten Anwendungen integriert werden. Darüber hinaus unterstützt die Plattform Entwickler mit detaillierter Dokumentation, Tutorials und einer aktiven Community.
  • LangChain: Ein leistungsfähiges Framework zur Erstellung von Anwendungen, die große Sprachmodelle (LLMs) verwenden. Es bietet eine flexible Infrastruktur zur Verarbeitung, Analyse und Generierung natürlicher Sprache, die sich nahtlos in bestehende Systeme integrieren lässt. LangChain unterstützt verschiedene LLMs und bietet Möglichkeiten zur Feinabstimmung und Anpassung an spezifische Anwendungsfälle.

Lineare Regression mit Scikit-learn

Schauen wir uns an, wie man in Deep Learning die geschilderten Zusammenhänge softwaretechnisch darstellt. Hierzu verwenden Datenwissenschaftler meist die Programmiersprache Python, die mit ihren starken mathematischen Wurzeln für solche Zwecke entwickelt wurde. Deshalb stehen auch zahlreiche Bibliotheken zur Verfügung, die den Umgang mit ML und KI extrem vereinfachen.

Wir beginnen damit, eine einfache lineare Regression zu implementieren. Die lineare Regression als solche muss man in Python nicht neu erfinden. Wir benötigen dazu lediglich die Bibliothek sklearn (scikit-learn). Als Entwicklungsumgebung verwenden wir wieder Jupyter-Notebook-Instanzen unter Anaconda.

Folgendes Beispiel dient der Umrechnung von Meter in Fuß, ein klassischer linearer Zusammenhang. Statt jetzt aber die Berechnungsformel zu hinterlegen, füttern wir ein dazu geeignetes Modell.

Met = [ [100], [1000], [4000] ]Feet = [ [328], [3280], [13121] ]

Die eigentliche lineare Regression versteckt sich in der sklearn-Bibliothek im Modul „linear_model“ und trägt den Namen „LinearRegression“. Wie in unserem Einführungsworkshop zu Python beschrieben, können wir die Lineare Regression direkt importieren:

from sklearn.linear_model import LinearRegression

Damit lässt sich nun das Modell definieren. Das geht mit:

model = LinearRegression (fit_intercept = False)

Haben wir unser Modell definiert, können wir es mit den oben gesetzten Modelldaten trainieren. Dazu verwenden wir die Methode „fit“, die wir jetzt auf unsere Variable „model“ mit den Trainingsdaten in den beiden Variablen „Met“ und „Feet“ anwenden, indem wir die Jupyter-Zelle ausführen.

Lautet das Ergebnis …LinearRegression(copy_X=True, fit_intercept=False, n_jobs=1, normalize=False) … ist das OK und das Netz wurde trainiert. Damit sind wir nun auch in der Lage, die „Gewichtung“, die das Modell gelernt hat, zu bestimmen. Das gelingt mit …model.coef_

Das Ergebnis (also der Umrechnungsfaktor) lautet also: 3.28023516.

Wir können den gelernten Zusammenhang (3.28023516) allerdings auch auf neue Werte anwenden, also solche, die nicht Teil der Trainingsdaten waren - etwa für 1.000 Meter.

print (2000*3.28023516)

Im Kontext von Machine Learning wäre das Ergebnis für 2.000 Meter quasi als „Vorhersage“ zu interpretieren. Schließlich haben wir im Code ja nirgends den eigentlichen „Umrechnungsfaktor“ hinterlegt - auch wenn es bei linearen Zusammenhängen natürlich einfach ist, Vorhersagen zu treffen.

Das Konzept sollte aber klar geworden sein: Man trainiert quasi sein Netz mit bekannten Daten und ist dadurch in der Lage, ein Modell zu erstellen, das dann auch auf noch unbekannte Daten angewendet werden kann. Um allerdings das eigentliche Durchführen von Vorhersagen (also konkret das Ausführen der Multiplikation der Wunschdaten mit den Gewichtungen) nicht jedes Mal manuell durchführen zu müssen, besteht in sklearn auch die Möglichkeit, die Variable „model“ direkt zu verwenden, um Vorhersagen (predictions) anzufragen. So könnten wir wie folgt in einem Aufruf je eine Vorhersage für 150 Meter und 280 Meter „anfragen“:

model.predict([ [150], [280] ])

Als Ausgabe bekommen wir ein Array mit den gewünschten Daten. Wir haben also den Zusammenhang der Umrechnung von Meter in Fuß aus den Daten selbst erkannt, also genau das, was ein einzelnes Neuron leisten kann.

tags: #text #analyse #mit #neuronal #netze #python