Benutzer-Werkzeuge

Webseiten-Werkzeuge


ws1819:phasmid

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
ws1819:phasmid [2019/03/05 16:41]
erchinger
ws1819:phasmid [2019/04/01 19:58] (aktuell)
stefanborn
Zeile 1: Zeile 1:
 +Wir haben nichts auszusetzen. :-)
 +
 ====== Phasmid - Der Prestige-Textgenerierungs Bot für Akademiker und Singles mit Niveau ====== ====== Phasmid - Der Prestige-Textgenerierungs Bot für Akademiker und Singles mit Niveau ======
 ==== Arda, Paul und Lucas ==== ==== Arda, Paul und Lucas ====
 {{ :​ws1819:​bacillus_rossi.jpg?​300 |}} {{ :​ws1819:​bacillus_rossi.jpg?​300 |}}
 +//"​America, ​ A plague in England'​s shame. Poor greatness, save our nightingale! Romeo, forgive me into myself, ​   So thou no more but furnight, English peace."//​ -Phasmid
 ===== Idee: ===== ===== Idee: =====
 Die Idee ist das Erstellen einer Selbstlernenden Künstlichen Intelligenz,​ welche gegebenes Textverhalten imitieren und selber Texte/​Nachrichten verfassen kann. Die Idee ist das Erstellen einer Selbstlernenden Künstlichen Intelligenz,​ welche gegebenes Textverhalten imitieren und selber Texte/​Nachrichten verfassen kann.
