Я хочу реализовать 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/