Monoid如何协助并行训练?

时间:2016-10-09 12:19:51

标签: haskell machine-learning parallel-processing monoids

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

1 个答案:

答案 0 :(得分:13)

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

这里使用monoids:您可以先将域拆分为子集,然后在这些子集上计算T,然后计算交叉验证的结果,您可以将相应子集的结果放在一起。

提出一个想法:如果数据是{1,2,3,4}k = 3而不是:{/ p>

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

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

通过操作和同态的相关性来确保最终结果的正确性。

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

关于在线培训算法,我们的想法是给定一个"批次"训练算法T您可以通过以下方式将其变为在线算法:

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

其中m是已经过训练的模型(通常在此之前将是经过训练的模型),而d是您为训练添加的新数据点。

同样,结果的准确性是由于同态性告诉您,如果m = T(x)然后m * T(d) = T(x+d),即在线算法给出与所有这些数据点相同的批处理算法结果。 / p>

所有这一切中更有趣(也更复杂)的部分是如何你可以将训练任务视为同形等等。我将把它留给你的个人学习。