Zeile 35: Zeile 38:
 Das Prinzip funktioniert folgendermaßen:​ Das neuronale Netz erhält einen Input. Dieses sind meistens vektorisierte Daten, das heißt die Ursprungsinformationen werden in Vektoren oder Matrizen bestehend aus Zahlen verpackt, damit diese verwendbar für das Programm werden. Dieser Input kann aus beliebig vielen "​Features"​ bestehen, welche dann das Format des Eingangs bestimmen, jedes Feature wird sozusagen ein Neuron. Diese werden mit der nächsten Schicht aus Neuronen verknüpft, sodass jeder Eingang mit jedem Neuron verbunden ist. Die Anzahl der Neuronen ist hier arbiträr und kann größer oder kleiner gemacht werden, abhängig beispielsweise davon, wie komplex das Problem, welches man untersuchen will, ist. Nun rät zu Beginn das Programm eine gewisse Abhängigkeit,​ zwischen der Input und der nächsten Schicht und übergibt davon abhängig einen Wert an jedes einzelne Neuron. Heruntergebrochen könnte man sagen, verschiedene Neuronen werden aufgrund dieser (zu Beginn geratenen) Abhängigkeiten aktiviert oder deaktiviert. Nun könnte man noch noch beliebig viele dieser Schichten übereinander stapeln (Wieder um die Komplexität der Erfassung des Programms zu erhöhen), der Einfachheit halber bleiben wir aber für die Erklärung bei nur einer sog. Hidden Layer. Nun werden erneut Verknüpfungen von der Hidden Layer zu unserem Output erzeugt, welcher dann wieder aufgrund (zu Anfangs geratener) Gewichtungen in gewisser Weise angesteuert wird und anhand dessen eine Vorhersage trifft. Und erst jetzt beginnt das eigentliche Lernen: Die Vorhersage wird mit dem erwarteten Output verglichen. So könnten wir zum Beispiel ein Programm zur Erkennung von Handschrift geschrieben haben und ein geschriebenes "​a"​ übergeben haben, jedoch die Vorhersage: "​z"​ erhalten (alles natürlich dann im vektorisierten Format). Offensichtlich ist unser Programm noch nicht perfekt, es hat aber ja auch noch nicht gelernt. Der Weg wie wir nun die Vorhersagen für die Zukunft verbessern können ist, dass wir basierend auf dem Unterschied zwischen Vorhersage und erwartetem Output alle Gewichtungen innerhalb des Netzwerkes minimal verändern und anschließend das Programm erneut, aber mit diesen Gewichtungen und anderen Trainingsdaten,​ laufen lassen. Nach vielen Iterationen verbessert sich das Modell und die Gewichtungen der einzelnen Neuronen stellen bestenfalls eine erkannte Struktur dar, welche sichere Vorhersagen treffen kann. Wichtig ist: Dies war nur eine kurze und vage Zusammenfassung. In Wirklichkeit haben die meisten Netze mehrere Millionen solcher Neuronen oder Knoten und benötigen sehr viele Iterationen zum Lernen, weswegen das Ausführen der Programme teils Stunden in Anspruch nehmen kann.  Das Prinzip funktioniert folgendermaßen:​ Das neuronale Netz erhält einen Input. Dieses sind meistens vektorisierte Daten, das heißt die Ursprungsinformationen werden in Vektoren oder Matrizen bestehend aus Zahlen verpackt, damit diese verwendbar für das Programm werden. Dieser Input kann aus beliebig vielen "​Features"​ bestehen, welche dann das Format des Eingangs bestimmen, jedes Feature wird sozusagen ein Neuron. Diese werden mit der nächsten Schicht aus Neuronen verknüpft, sodass jeder Eingang mit jedem Neuron verbunden ist. Die Anzahl der Neuronen ist hier arbiträr und kann größer oder kleiner gemacht werden, abhängig beispielsweise davon, wie komplex das Problem, welches man untersuchen will, ist. Nun rät zu Beginn das Programm eine gewisse Abhängigkeit,​ zwischen der Input und der nächsten Schicht und übergibt davon abhängig einen Wert an jedes einzelne Neuron. Heruntergebrochen könnte man sagen, verschiedene Neuronen werden aufgrund dieser (zu Beginn geratenen) Abhängigkeiten aktiviert oder deaktiviert. Nun könnte man noch noch beliebig viele dieser Schichten übereinander stapeln (Wieder um die Komplexität der Erfassung des Programms zu erhöhen), der Einfachheit halber bleiben wir aber für die Erklärung bei nur einer sog. Hidden Layer. Nun werden erneut Verknüpfungen von der Hidden Layer zu unserem Output erzeugt, welcher dann wieder aufgrund (zu Anfangs geratener) Gewichtungen in gewisser Weise angesteuert wird und anhand dessen eine Vorhersage trifft. Und erst jetzt beginnt das eigentliche Lernen: Die Vorhersage wird mit dem erwarteten Output verglichen. So könnten wir zum Beispiel ein Programm zur Erkennung von Handschrift geschrieben haben und ein geschriebenes "​a"​ übergeben haben, jedoch die Vorhersage: "​z"​ erhalten (alles natürlich dann im vektorisierten Format). Offensichtlich ist unser Programm noch nicht perfekt, es hat aber ja auch noch nicht gelernt. Der Weg wie wir nun die Vorhersagen für die Zukunft verbessern können ist, dass wir basierend auf dem Unterschied zwischen Vorhersage und erwartetem Output alle Gewichtungen innerhalb des Netzwerkes minimal verändern und anschließend das Programm erneut, aber mit diesen Gewichtungen und anderen Trainingsdaten,​ laufen lassen. Nach vielen Iterationen verbessert sich das Modell und die Gewichtungen der einzelnen Neuronen stellen bestenfalls eine erkannte Struktur dar, welche sichere Vorhersagen treffen kann. Wichtig ist: Dies war nur eine kurze und vage Zusammenfassung. In Wirklichkeit haben die meisten Netze mehrere Millionen solcher Neuronen oder Knoten und benötigen sehr viele Iterationen zum Lernen, weswegen das Ausführen der Programme teils Stunden in Anspruch nehmen kann. 
  
