Что такое итерации обучения doc2vec?

Я новичок в doc2vec. Сначала я пытался понять doc2vec, и ниже упоминается мой код, который использует Gensim. Как я хочу, я получаю обученную модель и векторы документов для двух документов.

Однако я хотел бы узнать о преимуществах переобучения модели в несколько эпох и как это сделать в Gensim? Можем ли мы сделать это, используя параметр iter или alpha, или нужно обучать его в отдельном for loop? Пожалуйста, дайте мне знать, как мне изменить следующий код, чтобы обучить модель 20 эпохам.

Кроме того, мне интересно знать, что для модели word2vec также необходимы несколько итераций обучения.

# Import libraries
from gensim.models import doc2vec
from collections import namedtuple

# Load data
doc1 = ["This is a sentence", "This is another sentence"]

# Transform data
docs = []
analyzedDocument = namedtuple('AnalyzedDocument', 'words tags')
for i, text in enumerate(doc1):
    words = text.lower().split()
    tags = [i]
    docs.append(analyzedDocument(words, tags))

# Train model
model = doc2vec.Doc2Vec(docs, size = 100, window = 300, min_count = 1, workers = 4)

# Get the vectors
model.docvecs[0]
model.docvecs[1]

person Community    schedule 18.10.2017    source источник


Ответы (1)


Word2Vec и связанные с ним алгоритмы (например, «векторы абзацев» или Doc2Vec) обычно выполняют несколько обучающих проходов по текстовому корпусу.

_3 _ / _ 4_ Gensim позволяет указывать количество проходов с помощью параметра iter, если вы также предоставляете корпус при инициализации объекта для запуска немедленного обучения. (Ваш код выше делает это, передавая docs вызову конструктора Doc2Vec(docs, ...).)

Если не указано иное, значение по умолчанию iter, используемое gensim, равно 5, что соответствует значению по умолчанию, используемому в исходной версии word2vec.c от Google. Итак, ваш код выше уже использует 5 проходов обучения.

В опубликованной Doc2Vec работе часто используется 10-20 проходов. Если вы хотите вместо этого выполнить 20 проходов, вы можете изменить инициализацию Doc2Vec на:

model = doc2vec.Doc2Vec(docs, iter=20, ...)

Поскольку Doc2Vec часто использует теги уникальных идентификаторов для каждого документа, большее количество итераций может быть более важным, так что каждый документ-вектор будет проходить обучение несколько раз в течение обучения по мере того, как модель постепенно улучшается. С другой стороны, поскольку слова в Word2Vec корпусе могут появляться где угодно по всему корпусу, связанные векторы каждого слова будут подвергаться множественным корректировкам, в начале, в середине и в конце процесса по мере улучшения модели - даже за один проход. (Таким образом, с гигантским, разнообразным Word2Vec корпусом можно использовать меньшее количество проходов, чем заданное по умолчанию.)

Вам не нужно создавать собственный цикл, и большинству пользователей этого не следует. Если вы сами управляете отдельными build_vocab() и train() шагами, вместо более простого шага по предоставлению корпуса docs в вызове инициализатора для запуска немедленного обучения, тогда вы должны предоставить epochs аргумент для train() - и он выполнит это количество проходов, так что вам по-прежнему нужен только один звонок на train().

person gojomo    schedule 18.10.2017
comment
Большое спасибо за ваш замечательный и превосходный ответ :) Если я использую CBOW word2vec, правильно ли использовать один и тот же параметр iter для обучения несколько раз? т.е. `model = word2vec.Word2Vec (предложения, sg = 0, iter = 10, ...)? - person ; 19.10.2017
comment
Да, Word2Vec и Doc2Vec оба поддерживают параметр iter в своем методе инициализации! - person gojomo; 19.10.2017
comment
Большое спасибо :) Есть ли разница в использовании документов непосредственно в doc2vec и использовании документов, как показано ниже. model.build_vocab(sentences) for epoch in range(10): model.train(sentences)? Создает ли он одинаковые векторы документов? - person ; 19.10.2017
comment
При таком вызове train() 10 раз возникает много проблем. Если при вызове у вас не возникает ошибок, и вы оставили значение по умолчанию iter на 5, каждый вызов выполняет 5 проходов, поэтому вы получите всего 50 проходов по данным, а не 10. Кроме того, каждый вызов train() регулирует скорость обучения от начального alpha до min_alpha, поэтому он будет идти вверх-вниз, вверх-вниз и т. д. - совсем не правильно для SGD. Но также, поскольку эта ошибка была распространенной, последний gensim даже не позволит вам вызвать train() без явного аргумента epochs, поэтому в последнем gensim будет ошибка. Не делай этого. - person gojomo; 19.10.2017
comment
Большое спасибо за прекрасный ответ. Итак, вы рекомендуете использовать model = doc2vec.Doc2Vec(docs, iter=20, ...)this вместо model.build_vocab(sentences) for epoch in range(10): model.train(sentences), верно? :) - person ; 20.10.2017
comment
Да, потому что последний не будет делать то, что вы намереваетесь, или правильно управлять скоростью обучения, или даже работать без ошибок (в последних версиях gensim). - person gojomo; 20.10.2017
comment
В каких случаях было бы лучше не указывать документы в конструкторе, а вызывать train () один раз с правильным количеством эпох? - person Simon Hessner; 17.05.2018
comment
Добавление документов в конструктор приводит к автоматическому запуску build_vocab() и train(), поэтому, если вы просто хотите, чтобы они выполнялись обычным образом, это нормальный способ использовать модель. Если вы хотите рассчитать время шагов по отдельности или провести некоторый анализ / регистрацию после обнаружения словаря, или, возможно, даже разделить build_vocab() на составляющие шаги (и сделать что-то вроде итеративно попробуйте несколько значений min_count для scale_vocab(), чтобы достичь определенного выжившего- размер словарного запаса или размер ОЗУ модели), то вы бы хотели избежать автоматических вызовов и делать их явно отдельно. - person gojomo; 17.05.2018