Не вызывайте .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
бывает редко, но даже если вы захотите, достаточно просто установить новое значение, отличное от значения по умолчанию, при первоначальном создании модели.)