Ja, der Zweck der tf.nn.embedding_lookup()
Funktion ist ein lookup in der Einbettungsmatrix und gibt die Einbettungen auszuführen (oder in einfachen Worten, die Vektordarstellung) von Wörter.
Eine einfache Einbettungsmatrix (vocabulary_size x embedding_dimension
) würde wie folgt aussehen. (Dh jedes Wort wird von einem Vektor von Zahlen dargestellt werden, daher der Name word2vec)
Embedding Matrix
the 0.418 0.24968 -0.41242 0.1217 0.34527 -0.044457 -0.49688 -0.17862
like 0.36808 0.20834 -0.22319 0.046283 0.20098 0.27515 -0.77127 -0.76804
between 0.7503 0.71623 -0.27033 0.20059 -0.17008 0.68568 -0.061672 -0.054638
did 0.042523 -0.21172 0.044739 -0.19248 0.26224 0.0043991 -0.88195 0.55184
just 0.17698 0.065221 0.28548 -0.4243 0.7499 -0.14892 -0.66786 0.11788
national -1.1105 0.94945 -0.17078 0.93037 -0.2477 -0.70633 -0.8649 -0.56118
day 0.11626 0.53897 -0.39514 -0.26027 0.57706 -0.79198 -0.88374 0.30119
country -0.13531 0.15485 -0.07309 0.034013 -0.054457 -0.20541 -0.60086 -0.22407
under 0.13721 -0.295 -0.05916 -0.59235 0.02301 0.21884 -0.34254 -0.70213
such 0.61012 0.33512 -0.53499 0.36139 -0.39866 0.70627 -0.18699 -0.77246
second -0.29809 0.28069 0.087102 0.54455 0.70003 0.44778 -0.72565 0.62309
gespalten I die oben Einbettungs Matrix und geladen nur die Worte in vocab
wird unser Vokabular sein und die entsprechenden Vektoren in emb
Array.
vocab = ['the','like','between','did','just','national','day','country','under','such','second']
emb = np.array([[0.418, 0.24968, -0.41242, 0.1217, 0.34527, -0.044457, -0.49688, -0.17862],
[0.36808, 0.20834, -0.22319, 0.046283, 0.20098, 0.27515, -0.77127, -0.76804],
[0.7503, 0.71623, -0.27033, 0.20059, -0.17008, 0.68568, -0.061672, -0.054638],
[0.042523, -0.21172, 0.044739, -0.19248, 0.26224, 0.0043991, -0.88195, 0.55184],
[0.17698, 0.065221, 0.28548, -0.4243, 0.7499, -0.14892, -0.66786, 0.11788],
[-1.1105, 0.94945, -0.17078, 0.93037, -0.2477, -0.70633, -0.8649, -0.56118],
[0.11626, 0.53897, -0.39514, -0.26027, 0.57706, -0.79198, -0.88374, 0.30119],
[-0.13531, 0.15485, -0.07309, 0.034013, -0.054457, -0.20541, -0.60086, -0.22407],
[ 0.13721, -0.295, -0.05916, -0.59235, 0.02301, 0.21884, -0.34254, -0.70213],
[ 0.61012, 0.33512, -0.53499, 0.36139, -0.39866, 0.70627, -0.18699, -0.77246 ],
[ -0.29809, 0.28069, 0.087102, 0.54455, 0.70003, 0.44778, -0.72565, 0.62309 ]])
emb.shape
# (11, 8)
Embedding Lookup in TensorFlow
Jetzt werden wir sehen, wie wir Einbettung Lookup für einigen beliebigen Eingabesatz durchführen können.
In [54]: from collections import OrderedDict
# embedding as TF tensor (for now constant; could be tf.Variable() during training)
In [55]: tf_embedding = tf.constant(emb, dtype=tf.float32)
# input for which we need the embedding
In [56]: input_str = "like the country"
# build index based on our `vocabulary`
In [57]: word_to_idx = OrderedDict({w:vocab.index(w) for w in input_str.split() if w in vocab})
# lookup in embedding matrix & return the vectors for the input words
In [58]: tf.nn.embedding_lookup(tf_embedding, list(word_to_idx.values())).eval()
Out[58]:
array([[ 0.36807999, 0.20834 , -0.22318999, 0.046283 , 0.20097999,
0.27515 , -0.77126998, -0.76804 ],
[ 0.41800001, 0.24968 , -0.41242 , 0.1217 , 0.34527001,
-0.044457 , -0.49687999, -0.17862 ],
[-0.13530999, 0.15485001, -0.07309 , 0.034013 , -0.054457 ,
-0.20541 , -0.60086 , -0.22407 ]], dtype=float32)
Beobachten Sie, wie wir das Einbettungen von unserer ursprünglichen Einbettungsmatrix (mit Worten) bekamen mit dem Indizes Worten in unserem Wortschatz.
Normalerweise wird eine solche Einbettungssuche von der ersten Schicht (Einbettungsschicht) durchgeführt, die diese Einbettungen dann zur weiteren Verarbeitung an RNN/LSTM-Schichten weiterleitet.
Side Hinweis: Normalerweise ist der Wortschatz wird auch ein spezielles unk
Token. Wenn also ein Token aus unserem Eingabesatz nicht in unserem Vokabular vorhanden ist, wird der Index, der unk
entspricht, in der Einbettungsmatrix nachgeschlagen.
P.S. Beachten Sie, dass embedding_dimension
ist ein Hyper, die man für ihre Anwendung abzustimmen hat, aber beliebte Modelle wie Word2Vec und GloVe verwendet 300
Dimension Vektor für jedes Wort darstellt.
Bonus Leseword2vec skip-gram model
Warum würden sie es so nennen und nicht 'select_rows'? –
@LenarHoyt, weil diese Idee einer Suche von Word Embeddings stammt. und die "Zeilen" sind die Repräsentationen (Einbettungen) der Wörter, in einen Vektorraum - und sind in sich selbst nützlich. Oft mehr als das eigentliche Netzwerk. –
Wie lernt Tensorflow die Einbettungsstruktur? Wird dieser Prozess auch von dieser Funktion verwaltet? – vgoklani