Jestem ciekawy, w jaki sposób mogę dodać normalnie losowy 300 wektor wymiarowy (elements 'type = tf.float32) za każdym razem, gdy słowo nieznany uprzednio wyszkolonemu słownikowi. Używam wcześniej wyszkolonych embedowań słów GloVe, ale w niektórych przypadkach zdaję sobie sprawę, że napotykam nieznane słowa i chcę stworzyć normalnie losowy wektor słów dla tego nowego nieznanego słowa.Jak dodawać nowe embeddings dla nieznanych słów w Tensorflow (szkolenie i zestaw do testowania)
Problem polega na tym, że przy mojej obecnej konfiguracji używam tf.contrib.lookup.index_table_from_tensor do konwersji słów na liczby całkowite w oparciu o znane słownictwo. Ta funkcja może tworzyć nowe tokeny i mieszać je dla pewnej uprzednio zdefiniowanej liczby słów słów kluczowych, ale moja embed
nie będzie zawierać osadzenia dla tej nowej nieznanej wartości hash. Nie jestem pewien, czy mogę po prostu dołączyć losowe osadzanie na końcu listy embed
.
Chciałbym również zrobić to w sposób efektywny, więc wcześniej skonstruowana funkcja tensorflow lub metoda obejmująca funkcje tensorflow byłyby prawdopodobnie najbardziej wydajne. Definiuję znane wcześniej specjalne tokeny, takie jak token końca zdania i domyślny nieznany, jako pusty ciąg ("" w indeksie 0), ale ma to ograniczoną zdolność uczenia się różnych nieznanych słów. Obecnie używam tf.nn.embedding_lookup() jako końcowego etapu osadzania.
Chciałbym móc dodawać nowe losowe wektory 300d dla każdego nieznanego słowa w danych treningowych, a także chciałbym dodać gotowe losowe wektory słów dla nieznanych tokenów niewidocznych podczas treningu, które mogą się pojawić podczas testowania. Jaki jest najskuteczniejszy sposób na zrobienie tego?
def embed_tensor(string_tensor, trainable=True):
"""
Convert List of strings into list of indicies then into 300d vectors
"""
# ordered lists of vocab and corresponding (by index) 300d vector
vocab, embed = load_pretrained_glove()
# Set up tensorflow look up from string word to unique integer
vocab_lookup = tf.contrib.lookup.index_table_from_tensor(
mapping=tf.constant(vocab),
default_value = 0)
string_tensor = vocab_lookup.lookup(string_tensor)
# define the word embedding
embedding_init = tf.Variable(tf.constant(np.asarray(embed),
dtype=tf.float32),
trainable=trainable,
name="embed_init")
# return the word embedded version of the sentence (300d vectors/word)
return tf.nn.embedding_lookup(embedding_init, string_tensor)