gensim word2vec 模型能否以联合方式进行训练?

Can a gensim word2vec model be trained in a federated way?

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

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

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

如有任何想法或建议,我们将不胜感激

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

像 word2vec 算法(但不是 Gensim)这样的神经模型已经以 very-distributed/parallel 方式进行了训练——参见示例 'Hogwild' 和相关的后续工作,用于异步 SGD。非常粗略地说,许多独立的并发进程单独和异步训练,但即使没有锁定,也会间歇性地相互更新——而且它工作正常。 (查看之前答案中的更多链接:)

但是:

  • 仍然这样做通常是为了提高性能,并且在高度连接的数据中心内 – 不是为了保持独立数据源的私密性,在可能较少的机构之间 connected/trusting,或者 vocabulary/word-senses
  • 中的数据分片实际上可能非常不同
  • Gensim 从来没有对此提供支持 - 虽然很多年前,在旧版本的 Gensim 中,有人掀起了一个有点像演示,声称通过 Spark 进行这样的 scatter/merge 训练 – 见 https://github.com/dirkneumann/deepdist.

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

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

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

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

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

我很想尝试解决与其他一些信任创建过程或中介的共享问题。 (是否存在每个人都可以暂时信任他们的数据的第 3 方?是否可以创建一个单一的共享训练系统,它可以 将各个数据集流式传输以进行训练,而没有机会 saving/summarizing 完整数据?可能有 4 台云主机,每台都在单独机构的单独管理下,但物理上位于共享设施中,几乎没有任何开销就可以实现上述 'serial turns' 方法?)

还有可能将一个模型映射到另一个模型:将一些共享词作为参考锚点,学习从一个模型到另一个模型的投影,这允许其他非参考点词从一个坐标 space 到另一个。这已被提及作为一种工具,用于使用来自其他地方的向量扩展词汇表(例如 Kiros 等人 'Skip-Thought Vectors' 论文的第 2.2 节)或进行语言翻译(Mikolov 等人 'Exploiting Similarities among Languages for Machine Translation' 论文)。

Gensim 包含一个 TranslationMatrix class 用于学习此类投影。可以想象,这些机构可以选择一个通用数据集,或者一个拥有最大数据集的机构,作为一些规范起始模型的创建者。然后每个机构根据私有数据创建自己的模型。然后,基于一些 'anchor words' 的集合(假定在所有模型中都具有 stable 的含义,可能是因为它们很常见),这些后续模型中的每一个都被投影到规范 space - 允许将每个模型独有的词移动到共享模型中,或者将模型之间差异很大的词投影到相同 space 中的对比点(它可能然后一起平均才有意义)。