реализация word2ve c в тензор потока 2.0 - PullRequest
0 голосов
/ 20 января 2020

Я хочу реализовать word2ve c с использованием tenorflow 2.0. Я подготовил набор данных по модели скип-грамм и получил ок. 18 миллионов наблюдений (целевые и контекстные слова).

Я использовал следующий набор данных для своей цели: https://www.kaggle.com/c/quora-question-pairs/notebooks

Я создал новый набор данных для n- грамм модель. Я использовал windows_size 2 и количество пропусков, равное 2, а также для создания для каждого целевого слова (в качестве нашего ввода) слова для создания контекста (это то, что я должен предсказать). Это выглядит так:

target  context
  1        3
  1        1
  2        1 
  2       1222

Вот мой код:

dataset_train = tf.data.Dataset.from_tensor_slices((target, context))
dataset_train = dataset_train.shuffle(buffer_size=1024).batch(64)

#Parameters:
num_words = len(word_index)#approximately 100000
embed_size = 300
num_sampled = 64
initializer_softmax = tf.keras.initializers.GlorotUniform()
#Variables:
embeddings_weight = tf.Variable(tf.random.uniform([num_words,embed_size],-1.0,1.0))
softmax_weight = tf.Variable(initializer_softmax([num_words,embed_size]))
softmax_bias = tf.Variable(initializer_softmax([num_words]))

optimizer = tf.keras.optimizers.Adam()


#As before, we are supplying a list of integers (that correspond to our validation vocabulary words) to the embedding_lookup() function, which looks up these rows in the normalized_embeddings tensor, and returns the subset of validation normalized embeddings.  
#Now that we have the normalized validation tensor, valid_embeddings, we can multiply this by the full normalized vocabulary (normalized_embedding) to finalize our similarity calculation:
@tf.function
def training(X,y):
    with tf.GradientTape() as tape:
        embed = tf.nn.embedding_lookup(embeddings_weight,X)
        loss = tf.reduce_mean(tf.nn.sampled_softmax_loss(weights = softmax_weight, biases = softmax_bias, inputs = embed,
                                   labels = y, num_sampled = num_sampled, num_classes = num_words))
    variables = [embeddings_weight,softmax_weight,softmax_bias]  
    gradients = tape.gradient(loss,variables)
    optimizer.apply_gradients(zip(gradients,variables))


EPOCHS = 30
for epoch in range(EPOCHS):
    print('Epoch:',epoch)
    for X,y in dataset_train:
        training(X,y)  


#compute similarity of words: 
norm =  tf.sqrt(tf.reduce_sum(tf.square(embeddings_weight), 1, keepdims=True))
norm_embed = embeddings_weight/ norm
temp_emb = tf.nn.embedding_lookup(norm_embed,X)
similarity = tf.matmul(temp_emb,tf.transpose(norm_embed))

Но вычисление даже 1 эпохи длится слишком долго. Можно ли как-то улучшить производительность моего кода? (Я использую Google Colab для выполнения кода)

РЕДАКТИРОВАТЬ: это форма моего набора данных поезда

dataset_train

<BatchDataset shapes: ((None,), (None, 1)), types: (tf.int64, tf.int64)>

Я следовал инструкциям из этого руководства: https://adventuresinmachinelearning.com/word2vec-tutorial-tensorflow/

1 Ответ

0 голосов
/ 03 марта 2020

Это связано с тем, что функция softmax в вычислительном отношении довольно дорога, имея дело с возможностями миллионов точек в алгоритме Word2Ve c, как объяснено здесь . Более быстрое обучение было бы возможно с отрицательной выборкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...