1

我试图找出如何以联合方式训练 word2vec 模型。

数据将被分成多个部分,例如 4 个“机构”,我想分别根据每个机构的数据训练 word2vec 模型。他们这里的关键限制是来自机构的数据不能移动到另一个位置,因此永远不能以集中的方式进行训练。

我知道可以迭代地训练 word2vec 模型,以便读取来自第一个机构的数据并用于训练和更新 word2vec 模型,但我想知道是否可以在所有四个机构上同时进行,然后,例如,将所有四个 word2vec 模型合并为一个模型。

任何想法或建议表示赞赏

4

1 回答 1

1

Gensim 没有官方支持,因此任何方法都会涉及大量定制研究类创新。

像 word2vec 算法(但不是 Gensim)这样的神经模型已经以非常分布式/并行的方式进行了训练——例如,参见“Hogwild”和相关的后续工作,用于异步 SGD。非常粗略地说,许多单独的同步进程分别和异步地训练,但即使没有锁定,也会间歇性地相互更新——它工作正常。(在之前的答案中查看更多链接:https://stackoverflow.com/a/66283392/130288。

但:

  • 仍然这通常是为了性能,以及在高度连接的数据中心内 -不是为了保持单独的数据源的私密性,在可能不太连接/信任的机构之间,或者数据碎片实际上可能非常不同的地方词汇/词义
  • Gensim 从未对此提供支持 - 尽管多年前,在较旧版本的 Gensim 中,有人制作了一个类似演示,声称通过 Spark 进行这种分散/合并训练 - 请参阅https://github.com/dirkneumann /深度

所以:这是一个项目可以尝试模拟或在实践中测试的东西,尽管跨“机构”更新的额外滞后/等可能使其不切实际或无效。(而且,他们仍然必须在最初就共享词汇表达成共识,如果不小心就会泄露每个人的数据的各个方面。)

正如您所注意到的,您可以考虑一种方法,其中每个人轮流训练一个共享模型,这可以非常接近地模拟单个训练,尽管有传递中间模型的开销,并且没有并行性。大致:

  • 共享字数以达成单一共识词汇
  • 对于每个预期的训练时期,每个机构将在其整个数据集上训练一次,然后将模型传递给下一个机构
  • 调用.train()将手动管理项目计数和alpha相关值以模拟一次 SGD 运行

请注意,每个机构仍然会有一些关于术语相对共现的提示,这会泄露一些关于他们的私有数据集的信息——也许最明显的是罕见的术语。

不过,如果您不着急,那最好模拟单个集成模型训练。

我很想尝试通过其他一些创建信任的过程或中介来解决共享问题。(是否有第 3 方可以暂时信任他们的数据?是否可以创建一个共享训练系统,该系统只能将单个数据集流式传输以进行训练,而没有机会保存/汇总完整数据?可能有 4 个云主机,每个都在单独的机构的单独管理下,但实际上在共享设施中,几乎没有任何开销影响上述“串行轮流”方法?)

还有可能将一个模型映射到另一个模型:将许多共享词作为参考锚点,学习从一个模型到另一个模型的投影,这允许其他非参考点词从一个坐标空间移动到其他。这被认为是一种工具,用于使用来自其他地方的向量扩展词汇表(例如,Kiros 等人的“Skip-Thought Vectors”论文的第 2.2 节)或进行语言翻译(Mikolov 等人的“利用机器翻译语言之间的相似性” ' 纸)。

Gensim 包含一个TranslationMatrix用于学习此类预测的课程。可以想象,这些机构可以选择一个通用数据集,或者一个拥有最大数据集的机构,作为一些规范起始模型的创建者。然后每个机构根据私人数据创建自己的模型。然后,基于一组“锚词”(假设在所有模型中都具有稳定的含义,可能是因为它们非常常见),每个后续模型都被投影到规范空间中——允许每个词都是唯一的模型被移动到共享模型中,或者在模型之间变化很大的单词被投影到同一空间中的对比点(然后将它们平均在一起可能是有意义的)。

于 2021-09-07T05:53:42.917 回答