-Wer noch genauer verstehen möchte, wie diese Netze funktionieren und wie beispielsweise die Gewichtungen berechnet werden oder welche Probleme beim Lernen auftreten können, sei auf den Eintrag (...) verwiesen+Wer noch genauer verstehen möchte, wie diese Netze funktionieren und wie beispielsweise die Gewichtungen berechnet werden oder welche Probleme beim Lernen auftreten können, sei beispielsweise die vier Videos umfassende Youtube Serie vom Youtube-Channel 3Blue1Brown empfohlen, welche knapp aber ohne ungenau zu sein das Thema umreißtZu finden ist diese unter: [[https://​www.youtube.com/​playlist?​list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi]]
  
 ===== Das fertige Projekt ===== ===== Das fertige Projekt =====
Zeile 42: Zeile 45:
 Für unser Programm haben wir uns für ein GRU (Gated Recurrent Unit) Model entschieden. ​ Dieses ist besonders nützlich für Daten, die mit Text zusammenhängen,​ da das GRU ein gewisses Gedächtnis besitzt und somit Umgebungen von beispielsweise Wörtern oder Buchstaben erkennen kann. Dies funktioniert indem der Output eines Zeitschrittes sowohl ausgegeben wird, als auch an den nächsten Zeitschritt weitergegeben werden kann. In unserem Model versuchen wir anhand von Buchstaben und deren Umgebung nachfolgende Buchstaben vorherzusagen und somit die Semantik und teilweise die Bedeutung des Ursprungstextes zu erfassen und diese in einem frisch generierten Text zu imitieren. Für den Input benötigen wir zuerst einen Ursprungstext,​ auf dessen Basis wir unser Model trainieren können. Wichtig für jegliche Form von maschinellem Lernen sind große Datenmengen,​ weswegen die einzige Bedingung an den Text eine nicht allzu geringe Zeichenmenge ist. Für das Testen des Modells haben wir beispielsweise die gesammelten Werke von Shakespeare oder einige Speeches von Donald Trump verwendet. ​ Für unser Programm haben wir uns für ein GRU (Gated Recurrent Unit) Model entschieden. ​ Dieses ist besonders nützlich für Daten, die mit Text zusammenhängen,​ da das GRU ein gewisses Gedächtnis besitzt und somit Umgebungen von beispielsweise Wörtern oder Buchstaben erkennen kann. Dies funktioniert indem der Output eines Zeitschrittes sowohl ausgegeben wird, als auch an den nächsten Zeitschritt weitergegeben werden kann. In unserem Model versuchen wir anhand von Buchstaben und deren Umgebung nachfolgende Buchstaben vorherzusagen und somit die Semantik und teilweise die Bedeutung des Ursprungstextes zu erfassen und diese in einem frisch generierten Text zu imitieren. Für den Input benötigen wir zuerst einen Ursprungstext,​ auf dessen Basis wir unser Model trainieren können. Wichtig für jegliche Form von maschinellem Lernen sind große Datenmengen,​ weswegen die einzige Bedingung an den Text eine nicht allzu geringe Zeichenmenge ist. Für das Testen des Modells haben wir beispielsweise die gesammelten Werke von Shakespeare oder einige Speeches von Donald Trump verwendet. ​
  
-{{:​ws1819:​text_generation_sampling.png?​200|}} Um jedoch die Daten verarbeiten zu können teilen wir zuerst den Text in Sequenzen ein (z.B. 100 Zeichen lang). Die Trainingsdaten werden dann diese 100 Zeichen sein und der erwartete Output sind die gleichen Zeichen jedoch um ein Zeichen verschoben. Somit hat jedes Zeichen das Ziel, das darauf folgende Zeichen vorherzusagen. Um die Zeichen in unser Modell speisen zu können benötigen wir zuerst eine eindeutige vektorisierte Darstellung für jedes Zeichen, weswegen wir jedem individuellen Zeichen eine Zahl zwischen 0 und "​Anzahl der unterschiedlichen Zeichen - 1" zuweisen und anschließend unsere einzelnen Sequenzen in ein Array aus Zahlen umwandeln. ​+{{:​ws1819:​text_generation_sampling.png?​300|}} Um jedoch die Daten verarbeiten zu können teilen wir zuerst den Text in Sequenzen ein (z.B. 100 Zeichen lang). Die Trainingsdaten werden dann diese 100 Zeichen sein und der erwartete Output sind die gleichen Zeichen jedoch um ein Zeichen verschoben. Somit hat jedes Zeichen das Ziel, das darauf folgende Zeichen vorherzusagen. Um die Zeichen in unser Modell speisen zu können benötigen wir zuerst eine eindeutige vektorisierte Darstellung für jedes Zeichen, weswegen wir jedem individuellen Zeichen eine Zahl zwischen 0 und "​Anzahl der unterschiedlichen Zeichen - 1" zuweisen und anschließend unsere einzelnen Sequenzen in ein Array aus Zahlen umwandeln. ​
 Der erste Teil unseres Modells ist dann ein sog. Embedding. Dieses soll eine verbesserte vektorisierte Darstellung unser Eingabe erlernen und weitergeben,​ welche nicht nur die zugewiesene Zahl zu jedem Zeichen versteht sondern anhand der Umgebung der Zeichen eine verbesserte Darstellung der Sequenzen innerhalb unseres Modells erstellt. Die Ausgabe unseres Embeddings wird nun in das oben angesprochene GRU gegeben. Im obigen Bild zur GRU ist also, die Eingabe \(x_t\) (t = 0, 1, ..., Länge der Sequenz) das t-te Zeichen der Sequenz und versucht das (t+1)-te Glied vorherzusagen (als Output \(o_x\)) und dies für alle Glieder der Sequenz. Ermittelt wird der Output anhand des Inputs von außen und dem Output des vorherigen GRUs, mithilfe einer Vergessens- und einer Updatefunktion. Die Vergessensfunktion sorgt dafür, dass alte Information von früheren Zeitschritten nicht zu stark gewichtet wird, wohingegen die Updatefunktion für das implementieren des neuen Inputs sorgt. Diese sind mathematisch wie folgt beschrieben:​ \[ Der erste Teil unseres Modells ist dann ein sog. Embedding. Dieses soll eine verbesserte vektorisierte Darstellung unser Eingabe erlernen und weitergeben,​ welche nicht nur die zugewiesene Zahl zu jedem Zeichen versteht sondern anhand der Umgebung der Zeichen eine verbesserte Darstellung der Sequenzen innerhalb unseres Modells erstellt. Die Ausgabe unseres Embeddings wird nun in das oben angesprochene GRU gegeben. Im obigen Bild zur GRU ist also, die Eingabe \(x_t\) (t = 0, 1, ..., Länge der Sequenz) das t-te Zeichen der Sequenz und versucht das (t+1)-te Glied vorherzusagen (als Output \(o_x\)) und dies für alle Glieder der Sequenz. Ermittelt wird der Output anhand des Inputs von außen und dem Output des vorherigen GRUs, mithilfe einer Vergessens- und einer Updatefunktion. Die Vergessensfunktion sorgt dafür, dass alte Information von früheren Zeitschritten nicht zu stark gewichtet wird, wohingegen die Updatefunktion für das implementieren des neuen Inputs sorgt. Diese sind mathematisch wie folgt beschrieben:​ \[
 \text{Update:​ } z_t = \sigma (W^{(z)}x_t+U^{(z)}h_{t-1}),​ \quad \text{Update:​ } z_t = \sigma (W^{(z)}x_t+U^{(z)}h_{t-1}),​ \quad
Zeile 50: Zeile 53:
 Die \(\sigma\)-Funktion,​ sorgt hierbei dafür, dass das Ergebnis in einem einheitlichen Bereich liegt (zwischen 0 und 1).  Die \(\sigma\)-Funktion,​ sorgt hierbei dafür, dass das Ergebnis in einem einheitlichen Bereich liegt (zwischen 0 und 1). 
 Hieraus wird dann die Ausgabe erzeugt, welche außerdem an die nächste GRU Zelle weitergegeben wird. Aus allen GRU Ausgaben erhalten wir dann mithilfe einer letzten Layer unsere endgültige Vorhersage als Vektor. ​ Hieraus wird dann die Ausgabe erzeugt, welche außerdem an die nächste GRU Zelle weitergegeben wird. Aus allen GRU Ausgaben erhalten wir dann mithilfe einer letzten Layer unsere endgültige Vorhersage als Vektor. ​
-Nachdem man dieses Modell dann lange genug trainiert hat und somit die Gewichtungen optimiert, können wir hiermit die Generierung eines Textes vornehmen. Hierbei beginnen wir mit einem sog. Seed, also einem Start-Text, auf welchem wir dann den Text aufbauen. Dieser wird dem Modell übergeben, welches hierauf basierend eine Ausgabe für den nächsten Buchstaben vorhersagt. Diese Vorhersage wird dann für den nächsten Buchstaben wieder dem Modell übergeben und dies wiederholen wir so oft, wie unsere Ausgabe lang sein soll. +Nachdem man dieses Modell dann lange genug trainiert hat und somit die Gewichtungen optimiert, können wir hiermit die Generierung eines Textes vornehmen. Hierbei beginnen wir mit einem sog. Seed, also einem Start-Text, auf welchem wir dann den Text aufbauen. Dieser wird dem Modell übergeben, welches hierauf basierend eine Ausgabe für den nächsten Buchstaben vorhersagt. Diese Vorhersage wird dann für den nächsten Buchstaben wieder dem Modell übergeben und dies wiederholen wir so oft, wie unsere Ausgabe lang sein soll. Wir erhalten so unsere Ausgabe und haben hiermit eine Textgenerierung vorgenommen. Spannenderweise schafft das Programm, obwohl es keine anderen Daten über die Texte oder Wissen über die Sprache erhält, Texte zu erzeugen, die echter Sprache erstaunlich ähneln und den Stil des Ursprungstextes erstaunlich gut treffen. Die generierten Texte treffen auch die Grammatik erstaunlich gut und sind semantisch in der nahen Wortumgebung sinnig. Einzig größere Zusammenhänge innerhalb des Textes kann das Programm kaum bis gar nicht erfassen, so ergeben die Sätze meist kontextuell keinen Sinn und wirken eher wie gute Imitation als Reproduktion.
  
-===== Fazit ===== +==== Beispieltexte ​==== 
- +  * "​Mathesis and examining works like a specialfulness;​ the joints may attain any active matter of print days of the occupying voice."​ (Nach Lernen an einer Sammlung an Texten, unter Anderem den gesammelten Werken Sir Arthur Conan Doyles) 
-===== Prozessschnipsel =====     +  * "The Cat sits on the mat whistling of clear to those metwith."​ 
 +  * "The Cat sits on the mat himself, killed the buzzin of his husband and apart from her his life. With slavery himself, or Mademoiselle George Washington, he followed a portlamaticwas simple."​ (Beide mit selbigem Text gelernt.) 
 +  * "​America, ​ A plague in England'​s shame. Poor greatness, save our nightingale! Romeo, forgive me into myself, ​   So thou no more but furnight, English peace."​ (Gelernt anhand der gesammelten Werke von William Shakespeare.) 
 +  * "​America [...] companies to make America Wealthy Again. We will Make America Great Again. [...] I am going to enforce allart heast that Hillary Clinton wants to carpet women and economic agenda can change."​ (Gelernt anhand gesammelter Speeches von Donald Trump im Laufe seiner Wahlkampagne.)
  
 +==== Der Code ====
 +Wir haben den Code in einem interaktiven Notebook über Google Colabatory erstellt. Unter folgendem Link findet ihr das ausführbare Programm, mit Erklärungen. Dafür einfach die Anweisungen zum Beginn des Notebooks befolgen.
 +[[https://​colab.research.google.com/​drive/​1DrhbVbUbDL8KCqUw-Jtut-PeBDiUIhCt]] ​
 +Alternativ ist hier auch noch einmal eine downloadbare offline Version des Notebooks verfügbar, zusammen mit Modellparametern,​ welche sofort die Textgenerierung ohne neues trainieren ermöglichen: ​
 +{{:​ws1819:​phasmid_textgenerierung.zip|}}.
  
 +===== Fazit =====
 +Zum Abschluss unseres Projektes sind wir sehr zufrieden mit dem Endergebnis. Besonders interessant war es sich in dieses doch sehr komplexe Thema einzuarbeiten und ein Grundverständnis für Maschinelles Lernen zu erhalten, welches vermutlich in der Zukunft noch wichtiger wird. Genau diese Komplexität war aber auch eines der größten Probleme mit unserem Projekt. Es hat sehr lange gedauert, bis wir  tatsächlich mit unserem Projekt wirklich beginnen konnten. So haben wir zwar auch zu Beginn versucht einiges für unser Projekt zu erarbeiten, jedoch konnten wir davon im Endeffekt praktisch nichts für unser finales Produkt benutzen. Genau diese Realisation hat gegen Ende auch zu gewisser Frustration geführt. Ich denke dies liegt in der Natur von Projekten die mit Maschinellem Lernen zu tun haben und ist eventuell für einen solchen Rahmen eher ungeeignet, unter Anderem auch, da wir uns somit weniger mit "​Programmieren"​ beschäftigen konnten. Trotzdem ist es wirklich sehr beeindruckend,​ welche Ergebnisse man mit verhältnismäßig geringem Aufwand erhalten kann. Sehr hilfreich war außerdem die Entdeckung des Google Services "​Google Colaboratory",​ einem sog. Notebook welches die Möglichkeit gibt online Code zu schreiben und auszuführen. Was jedoch Google Colab ausgezeichnet ist die GPU-Acceleration. Wie bereits angedeutet benötigt Machine Learning eine ungeheure Menge an Rechenaufwand,​ sodass Programme oft mehrere Stunden laufen müssen bevor man, selbst bei überschaubaren Projekten wie unserem, Ergebnisse auswerten kann (Was sehr frustrierend ist, wenn es dann nicht so funktioniert,​ wie man es sich erhofft hätte...). Jedoch kann diese Rechenzeit drastisch verkürzt werden, wenn man eine dedizierte Grafikkarte (GPU) verwendet. Google Colab stellt nun die Möglichkeit zur Verfügung leistungsstarke Recheneinheiten und eben Grafikkarten von Google zu verwenden und somit die Programme innerhalb von Minuten auszuführen. Eine super Entdeckung, welche vor Allem gegen Ende hin enorm geholfen hat.  ​
 +Tatsächlich ist auch nur noch wenig an unserem Projekt in unseren Augen zu verbessern und wir haben das meiste erreicht, was wir uns zu Beginn vorgestellt hatten. Eine Weiterentwicklung könnte sein den Bot in Echtzeit Daten analysieren zu lassen und somit tatsächliches Sprachverhalten in bspw. einem Chat mimen zu lassen. Auch ein besseres Verständnis für Kontext und Bedeutung von Wörtern wäre spannend und man könnte eventuell anstatt auf Zeichenbasis eventuell auf Silben- oder Wortbasis arbeiten um dies zu erreichen. Trotzdem sind wir sehr zufrieden mit unserem Endprodukt und während ich hier schreibe, schreibt Phasmid bereits ein neues unentdecktes Theaterstück von Shakespeare... ​
  
 ===== Literatur/​Links:​ ===== ===== Literatur/​Links:​ =====
-komplette Twitch-Chatlogs unter: https://overrustlelogs.net +  * Stanford Internet Kurs zum Thema Machine Learning[[https://see.stanford.edu/​course/​cs229]] 
- +  * Playlist ​zu Neuronalen Netzwerken von 3Blue1Brown ​auf YouTube: [[https://​www.youtube.com/​playlist?​list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi]] 
-===== Protokoll ===== +  * Beispiel ​der Anwendung ​eines Neuronalen Netzwerkes ​auf Wortbasis zur Erzeugung von Werbetexten:​ [[https://​medium.com/​phrasee/​neural-text-generation-generating-text-using-conditional-language-models-a37b69c7cd4b]] 
-==== 29.11.2018 ==== +  * Kritischer Blick auf Rekurrente Neuronale Netzwerke: [[https://​towardsdatascience.com/the-fall-of-rnn-lstm-2d1594c74ce0]]
-Wir haben zu Allererst ein Programm verfasst, mit welchem wir, via Web-Scraping,​ Chatlogs verschiedenster Streamer herunterladen können und somit benutzen. Schwierigkeiten traten primär ​auf beim formatieren des Programms und Kennenlernen des Pakets "​BeautifulSoup4"​Zum Ende hin hat dies aber funktioniert und der nächste Schritt wird sein, diese Daten ordentlich zu sortieren und speichern zu können. +
- +
-==== 06.12.2018 ===+
-Zum Beginn dieser Woche haben wir uns zuerst kurz theoretisch mit dem Thema der Text Analyse befasst, mit welchem sich Lucas auf Basis des Buches "​Applied Text Analysis with Python"​ weiter befassen wird. Außerdem haben wir einen Termin für ein gemeinsames Lernen über Machine Learning vereinbart. Ansonsten haben Arda und Paul an einer Datenstruktur für die vorher gescrapten Daten gearbeitet und einem Weg diese abzuspeichern und effektiv benutzbar zu machen. Dies ist uns zum Ende hin mit dem Paket "​pickles"​ gelungen, welches eine Liste mit allen Chatlogs ​eines Streamers über den gesamten ​auf der Webseite hochgeladenen Zeitraum erstelltZiel für die nächste Woche ist nun, mit der Textverarbeitung zu beginnen und auch die Textanalyse zu planen und gestalten. +
- +
-==== 13.12.2018 ==== +
-Diese Woche haben wir uns das erste mal mit Stefan getroffen um die Grundlagen des Machine Learning zu lernen um Sie später in unserem Projekt einzubauen. Zudem haben wir zuhause und zum beginn des Donnerstags die komplette Textverarbeitung fertiggestellt und in Log Dateien gepickeled. Während Lucas sich weiter mit "​Applied Text Analysis with Python"​ beschäftigt hat und sich über das Konzept des "bag-of-word" aufgeklärt hat. Haben Paul und Arda den Text bereinigt von allen Sonderzeichen etc. und diese gespeichert. Einen absoluten Wortzähler eingebaut (wie häufig ist jedes wort). Danach hat Paul sich mit n grammen auseinandergesetzt. Wir haben zum schluss trigramme von seagulls chat erstellt und deren häufigkeit ausgegeben. Wobei das häufigste trigramm "seagH seagH seagH" 105409 mal vorkam. Jedoch hat das unpickle unserer Daten relativ lange gebraucht. +
- +
-==== 20.12.2018 ==== +
-Nach der letzten Woche hat Paul direkt begonnen die Datenstruktur zu verbessern indem er nur noch die Nachrichten selber ohne die Timestamps und Nutzernamen speichert. Dies hat die Geschwindigkeit des Erstellens von Trigrammen und anderen Anwendungen drastisch verbessert. Danach hat Paul zudem ein Text-Generator mittels des Trigram Modells erstellt welcher zwar größtenteils Semantiklose jedoch bereits ganze Sätze ausgibt. Am Dienstag trafen wir uns zum zweiten mal für das Maschinelle Lernen und lernten diesmal Regression, Regularisierung und Klassifikation. Zudem führte uns Stefan verschiedene Modelle des Machine Lerning vor, wie das "​Dropout Regularisierung Modell"​ und "​convolutional layers"​ welche jedoch zu kompliziert sind um diese hier zu erklären. Wir haben noch die Chatlogs von Nightblue3 heruntergeladen und uns den Rest des Donnerstags mit word2vec beschäftigt. Dafür mussten wir zunächst ein Programm schreiben welches unsere existierenden Chatlogs in ein anderes Dateiformat wandelt, wie auch später erklärt. Word2Vec ist teil von gensim (ein Machine Learning Algorithmus) und wurde von Google entwickelt. Das Programm schaut sich an welche Wörter im gleichen Kontext benutzt werden. Dafür benötigt man eine Liste von Sätzen wo die Sätze als Liste von Wörtern dargestellt werden (daher auch das umwandeln unserer bereits existierenden Liste von Sätzen, wo ein Satz ein String ist, in die richtige Struktur.). Zurückgegeben wird ein Modell welches die Beziehungen der Wörter untereinander darstellen kann und auch die Darstellung mittels Vektoren zwischen Wörtern zurückgeben kann. Dieses konnten wir vollständig ausführen und planen nun nach den Ferien uns vollständig mit Machine Learning zu beschäftigen. +
- +
-==== 10.01.2019 ==== +
-In dieser Woche haben wir mit Stefan bei dem Machine Learning Treffen das erste mal ein Neuronales Netz gebaut und gelernt wie wir es trainieren. Deshalb haben wir heute angefangen unser Neuronales Netz zu planen. Insgesamt soll unser Neuronales Netz eine bestimmte Menge an buchstaben (zunächst 50), die den Anfang einer Nachricht bilden, übergeben bekommen und den darauf folgenden Buchstaben generieren. Dafür teilen wir zunächst unsere Nachrichten in einen Trainings-(X) sowie einen Testteil(Y) ​auf. Hierbei wird die Menge der X-Daten für das Trainieren des Netzwerkes diesem übergeben und die Y-Daten werden benutzt um die Vorhersagen des Modells zu testen und zu validieren. Die gesamte Umwandlung der Nachrichten in den X und Y Teil haben wir heute geschafft. Zudem hat Lucas angefangen unsere Dateien zu sortieren und hat dafür eine neue Unterstruktur innerhalb unseres Git-Verzeichnis erschaffen.+
  
-==== 17.01.2019 ​==== +===== Protokolle ===== 
-Seit des letzten Eintrags hat Paul bei sich zuhause bereits unser erstes Neuronales Netz erseltt und es an einem viertel der verfügbaren Trainingsdaten trainiert. Jedoch spuckt dieses nach Programmieren eines Programms welches das Netzt anwendet nur Ausgaben wie "h o o o o o o o o o o o" aus. Deshalb hat Paul den Rest der Zeit heute genutzt um das Neuronale Netz zu verbessern. Lucas hat heute weiter versucht den mastercleaned branch (der aufgeräumte Teil unseres Git-Verzeichnisses) aufzubauen, wobei mehrere Probleme aufgetaucht sind, wie beispielsweise Programme aus anderen Verzeichnisses zu importieren und zu verwenden, wobei alle Lösungen hierfür entweder aufwendig oder unsauber erscheinen. Zum Beispiel könnte man mit Verknüpfungen arbeiten oder oder gewisse Dateien vervielfältigen. Sicher ist jedoch, dass man für viele dieser Lösungen die Programme umschreiben müsste, was einige Geduld braucht.+Hier findet ihr unsere wöchentlichen [[ws1819:​phasmid:​Protokolle]].
  
-==== 24.01.2019 ​==== +===== Versionen ===== 
-Diesen Dienstag haben wir mit Stefan das "​Rekurente Neuronale Netzwerk"​ (RNN) kennengelernt und wie man es umsetztDies ist eine spezielle Art eines neuronalen Netzwerkes, welches lose gesprochen ein "​Gedächtnis"​ besitzt und somit besonders gut zeitliche Zusammenhänge in beispielsweise Sprache erfassen und Lernen kannDazu haben wir zudem eine Hausaufgabe bekommen, welche die Effizienz dieser RNNs zeigen sollFerner hat sich Lucas am Donnerstag mit der Organisation der Datenstruktur beschäftigt und diese zum größten Teil fertig gestellt bekommenAußerdem haben wir die Hausaufgabe bearbeitet, welche uns auch für unser Projekt helfen kann und soll. Hierfür mussten wir zuerst Daten für einen Benchmark generieren und diese dann im Anschluss mithilfe eines Machine Learning Algorithmus testen, welcher ein besonderes Muster innerhalb der Daten erkennen und erlernen sollLeider war die Umsetzung bisher noch nicht so erfolgreich und es wird noch einiges Fine-Tuning benötigt um ein erfolgreiches Ergebnis zu erzielen.+Das Programm funktioniert definitiv ​mit folgendem:​ 
 +  * Tensorflow: Version 1.13.
 +  * Numpy: Version 1.14.
 +  * Keras: Version 2.2.4
ws1819/phasmid.1551800516.txt.gz · Zuletzt geändert: 2019/03/05 16:41 von erchinger