0

我想使用通用语料库训练 Doc2Vec 模型,然后继续使用特定领域的语料库进行训练(我已阅读这是一种常见策略,我想测试结果)。

我有所有的文档,所以我可以在一开始就构建和标记词汇。

据我了解,我应该首先使用通用文档训练所有时期,然后使用临时文档重复这些时期。但是,通过这种方式,我不能将所有文档放在语料库迭代器中并调用 train() 一次(因为到处都建议这样做)。

因此,在构建全局词汇之后,我创建了两个迭代器,第一个用于通用文档,第二个用于临时文档,并调用了 train() 两次。

这是最好的方式还是更合适的方式?

如果最好,我应该如何管理 alpha 和 min_alpha?在 train() 调用中不提及它们并让 train() 管理它们是一个好的决定吗?

最好的

阿尔贝托

4

2 回答 2

0

这可能不是一个明智的策略,因为:

  • Python GensimDoc2Vec类从未正确支持在第一次build_vocab()调用后扩展其已知词汇表。(至少在 3.8.3 之前,这种尝试通常会导致 Segmentation Fault 进程崩溃。)因此,如果只有您的域语料库中存在单词,则对通用语料库的初始典型初始化/训练会将它们排除在外模型完全。(您可以通过一些非典型的额外步骤来解决这个问题,但下面的其他问题仍然存在。)

  • 如果您的通用语料库中使用的词/词义与您​​的域语料库中使用的不同词/词义之间确实存在重要对比,则通用语料库中的词的影响可能不会有益,稀释与域相关的含义

  • 此外,任何仅使用所有文档子集(域语料库)的后续训练都只会更新该词/词义子集的向量,以及模型的内部权重用于进一步的未见文档推理,其方向是仅对域语料库有意义。此类后期训练的向量可能会被任意微调,与未出现在域语料库中的其他词的可比性对齐,并且早期训练的向量将发现自己不再与模型的后来更新的内部权重相关。(具体到什么程度取决于后续训练中的学习率alphaepochs选择,以及后续训练对模型损失的优化程度。)

如果您的域数据集足够,或者可以使用更多域数据进行增长,则可能不需要混合其他训练步骤/数据。但是,如果您认为必须尝试这样做,最好的方法是将所有训练数据混在一起,并在一个会话中训练,从一开始就知道所有单词,并且所有训练示例都以平衡、交错的方式呈现。(或者可能,一些被认为非常重要的训练文本被过采样,但仍然与所有时代的所有可用文档的多样性混合在一起。)

如果您看到权威消息来源建议使用Doc2Vec算法进行这种“使用一个数据集进行训练,然后使用另一个不相交的数据集”的方法,您应该向他们询问有关他们为使这项工作所做的工作的更多详细信息:确切的代码步骤和显示的评估一种提升。(有一些方法来管理所有问题并非不可能!但我看到了许多模糊的印象,即这种单独的预训练是直接或有益的,并且零实际工作编写的代码和评估指标表明它正在工作。)

关于您在https://stackoverflow.com/a/64865886/130288提供的其他说明的更新:

即使在这种情况下,我的建议仍然是:不要将训练分成两批。与组合训练相比,几乎可以肯定会降低模型的性能。

我很想看看你提到的“文献中的参考资料”的链接。他们可能会感到困惑或谈论Doc2Vec(“段落向量”)算法以外的算法。

如果有任何理由赋予您的域文档更多的权重,那么更好的方法是在组合语料库中对它们进行过采样。

无论如何,测试所有这些变体并发布相关结果。如果您正在探索不可靠的假设,我会忽略来自类似 StackOverflow 的来源的任何建议,只需运行您阅读文献所建议的所有变体,看看哪些(如果有的话)真正有帮助。

您正确地认识到alpha参数的选择是一个模糊的领域,可能会严重影响此类附加培训的影响。没有正确的答案,所以你必须搜索和推理出什么是有意义的。我提到的这种子集跟踪训练的固有问题可能会导致即使您在某些组合中找到好处,它们可能更多是数据和任意参数的幸运组合的产物,而不是可推广的实践。

并且:您的具体问题“是否最好设置这些值或根本不提供它们”简化为:“您是否要使用默认值或创建模型时设置的值?”

如果有的话,哪些值可能是可行的,因为这种未经证实的技术需要通过实验来发现。也就是说,如果您想在这里获得可比较(或可发布)的结果,我认为您必须从自己的小说作品中证明一些特定策略来选择好的alpha/epochs和其他参数,而不是采用仅在 StackOverflow 中推荐的任何做法回答。

于 2020-11-16T19:02:42.130 回答
0

感谢您的快速和扩展的回答。只是一些评论来澄清这个问题。

我之前有两个数据集来开始训练,因此 build_vocab() 调用只使用一次迭代器完成所有标记文档,通用和特定领域。所以,第一个问题没有问题,训练的任何部分都不会出现新词。

我真的同意你的看法。如果有足够多的特定领域文档可用,则仅使用这些文档进行培训应该会产生更好的结果。但是文献中有一些参考资料说,最初使用一般语料库进行训练,然后在特定领域的语料库上进行一些训练,可以取得良好的效果。其他参考资料说,如果有足够的特定领域文档可用,最好只尝试这些文档。

问题是我是大学的研究员,作为这项研究工作的一部分,我想做一些实验来比较两种方式的结果。

因此,我目前的混合训练方法可以总结为:

模型 = Doc2Vec(vector_size=20, window=8, alpha=0.025, min_alpha=0.00025, min_count=5, dm=1)

model.build_vocab(corpus_data_both) # 在两组标记文档上的迭代器

model.train(corpus_data_gen, total_examples=#generic_docs, alpha=0.025, min_alpha=0.00025, epochs=20) # 通用语料库标记文档的迭代器

model.train(corpus_data_ah, total_examples=#domain_docs, alpha=0.025, min_alpha=0.00025, epochs=20) # 域语料库标记文档的迭代器

我主要关心的是两个调用 train() 中的 alpha 和 alpha_min 参数。我不确定是设置这些值还是根本不提供它们更好。

再次感谢您的关注阿尔贝托

于 2020-11-16T21:21:01.453 回答