Ich mache meine “schlaue” Kolumne … “mit Blackjack und Nutten!”. Folge 2 (aber Zweier gibt es nicht). Projekt Nebender

Dieses Projekt ist sowohl eine Weiterentwicklung als auch ein Ableger des Pinder-Projekts.

In den Kommentaren zum ersten Artikel (und ich habe selbst auch darüber nachgedacht) wurde mir eine Möglichkeit angeboten, Bedeutungen auf GPT zu erkennen.

Ich habe ein wenig über die Verwendung von GPT gelesen, es ist natürlich alles cool, das ist nur ein Sportwagen, eine Art Ferrari in der Welt von NLP. Im Allgemeinen ist Ferrari cool, aber ich liebe Fahrräder, also wurde beschlossen, etwas Einfaches, aber Eigenes zu kürzen.

So entstand das Projekt NeBender (Neural Bender).

NLP lernen und mit Beispielen experimentieren

Um wenigstens ein bisschen zu verstehen, wie das alles funktioniert, bin ich dem klassischen Ansatz gefolgt – ein kluges Buch zu lesen. Als kluges Buch bin ich auf Natural Language Processing in Action (Hobson, Hannes, Cole) gestoßen.

Es dauerte mehr als ein Jahr, um allmählich (mit monatelangem Hin- und Herwerfen) durch Theorie und Beispiele zum 10. Kapitel vorzudringen, das für meine Aufgabe notwendig ist.

Kapitel 10 zeigt, wie man ein Sequence-to-Sequence-Chatbot-Modell basierend auf der Encoder-Decoder-Architektur erstellt. Es erwähnt auch die Verwendung des Aufmerksamkeitsmechanismus, um ein Transformatormodell zu erstellen, aber es werden keine Beispiele gegeben (zum Zeitpunkt des Schreibens dieses Artikels hatte Keras keine Implementierung dieses Mechanismus).

Gut, es passt im Prinzip zu meiner Aufgabe – es gibt Fragen und Bemerkungen an Bender, und es gibt seine Antworten. Zunächst wird es gehen, und dann wird es möglich sein, Verbesserungen auszuprobieren.

Ich werde hier einen kleinen Exkurs machen und die Autoren des Buches und der Python-Umgebung für ML ein wenig treten.

