Monoid如何辅助并行训练?

How does Monoid assist in parallel training?

HLearn 的自述文件指出 Monoid 类型类用于并行批处理训练。我在几个文件中看到 trainMonoid,但我很难剖析这个庞大的代码库。有人可以用初学者友好的方式解释它是如何工作的吗?我想这与结合性 属性.

有某种关系

它在 this article 中有解释,它链接在您在问题中链接的页面中。既然你想要一个初学者友好的描述,我会给你一个非常高层次的描述,说明我在阅读这篇文章后的理解。将此视为对想法的粗略概述,以准确理解您 拥有的 研究 文章的所有内容。

基本思想是使用代数性质来避免一遍又一遍地重新做同样的工作。他们通过使用幺半群运算和同态的结合性来做到这一点。

给定两个集合 AB 以及两个二元运算 +* 同态是一个函数 f: A -> B 使得 f(x + y) = f(x) * f(y),即它是一个保留两组之间结构的函数。 在那篇文章中,函数 f 基本上是将输入集映射到训练模型的函数。

所以我们的想法是,您可以将输入数据分成不同的部分 xy,而不必像 T(x + y) 那样计算整个事物的模型您可以只对 xy 进行训练,然后合并结果:T(x) * T(y).

现在这并没有多大帮助但是,在训练中你经常重复工作。例如,在交叉验证中,您在 k 次中将数据采样到训练器的一组输入和用于测试训练器的一组数据中。但这意味着在这些 k 次迭代中,您要对输入的相同部分多次执行 T

这里幺半群开始发挥作用:你可以首先将域分成子集,并在这些子集上计算 T,然后计算交叉验证的结果,你可以将相应的结果放在一起子集。

给出一个想法:如果数据是 {1,2,3,4}k = 3 而不是做:

  • T({1,2}) 加测试 {3, 4}
  • T({1,3}) 加测试 {2, 4}
  • T({1,4}) 加测试 {2, 3}

在这里你可以看到我们训练了 3 次 1。使用同态我们可以计算T({1}) 一次然后将结果与其他部分结果结合以获得最终的训练模型。

最终结果的正确性由运算的结合性和同态性保证。

并行化时可以应用相同的想法:将输入分成 k 组,并行执行训练,然后合成结果:T(x_1 + x_2 + ... + x_k) = T(x_1) * T(x_2) * ... * T(x_k) 其中 T(x_i) 调用完全并行执行,只有在最后才需要复合结果。

关于在线训练算法,想法是给定一个 "batch" 训练算法 T 你可以通过以下方式将其变成在线训练算法:

T_O(m, d) = m * T(d)

其中 m 是一个已经训练好的模型(通常是那个时候的训练模型),d 是您为训练添加的新数据点。

结果的准确性再次归因于告诉你如果 m = T(x)m * T(d) = T(x+d) 的同态,即在线算法给出与所有这些数据点的批处理算法相同的结果.


所有这一切中更有趣(和复杂)的部分是如何你能把训练任务看作是同态等。我会把它留给你的个人研究.