В настоящее время я использую Tensorflow для глубокого обучения, которое я разрабатываю на работе. Я не могу вдаваться в подробности о приложении, но код - это что-то вроде настроенного Word2Vec, но стоимость каждого слова-вектора-представления должна вычисляться индивидуально. :График тензорного потока слишком большой
def cost_function(word_vector, other_word_vectors):
# cost for a single training example needs to be computed
# separately, and it depends on the vector representations
# of some other words, depending on the training instance
return tf.nn.tanh(some_mathematical_computation)
Проблема такого подхода заключается в том, что размер графа стремится взорвать столько, что compute_gradients
операция занимает много времени. Мало того, время, затраченное на compute_gradients
, линейно увеличивается с размером графика. tf.stop_gradients
по какой-то причине не помогает. Что помогает инициализировать новый tf.Graph
и новый tf.Session()
для каждых нескольких учебных экземпляров (называйте это мини-пакетом), выполняя несколько таких вычислений параллельно (называйте это мини-пакетной коллекцией), а затем комбинируя результаты и сохраняя их для следующей мини-партии-коллекции.
def learning(mini_batch):
with tf.Graph().as_default() as g:
with tf.Session() as sess:
self.perform_learning_on_batch(mini_batch, sess)
return resultant_model
def collection_learn(mini_batch_collection):
models = run_learning_in_parallel()
return combine_model(models)
def master():
initial_model = something
for mini_batch_collection in dataset:
new_model = collection_learn(mini_batch_collection)
Есть ли лучший способ для параллельного обучения для такого приложения?
Спасибо ... Я закончил использовать простую реализацию снижения градиента ливня. Не удалось обойти это с помощью тензорного потока. Любая идея, если бы помочь динамическая структура графика (например, pytorch)? –
Линейный спуск градиента - это то, что модели тензорного потока используются по умолчанию для распределенного и параллельного обучения. –