Мой код Doc2Ve c после многих циклов обучения не дает хороших результатов. Что может быть не так? - PullRequest
0 голосов
/ 08 июля 2020

Я обучаю модель Doc2Vec, используя приведенный ниже код, где tagged_data - это список TaggedDocument экземпляров, которые я установил раньше:

max_epochs = 40

model = Doc2Vec(alpha=0.025, 
                min_alpha=0.001)

model.build_vocab(tagged_data)

for epoch in range(max_epochs):
    print('iteration {0}'.format(epoch))
    model.train(tagged_data,
                total_examples=model.corpus_count,
                epochs=model.iter)
    # decrease the learning rate
    model.alpha -= 0.001
    # fix the learning rate, no decay
    model.min_alpha = model.alpha

model.save("d2v.model")
print("Model Saved")

Когда я позже проверю результаты модели , они не хорошие. Что могло пойти не так?

1 Ответ

1 голос
/ 08 июля 2020

Не вызывайте .train() несколько раз в своем l oop, который пытается выполнить alpha arithmeti c.

Это не нужно и подвержено ошибкам .

В частности, в приведенном выше коде уменьшение исходного 0.025 альфа на 0.001 в сорок раз приводит к (0.025 - 40*0.001) -0.015 final alpha, что также было бы отрицательным для многих тренировочных эпох. Но отрицательная alpha скорость обучения бессмысленна: она, по сути, просит модель немного подтолкнуть свои прогнозы в неправильном направлении, а не немного в вправо направление при каждом массовом обновлении обучения. (Кроме того, поскольку model.iter по умолчанию 5, приведенный выше код фактически выполняет 40 * 5 обучающих проходов - 200 - что, вероятно, не является сознательным намерением. Но это только запутает читателей кода и медленное обучение, а не результаты полностью саботируют, например, неправильное обращение с кодом alpha.)

Есть и другие варианты ошибок, которые здесь распространены. Если бы вместо alpha было уменьшено на 0.0001, то 40 уменьшений уменьшили бы только окончательное alpha до 0.021 - тогда как правильная практика для этого стиля SGD (Stochasti c Gradient Descent) с линейным обучением - спад скорости предназначен для значения, которое заканчивается "очень близко к 0.000). Если пользователи начинают возиться с max_epochs - это, в конце концов, параметр, вытащенный наверху! - но также не регулируйте уменьшение каждый раз 0.000.

Так что не используйте этот шаблон.

К сожалению, многие плохие онлайн-примеры скопировали этот анти-шаблон из каждого другие, и допускают серьезные ошибки при обработке epochs и alpha. Пожалуйста, не копируйте их ошибку и сообщите их авторам, что они вводят людей в заблуждение везде, где возникает эта проблема.

Приведенный выше код можно улучшить с помощью гораздо более простой замены:

max_epochs = 40
model = Doc2Vec()  # of course, if non-default parameters needed, use them here
                   # but most users won't need to change alpha/min_alpha at all

model.build_vocab(tagged_data)
model.train(tagged_data, total_examples=model.corpus_count, epochs=max_epochs)

model.save("d2v.model")

Здесь метод .train() выполнит в точности запрошенное количество epochs, плавно уменьшая внутренний эффективный alpha от начального значения по умолчанию до почти нуля. (Менять начальное alpha бывает редко, но даже если вы захотите, достаточно просто установить новое значение, отличное от значения по умолчанию, при первоначальном создании модели.)

...