HLearn的自述文件指出Monoid类型类用于并行批量训练。我在几个文件中看到过trainMonoid
,但是我很难剖析这个庞大的代码库。有人可以用初学者友好的术语解释它是如何工作的?我想这与关联属性有关。
答案 0 :(得分:13)
在this article中对此进行了解释,该问题在您在问题中链接的页面中进行了链接。由于您需要初学者友好的描述,我将在阅读本文后为您提供我所理解的内容的高级描述。将此视为对该想法的粗略概述,以准确理解您 这些文章的所有内容。
基本思想是使用代数属性来避免一遍又一遍地重复做同样的工作。他们通过使用幺半群运算和同态的相关性来做到这一点。
鉴于两组A
和B
包含两个二元运算+
和*
,同态是一个函数f: A -> B
,使得f(x + y) = f(x) * f(y)
,即它是保留两组之间结构的功能。
在该文章的情况下,函数f
基本上是将输入集映射到训练模型的函数。
所以我的想法是你可以将输入数据划分为不同的部分x
和y
,而不必像T(x + y)
那样计算整个事物的模型。仅针对x
和y
进行培训,然后合并结果: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>
所有这一切中更有趣(也更复杂)的部分是如何你可以将训练任务视为同形等等。我将把它留给你的个人学习。