【问题标题】:Word Vectors Transfer Learning词向量迁移学习
【发布时间】:2022-01-04 05:18:42
【问题描述】:

我想调整已经存在的词向量(例如来自 Spacy)并在一组相当有限的特定领域数据上重新训练它们。问题是我无法找到一种方法来获取已经训练好的向量并使它们适应我的新数据。 到目前为止,我一直在使用 gensim,但它似乎并没有像我预期的那样工作。

以下是我与 gensim 一起使用的代码,但我也将感谢任何使用 gensim 以外的东西的提示。

# illustrative example, I am using data from a textbook for the real application
training_data = [['This', 'is', 'an', 'example'],['for', 'new', 'training', 'data']]  

# build a word2vec model on your dataset
base_model = Word2Vec(size=300, min_count=1)
base_model.build_vocab(training_data)
total_examples = base_model.corpus_count


# add GloVe's vocabulary & weights
base_model.build_vocab([list(glove_vectors.vocab.keys())], update=True)
#base_model.build_vocab([list(glove_vectors.index_to_key)], update=True)

# already trained spacy vectors of dim=300
base_model.intersect_word2vec_format('spacy_vecs.txt', binary=False, lockf=1.0)

# train on your data
print("Running ", base_model.epochs, "iterations")
base_model.train(training_data, total_examples=total_examples, epochs=100,  compute_loss=True, callbacks=[callback()])
base_model_wv = base_model.wv

base_model.wv.save_word2vec_format('retrained_vectors.txt', binary=False)

事后检查词向量不会产生有意义的结果,所以这里一定有问题。

这是在 Python 2.7 中完成的,因为较新的 gensim 版本似乎不再支持此功能。

【问题讨论】:

  • 哪种特定的 SpaCy 型号?请给它命名并链接到它的主页。另外,如果这真的是关于 SpaCy,为什么要标记为斯坦福 NLP?你能修复标签吗?
  • 我不明白 “这是在 Python 2.7 中完成的,因为较新的 gensim 版本 [which?] 似乎不再支持此功能 [which?]” Python 2.x 已死并被埋葬。哪个gensim版本?你真的应该弄清楚是什么阻止你在 3.x 上运行。
  • 具体的Model不是那么重要,因为我只取词向量(我也想试试其他词向量)。

标签: python python-2.7 nlp gensim word2vec


【解决方案1】:

一方面,您应该能够让.intersect_word2vec_format() 方法在最新的Gensim 中工作,并在open issue 3094 中提到了一些关于其错误的解决方法。

但另一方面,该方法是一种实验性的高级功能,没有很好的使用指南。更一般地说,使用 Gensim 微调现有向量并不是一个得到很好支持的操作。没有标准方法或最佳实践。我从来没有见过一个好的文章来展示一个可靠的方法来做到这一点。 (我见过一堆关于玩具数据的糟糕文章,它们忽略或摆布潜在问题,并且很少深入检查他们正在尝试的方法是否有帮助。)

这需要大量的新研发,并且可能需要对相关的 Gensim 类进行一些添加和重构,以使其成为一个可靠的过程。

因此,我建议不要使用这种方法,除非绝对需要,或者您想要在某个领域进行一些深入的原创实验和开发,并且已经可以研究或直觉所涉及的所有困难权衡。 (即:超出 SO 答案所能提供的范围。)

我怀疑对于几乎所有想要这样做的人来说,最好扩展他们的训练语料库,使用其他使用相似词义的文本内容以及所需的额外词。例如,与其尝试将您的领域词移植到其他人在*上训练的词模型中,不如尝试将您的文本与*文本混合,并训练一个新模型。 (你可能会通过重复它们来增加你有限的文本,随机散布在语料库中。)

这应该会导致一个更直接的过程,更不容易出错或需要新的实验,尽管需要更多的训练时间。

【讨论】:

  • 非常感谢您的回答!几个月来我一直在为我的论文努力解决这个问题,该论文最初应该比较从头开始训练的两种方法和特定领域的迁移学习,但似乎整个迁移学习都不起作用。我还阅读了一些论文,其中两个向量被转移到同一个空间中,但这在理论上似乎并不容易。我想我得稍微修改一下我的论文:D
  • 我的印象是,关于词向量,您尝试的过程通常被称为“微调”而不是“迁移学习”(我在更深层次的模型中更常见)。如前所述,没有明确的“标准”或“最佳”方式来进行微调——但有一些学术论文,如果你选择了准确的论文,然后尝试完全按照他们的方法,你可能会有更清晰的前进道路.
  • 特别是,他们可能已经讨论了他们方法的动机和权衡,以及他们自己的评估方法,&您可以准确地参考他们的方法(通过他们的论文/作者身份)。但是,如果他们没有提供代码——无论是从头开始,还是通过改编 Gensim 代码——重新实现他们的方法可能是一个更大的编码项目。
  • OTOH,从不太成熟的 Gensim 代码中拼凑出一些东西,以及片状的在线示例——这似乎是导致你的问题的路径——这显然不是其他研究人员所说的“转移”的意思学习”或“微调”更普遍。因此,除非您最终炮制并捍卫自己的自己的改进方法,否则继续走这条即兴之路,结果可能不会说很重要。
  • 听起来有点刺耳,但我会把它作为建议。你看,我根本不是那个领域的专家,因此我坚持使用我能找到的与交给我的任务相关的一小部分示例(“使用 word2vec 和 glove 进行迁移学习)。但我不是不愿尝试新方法。