Skip to content
Snippets Groups Projects
Commit e70e5090 authored by Joel Vongehr's avatar Joel Vongehr
Browse files

Zeilen & Captions in w2vFromScratch

parent 79c9ef8b
No related branches found
No related tags found
No related merge requests found
......@@ -31,10 +31,10 @@ Für die Gegenüberstellung der verschiedenen Methoden werden nur die Ergebnisse
%Mean: 10s epoche, 4ms pro Step; 2048 batchsize
%CNN, groß: 7min epoche, ?? pro Step;256 batchsize
%CNN, RAM: 17s epoche, 21ms step;128 batchsize
Aufgrund der ähnlichen Ergebnisse ist jedoch die Mean Methode deutlich zu bevorzugen. Zum einen benötigt diese in der Regel weniger Vorbereitung, hier in Form der Generatoren. Das liegt daran, dass die Mean Methode schwächer skalierende Anforderungen an die Hardware hat. Dadurch ist auch die Trainingszeit um ein vielfaches schneller mit ca.\@ 10s pro Epoche gegenüber ungefähr 7min. Der Großteil dieses Unterschieds entsteht dabei durch das Lesen von der Festplatte durch die Generatoren anstelle des Arbeitsspeichers. Aber auch Konfigurationsunterschiede sind dabei zu beachten, z.\,.B\@ nutzt der Mean eine wesentlich größere batchsize von 2048. Im Vergleich arbeitet der CNN nur mit einer Größe von 256.
%Aber auch in kleineren Beispielen, bei denen der CNN auch ausschließlich den Arbeitsspeicher verwenden kann, schneidet der Mean besser ab. Hier benötigt der CNN immer noch ca.\@ 17s pro Epoche. Jedoch sind hier zusätzlich unterschiedliche batchsizes von 2048
Aufgrund der ähnlichen Ergebnisse ist jedoch die Mean Methode deutlich zu bevorzugen. Zum einen benötigt diese in der Regel weniger Vorbereitung, hier in Form der Generatoren. Das liegt daran, dass die Mean Methode schwächer skalierende Anforderungen an die Hardware hat. Dadurch ist auch die Trainingszeit um ein vielfaches schneller mit ca.\@ 10s pro Epoche gegenüber ungefähr 7min. Der Großteil dieses Unterschieds entsteht dabei durch das Lesen von der Festplatte durch die Generatoren anstelle des Arbeitsspeichers. Aber auch Konfigurationsunterschiede sind dabei zu beachten, z.\,.B\@ nutzt der Mean eine wesentlich größere batchsize von 2048. Im Vergleich arbeitet das CNN nur mit einer Größe von 256.
%Aber auch in kleineren Beispielen, bei denen das CNN auch ausschließlich den Arbeitsspeicher verwenden kann, schneidet der Mean besser ab. Hier benötigt das CNN immer noch ca.\@ 17s pro Epoche. Jedoch sind hier zusätzlich unterschiedliche batchsizes von 2048
Allerdings bietet das CNN Modell mehr Möglichkeiten an der Struktur zu arbeiten als die Mean Methode. Während am Mean nur wenige Änderungen vorgenommen werden könnten bietet der CNN ein wesentlich größeres Potenzial. Es besteht also durchaus die Möglichkeit, dass ein ausführlicheres Experimentieren mit dem Aufbau des CNN zu konstant besseren Ergebnissen führt. \wip{Dies konnte in dieser Arbeit aufgrund von Zeitproblemen leider nicht geprüft werden. (Von Zeitproblemen bei ner Arbeit zu reden, welche n halbes Jahr ging is vlt n bissl dreist xD)}
Allerdings bietet das CNN Modell mehr Möglichkeiten an der Struktur zu arbeiten als die Mean Methode. Während am Mean nur wenige Änderungen vorgenommen werden könnten bietet das CNN ein wesentlich größeres Potenzial. Es besteht also durchaus die Möglichkeit, dass ein ausführlicheres Experimentieren mit dem Aufbau des CNN zu konstant besseren Ergebnissen führt. \wip{Dies konnte in dieser Arbeit aufgrund von Zeitproblemen leider nicht geprüft werden. (Von Zeitproblemen bei ner Arbeit zu reden, welche n halbes Jahr ging is vlt n bissl dreist xD)}
\subsubsection{Problemstellung}
Die relativ geringe Erfolgsquote der Modelle, aber z.\,B.\@ auch die Schwierigkeiten mit neutralen Reviews zeigen sicherlich, dass es noch Optimierungsmöglichkeiten gibt. Dennoch liegt ein großer Teil der Herausforderung auch an der eigentlichen Problemstellung. Die meisten Menschen hätten vermutlich auch Schwierigkeiten dabei eine 2 Sterne Review, sprich einer negativen, von einer 3 Sterne, also neutralen, zu unterscheiden. Zum einen sind die Übergänge recht fließend. Zum Anderen sind Menschen aber auch einfach unterschiedlich: Der gleiche Text mit den identischen Argumenten könnte für eine Person eine 3 Sterne und für die nächste eine 4 Sterne Review sein. Aus der Sicht des Modells gäbe es also 2 Einträge mit identischen Merkmalen, welche jedoch unterschiedlichen Kategorien zugeordnet werden.
......
\subsubsection{w2v from scratch
\label{subsec:w2vfs}}
Da Word2Vec ein großer Bestandteil dieser Ausarbeitung ist, jedoch durch einen Import gelöst wurde, wird in diesem Kapitel anhand eines simplen Beispiels das Prinzip dahinter erklärt. Dabei werden hier keine hochdimensionalen Wort-Vektoren verwendet, welche letztlich durch ihre Cluster ausgeprägte Bedeutungsräume bilden. Sondern es werden die Beziehungen der Wörter zu ihren Nachbarn dargestellt, indem anhand eines Wortes das Nachbarwort bestimmt werden soll.
\begin{lstlisting}
\begin{lstlisting}[caption=Datensatz Word2Vec from scratch]
corpus = ['king is a strong man',
'queen is a wise woman',
'boy is a young man',
......@@ -14,7 +14,7 @@ corpus = ['king is a strong man',
'princess is a girl will be queen']
\end{lstlisting}
Unser Datensatz ist dabei recht überschaubar und auch in einer einfachen Struktur gehalten. Auf diese Weise lassen sich die Interaktionen und Einflüsse der Wort-Vektoren übersichtlicher darstellen.
\begin{lstlisting}
\begin{lstlisting}[caption=Entfernen der Stoppwörter, firstnumber=10]
def remove_stop_words(corpus):
stop_words = ['is', 'a', 'will', 'be']
results = []
......@@ -30,7 +30,7 @@ def remove_stop_words(corpus):
corpus = remove_stop_words(corpus)
\end{lstlisting}
Zunächst entfernen wir die in Kapitel \ref{subsec:vorverarbeitung} bereits erklärten stop words. Dadurch, dass wir hier ein kurzes, akademisches Beispiel haben ist auch die Liste der stop words eher kurz. In der Regel sind Wörter wie die auch hier genutzten in diesen Listen zu finden, aber je nach Anwendungsfall kann es auch Sinn ergeben diese mit ungewöhnlicheren Wörtern zu füllen.
\begin{lstlisting}
\begin{lstlisting}[caption=Nachbarwörter speichern, firstnumber=23]
from ordered_set import OrderedSet
words = OrderedSet()
......@@ -63,7 +63,7 @@ df = pd.DataFrame(data, columns = ['input', 'neighbour'])
Als nächstes erstellen wir ein \lstinline{OrderedSet}{}, welches alle Wörter nur ein einziges Mal enthält und nummerieren dieses durch. Dies wird im späteren Verlauf noch benötigt, wobei die Reihenfolge wichtig für die korrekte Visualisierung ist. Anschließend erstellen wir ein Datenset, welches alle Wörter mit ihren jeweiligen Nachbarn enthält. Dabei entspricht die \lstinline{WINDOW_SIZE}{} in Zeile 17 wie viele Nachbarwörter betrachtet werden sollen. Schließlich haben in langen Sätzen Wörter, welche zum Ende eines Nebensatzes stehen, häufig eine eher schwache oder gar keine Bindung zu den ersten Wörtern des Hauptsatzes. Die ideale Größe der \lstinline{WINDOW_SIZE}{} hängt dabei individuell vom Text ab. Jedoch ist in der Regel eine eher kleine \lstinline{WINDOW_SIZE}{} zu empfehlen, +-2 bis 3 Wörter sind in vielen Fällen genug.
% Die +- 2 bis 3 hab ich mir ausgedacht und kann sie dementsprechend nicht belegen%
Abschließend wird das Datenset in ein pandas Dataframe überführt, wodurch das Arbeiten mit diesem erleichtert wird. Weiterhin sind noch 2 Aspekte des Datensets auffällig. Zum einen werden die Wörter mit ihren Nachbarn zwangsweise bidirektional abgespeichert. Die Erklärung dafür ist simpel: Die Beziehung zwischen den Wörtern ist schließlich auch bidirektional und so wird sichergestellt, dass im späteren Verlauf des Codes diese Bidirektionalität auch eingehalten wird, ohne dass darauf explizit geachtet werden muss. Zum anderen werden mehrfach auftretende Kombinationen auch mehrfach abgespeichert und nicht im Nachhinein wieder auf ein unique-dataset bereinigt. Das kommt daher, dass diese Häufigkeit essenzielle Daten enthält. Man geht letztlich davon aus, dass Wörter, die häufig zusammen vorkommen eine stärkere Bindung haben und auch außerhalb des benutzten Datensets verstärkt gemeinsam auftreten.
\begin{lstlisting}
\begin{lstlisting}[caption=Beispielmodell,firstnumber=51]
import tensorflow as tf
import numpy as np
from tensorflow.keras.models import Sequential
......@@ -99,7 +99,7 @@ model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=["accurac
model.fit(X_train,Y_train,epochs=1000,verbose=True)
\end{lstlisting}
Bevor mit den Daten trainiert werden kann müssen die Wörter in eine dafür nutzbare Form übertragen werden. Dies geschieht in diesem Beispiel durch ein One-Hot-Encoding. Dabei wird das zuvor erstellte Dataset der durchnummerierten, einzigartigen Wörter zu Hilfe genommen. Entsprechend der ursprünglichen Zielsetzung entsprechen die Ausgangswörter den Eingangsdaten und die Nachbarwörter den Zieldaten. Zum Schluss werden diese Daten für das Training in numpy arrays übertragen und einem einfachen Modell fürs Training übergeben.
\begin{lstlisting}
\begin{lstlisting}[caption=Plotten, firstnumber=84]
vectors = np.array(model.weights[0])
w2v_df = pd.DataFrame(vectors, columns = ['x1', 'x2'])
w2v_df.insert(0, "word", words)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment