在使用通用语料库进行训练后,如何使用特定领域语料库继续训练Doc2Vec



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

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

据我所知,我应该首先用通用文档训练所有的时期,然后用临时文档重复这些时期。但是,通过这种方式,我不能将所有文档放在语料库迭代器中并调用train()一次(因为它在任何地方都是推荐的)。

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

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

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

最佳

Alberto

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

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

  • 如果在你的通用语料库中使用的单词/词义和在你的领域语料库中使用不同的单词/词性之间确实存在重要的对比,那么来自通用语料库的单词的影响可能是没有好处的,会稀释与领域相关的含义

  • 此外,任何只使用所有文档的子集(领域语料库)的后续训练都将只更新该词/词义子集的向量,以及用于进一步的不可见文档推理的模型的内部权重,其方向仅对领域语料库有意义。这种后期训练的向量可能会被任意地推到与未出现在领域语料库中的其他单词不可比较的对齐之外,并且早期训练的向量将发现自己不再相对于模型后期更新的内部权重进行调整。(确切的程度将取决于后续训练中alphaepochs选择的学习率,以及后续训练在多大程度上优化了模型损失。)

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

如果你看到一个权威的消息来源提出这样的";用一个数据集训练,然后用另一个不相交的数据集"训练";对于Doc2Vec算法,您应该向他们施压,要求他们提供更多关于他们为实现这一点所做的详细信息:确切的代码步骤,以及显示改进的评估。(有某种方法来管理所有问题并非不可能!但我看到了许多模糊的印象,即这种单独的预训练是直接的或有益的,并且没有实际的工作记录,代码和评估指标表明它是有效的。)

关于您在https://stackoverflow.com/a/64865886/130288:

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

我很想看看";文献中的参考文献";他们可能会混淆或谈论Doc2Vec("段落矢量")算法之外的算法。

如果有任何理由给你的领域文档更多的权重,一个更好的方法是在组合语料库中对它们进行过采样。

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

你正确地认识到,alpha参数的选择是一个模糊的领域,它可能主要影响这种附加训练的影响。没有正确的答案,所以你必须寻找并推理出可能有意义的东西。我提到的这种子集后续训练的固有问题可能会使它变得如此,即使你在一些组合中发现了好处,它们也可能更多地是数据&任意参数而不是可推广的实践。

以及:你的具体问题"如果设置这样的值或根本不提供它们是更好的";减少到:";是否要使用默认值,或在创建模型时设置的值">

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

相关内容

  • 没有找到相关文章

最新更新