【问题标题】:Process to intersect with pre-trained word vectors with gensim 4.0.0使用 gensim 4.0.0 与预先训练的词向量相交的过程
【发布时间】:2021-10-04 02:42:06
【问题描述】:

我正在尝试从一个使用旧版本 gensim 的示例中学习。特别是,我有一段代码,如:

word_vectors = Word2Vec(vector_size=word_vector_dim, min_count=1)
word_vectors.build_vocab(corpus_iterable)
word_vectors.intersect_word2vec_format(pretrained_dir + 'GoogleNews-vectors-negative300.bin.gz', binary=True)

我的理解是,这会在可用时用预先训练的词向量填充词向量词汇表。当我的词汇表中的单词不在预训练向量中时,它们会被初始化为随机值。但是,最新版本的 gensim 中不存在 intersect_word2vec_format 方法。在 gensim 4.0.0 中复制此过程的最简洁方法是什么?

【问题讨论】:

    标签: python gensim


    【解决方案1】:

    .intersect_word2vec_format() 方法仍然存在,但作为对一组词向量的操作,已移至KeyedVectors。因此,在某些情况下,在 Word2Vec 模型本身上调用该方法的旧代码将需要在模型的 .wv 属性上调用它,并持有一个 KeyedVectors 对象。例如:

    w2v_model = Word2Vec(vector_size=word_vector_dim, min_count=1)
    w2v_model.build_vocab(corpus_iterable)
    # (you'll likely need another workaround here, see below)
    w2v_model.wv.intersect_word2vec_format(pretrained_dir + 'GoogleNews-vectors-negative300.bin.gz', binary=True)
    

    但是,您仍然会遇到一些问题:

    • 它充其量只是一个实验性的高级功能,而不是任何有据可查的流程的一部分。因此,如果您能够review its source code,并且了解使用此类(部分)预初始化的词向量、可能进一步训练或可能冻结(取决于@ 987654329@ 选择的值)。
    • 同样实验性的vectors_lockf 功能现在在 Gensim 4+ 中需要知识渊博的人手动初始化 - & 因为.intersect_word2vec_format() 假定特定的预分配,该方法将在 Gensim 4.1 中中断而没有明确的解决方法。见this open issue for more details

    最普遍的情况:使用其他词向量进行预初始化充其量是一项繁琐的高级技术,因此请务必研究代码,考虑潜在的权衡,并仔细评估其对最终结果的影响,然后再接受它.这不是一个简单、自动或特征明确的捷径。

    【讨论】:

    • 感谢您提供如此详细的答复。我可以问一个后续问题吗?你说这是一种先进的技术,我相信你。但是,我对这个领域还很陌生,我不清楚这应该是一种先进的技术。拥有经过优化的词向量但在您的语料库中有其他不在预训练词向量中的词向量似乎是完全正常的。你能评论一下什么是特征明确的方法吗?总是从头开始训练向量?我不想做任何高级的事情,而是想学习基础知识。
    • 是的,最典型的方法是从头开始训练。当然,很多人已经实施了各种其他方法来使用先前的向量作为先验,或者尝试将新向量训练到现有空间中。但是在这种情况下——与“微调”的概念相关——有很多可能的方法,以及许多新的权衡需要考虑,没有简单/标准的答案。 (您如何在起始向量的影响和新数据之间选择/调整适当的平衡?您如何确保后来调整的向量与最近调整较少或没有调整的向量保持“兼容”?)
    • 我最初为自己的实验编写了.intersect_word2vec_format() 方法。但是我所有的结果都是好坏参半,我还没有遇到任何完善的解释,因为如何以及何时可以依靠它(或类似技术)来获得必然改进的结果。这一切都高度依赖于专家用户可能采取的具体的、即兴的、谨慎的步骤——在每一步仔细检查他们是否真的得到了预期的好处。 (如果你知道或遇到一篇好的文章,我很乐意看到它——但大多数人只是假设事情在没有可靠分析的情况下工作正常。)
    • 啊哈。据我所知,该笔记本甚至从未执行过Word2Vec 模型训练,而只是借用该类的初始化,然后使用一些GoogleNews 向量的导入,为不同的 深度 CNN 训练。这避免了我的许多担忧,但会导致一些相当间接/不清楚/过度劳累的代码——比如它如何重用 Word2Vec 的随机初始化,但试图通过粗略的幅度检查来猜测它发生在哪里。
    • 不过,如果为 any 其他数据集/分类任务调整该代码,我不会假设笔记本断言 use_pretrained,“收敛速度更快,并且绝对精度略高”是正确的。它可能非常偶然,因此重用(某些)GoogleNews 向量的额外步骤可能是时间/空间/代码复杂性,没有净收益。
    猜你喜欢
    • 2015-02-12
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 2018-11-27
    • 2020-06-02
    • 2017-12-15
    • 2021-10-14
    • 2021-10-20
    相关资源
    最近更新 更多