Обучение Word2Ve c очень медленно - PullRequest
0 голосов
/ 13 марта 2020

В настоящее время я пытаюсь обучить модель скип-граммы Word2Ve c с отрицательной выборкой с использованием кера из тензор потока 2.0 на основе этого урока (без вспомогательного вывода). Моя модель выглядит следующим образом:

# vocab_size = about 1 million
# embedding_dim = 300

# Target word and context word as integers
input_target = keras.Input((1,))
input_context = keras.Input((1,))

# Retrieve word embeddings of target and context word
embeddings = keras.layers.Embedding(vocab_size + 1, embedding_dim, input_length=1, name="embeddings")
embedding_target = embeddings(input_target)
embedding_context = embeddings(input_context)

# Reshape embeddings
reshape = keras.layers.Reshape((embedding_dim, 1))
embedding_target = reshape(embedding_target)
embedding_context = reshape(embedding_context)

# Compute dot product of embedding vectors
dot = keras.layers.Dot(1)([embedding_target, embedding_context])
dot = keras.layers.Reshape((1,))(dot)

# Compute output
output = keras.layers.Dense(1, activation="sigmoid")(dot)

# Create mode
model = keras.Model(inputs=[input_target, input_context], outputs=output)
model.compile(loss="binary_crossentropy", optimizer="rmsprop")

Набор данных, который я использую, - это engli sh набор данных Википедии , предоставленный tenorflow. Однако я не тренируюсь на полном наборе данных (5 824 596 статей), только на 3 000 000 статей. Как вы можете себе представить, количество уникальных слов (~ 1 миллион) и общее количество слов (~ 1,2 миллиарда) все еще огромны. Однако авторы оригинальной статьи Word2Ve c в реферате утверждают, что для изучения высококачественных векторов слов в корпусе из 1,6 миллиарда слов требуется меньше суток. Моей реализации нужно 3 секунды на статью, чтобы тренироваться в среднем. Это выглядит очень медленно для меня, так как это заняло бы более 100 дней, чтобы потренироваться во всех 3 миллионах статей за один раз. У меня есть Nvidia GTX 1080 TI, и nvidia-smi показывает, что загрузка графического процессора в большинстве случаев составляет 0% с короткими «пиками» примерно до 5%.

Моей первой мыслью было, что этапы предварительной обработки слишком медленно. Таким образом, я протестировал обучение с фиктивными данными, сгенерированными с помощью numpy:

target = np.random.randint(0, vocab_size, 2048 * 1000, np.int32)
context = np.random.randint(0, vocab_size, 2048 * 1000, np.int32)
label = np.random.randint(0, 2, 2048 * 1000, np.int32)

model.fit([target, context], label, 4096)

. Я протестировал разные значения для batch_size (32, 1024, 2048, 4096), но загрузка графического процессора все еще была на уровне 0%. времени. Целые массивы target, context и label помещаются в память.

Когда я изменил метод fit на train_on_batch (но без пакетной обработки - поместите в функцию целые массивы) загрузка графического процессора по крайней мере варьировалась от 0% до почти 40%.

Кроме того, установлен tensorflow-gpu и тензор потока распознает графический процессор: 2020-03-13 15:44:52.424589: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1304] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 10349 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:b1:00.0, compute capability: 6.1)

Я что-то упускаю из виду? Это возможно, так как я новичок в keras / tenorflow и в машинном обучении в целом.

...