Bis zum 10. Kapitel funktionierten bei mir die meisten Beispiele fast ohne Probleme, manchmal musste ich natürlich etwas ablegen, neu installieren. Aber gerade im notwendigsten Kapitel wurden Probleme damit entdeckt. Beispiele, wie sie entweder schief funktionieren oder gar nicht funktionieren (auf GitHub senden Bücher in der Issues-Sektion Grüße an Autoren – https://github.com/totalgood/nlpia/issues).

Okay, mit Matten, auf alten Commits gehen, hat etwas funktioniert, und das Wichtigste in dem Buch war für mich, die Prinzipien der Arbeit zu verstehen.

Auch bei Beispielen aus dem 10. Kapitel trat das erwartete Problem mit meiner Hardware auf. Ich habe ein MacBook Pro 15 von 2013 ohne separate Grafikkarte als Arbeitsmaschine, und das Trainieren der Modelle aus den Beispielen für die Tokenisierung pro Zeichen hat mich sehr viel Zeit gekostet (etwa 16 Stunden). Infolgedessen wechselte ich zur Tokenisierung durch Wörter (in meinem aktuellen NeBender-Datensatz dauert beispielsweise eine Epoche der Zeichen-für-Zeichen-Tokenisierung etwas mehr als 4 Minuten und laut Wörtern etwa anderthalb Minuten).

Als Beispiel habe ich dieses Notizbuch genommen – https://colab.research.google.com/drive/1FKhOYhOz8d6BKLVVwL1YMlmoFQ2ML1DS

Datensatz

Kommen wir zum zeitaufwändigsten und langwierigsten Teil der Entwicklung.

Am Anfang hatte ich generell Angst, dass ich die Texte aus den Untertiteln nehmen oder schlimmer noch alles anhören müsste. Aber wie sich herausstellte, gab es gute Leute, die Skripttranskripte im Wiki veröffentlichten – https://futurama.fandom.com/wiki/Category:Episodes

Natürlich verlasse ich mich in diesem Fall darauf, dass diese Texte ungeprüft stimmen (meiner Meinung nach scheint aus dem Gedächtnis alles nicht schlecht zu sein).

Das hat die Arbeit stark vereinfacht, aber es bleibt noch viel davon übrig.

Erstens habe ich leider vorerst die Sätze verworfen (sie sind im Datensatz auskommentiert), die Bender zu manchen Ereignissen oder „einfach so“ sagt, und nur die übrig gelassen, bei denen Bender auf die Sätze anderer Charaktere reagiert. Vielleicht sammle ich diese Sätze in Zukunft separat, damit Bender sie einfach zufällig sagen kann (na ja, oder ich werde plötzlich die Kamera vermasseln, um ihm etwas zu zeigen) und einen Dialog initiieren.

Außerdem antwortet Bender nicht in allen Fällen direkt auf den vorherigen Satz, es kann eine Antwort auf Sätze ein paar Zeilen darüber und auf die „Summe“ mehrerer Zeilen sein, was eine Automatisierung dieses Skripts ausschließt und manuelle Arbeit erfordert. In solchen Fällen habe ich neben dem Frage-Antwort-Paar auch das kommentierte Original zum Üben dagelassen, damit es jeder nach Belieben nachbearbeiten kann.

Im Moment habe ich die ersten 4 “klassischen” Staffeln zusammengestellt, den Rest hoffe ich später langsam fertig zu stellen.

Verbinden Sie sich mit Pinder, Spracherkennung und -synthese

Aufgrund der Schwere der Komponenten des resultierenden Systems (Erkennung auf einem offenen Wörterbuch und einem Neuron für NLP) war klar, dass Pinder auf dem Raspberry Pi Zero der ersten Version nicht alles ziehen würde, aber ich habe es trotzdem versucht um ein begrenztes Sprachmodell für PocketSphinx basierend auf Fragen aus dem Datensatz zu erstellen (es gibt kommentierte Zeilen im Notizbuch, falls jemand es versuchen möchte) – es ergab 4699.000 Wörter (ich habe es versucht, als ich an der 3. Staffel arbeitete, jetzt da sind noch mehr). Das Experiment schlug wie erwartet fehl, es funktionierte alles schrecklich langsam.

Als weitere Option habe ich versucht, einen Kaldi-Server auf meinem Rechner bereitzustellen und ihn über das Netzwerk von Pinder zu erkennen, aber aufgrund der Qualität der Aufzeichnung stellte sich die Erkennung ebenfalls als nicht sehr gut heraus.

Daher bin ich für dieses Projekt letztlich auf das Schema gegangen, bei dem die gesamte Verarbeitung auf dem Computer (mein neuronales NLP-Netzwerk) und in den Clouds (MS Azure STT und TTS) stattfindet. Es ist möglich, dass das Aufrufen von Cloud-Funktionen auch von Pinder aus aufgerufen wird und nur NLP-Inferenz auf einem Laptop aufruft, aber leider funktioniert das Azure STT SDK derzeit nicht auf der ARM-Architektur, und um eines TTS willen, habe ich darüber nachgedacht unvernünftig, einen Teil der Logik in der Spalte zu belassen.

Im Allgemeinen ist ein solches kollektives Arbeitsschema: Die Erkennung von einem Mikrofon wird auf dem Computer gestartet -> der erkannte Text wird in das Seq2Seq-NLP-Modell übertragen -> die Antwort wird in die Synthese übertragen -> die synthetisierte Datei wird über NFS abgelegt on Pinder -> das Skript auf Pinder spielt die Datei ab und animiert die „Zähne“ “. In Ermangelung von Pinder können Sie die Datei einfach von Ihrem Computer aus abspielen.

Ergebnis der Arbeit:

Quellen – https://github.com/sindar/NeBender

Zukunft

Beispiele für Dinge, die zu tun sind:

  1. Ergänzen Sie den Datensatz mit den restlichen Staffeln (derzeit sind 4 Staffeln nur 72 Folgen von 140).

  2. Probieren Sie fortgeschrittenere Modelle aus (BERT?).

  3. Kaufen Sie eine normale Desktop-Grafikkarte (oder vielleicht einen neuen Laptop mit einer leistungsstarken GPU), um das Ausprobieren fortschrittlicherer Modelle angenehmer zu gestalten.

  4. Versuchen Sie etwas wie Nvidia Jetson, vielleicht zieht es sich ohne die Verwendung eines Desktops / Servers.

  5. Machen Sie optional ein „Gesicht“ für die Software, damit Sie sie ohne Pinder auf Ihrem Computer ausführen können, und es gäbe dort einige Animationen.

  6. Ich hätte gerne ein Modell auf Russisch, aber dieser Punkt ist leider am wenigsten realistisch – es gibt keine Grundlage für den Datensatz, und die Verarbeitung des Russischen ist viel schwieriger (aber hier müssen Sie möglicherweise die verfügbaren Bibliotheken ausprobieren nicht alles ist so gruselig).

Vielen Dank, dass Sie den Artikel gelesen haben, und Bender sagt wie immer “Beiß meinen glänzenden Metallarsch”! 🙂

Similar Posts

Leave a Reply

Your email address will not be published.