如何在生产中使用 doc2vec 模型?

How to use doc2vec model in production?

我想知道如何在生产中部署 doc2vec 模型来创建词向量作为分类器的输入特征。具体来说,假设 doc2vec 模型在语料库上训练如下。

dataset['tagged_descriptions'] = datasetf.apply(lambda x: doc2vec.TaggedDocument(
            words=x['text_columns'], tags=[str(x.ID)]), axis=1)

model = doc2vec.Doc2Vec(vector_size=100, min_count=1, epochs=150, workers=cores,
                                window=5, hs=0, negative=5, sample=1e-5, dm_concat=1)

corpus = dataset['tagged_descriptions'].tolist()

model.build_vocab(corpus)

model.train(corpus, total_examples=model.corpus_count, epochs=model.epochs)

然后它被转储到泡菜文件中。词向量用于训练分类器(例如随机森林)来预测电影情绪。

现在假设在生产中,有一个文档包含一些全新的词汇。话虽这么说,但在 doc2vec 模型的训练过程中,它们并不在场。我想知道如何处理这种情况。

附带说明一下,我知道 and Gensim: how to retrain doc2vec model using previous word2vec model。但是,我希望能对此事有更多的了解。

Doc2Vec 模型将只能报告在训练期间出现的文档的训练向量,并且只能infer_vector() 新的文档向量用于包含单词的文本在训练期间出现。 (传递给 .infer_vector() 的无法识别的词将被忽略,类似于在训练期间忽略出现少于 min_count 次的任何词的方式。)

如果随着时间的推移,您获得了许多包含新词汇的新文本,并且这些词很重要,您将不得不偶尔重新训练 Doc2Vec 模型。并且,在重新训练之后,重新训练模型的文档向量通常无法与原始模型的文档向量进行比较——因此下游分类器和其他使用文档向量的应用程序也需要更新。

您自己的 production/deployment 要求将决定重新训练的频率以及用新模型替换旧模型的频率。

(虽然可以随时为 Doc2Vec 模型提供新的训练数据,但作为一种 'fine-tuning' 逐步这样做会引入新旧数据之间的平衡问题。而且,还有官方 gensim 不支持扩展 Doc2Vec 模型的现有词汇表。因此,最可靠的方法是使用所有可用数据从头开始重新训练。)

关于您的示例训练代码的一些旁注:

  • 很少有 min_count=1 是个好主意:稀有词通常用作 'noise',没有足够的用法示例来很好地建模,因此 'noise'只是 slows/interferes 具有可以从更常见的单词中学习的模式

  • dm_concat=1 最好被认为是 experimental/advanced 模式,因为它使模型显着变大且训练速度变慢,其优势尚未得到证实。

  • 许多已发表的作品仅使用 10-20 个训练周期;较小的数据集或较小的文档有时会受益更多,但 150 可能会花费很多时间而边际收益很小。