单子在并行训练中有什么作用?

6

HLearn 的 Readme 表明,Monoid 类型类用于并行批量训练。我在几个文件中看到了 trainMonoid 的提及,但是我很难理解这个庞大的代码库。有人能以初学者友好的方式解释一下它是如何工作的吗?我猜它与结合性属性有关。

1个回答

18

这在此文章中解释了,该文章链接在您提问的页面中。由于您需要一个适合初学者的描述,我将为您提供一个非常高层次的描述,这是我在阅读文章后理解的粗略概述。请将其视为该想法的概览,要完全理解所有内容,您必须学习这些文章。

基本思想是使用代数属性避免重复工作。他们通过使用单调操作和同态的结合性来实现。

给定两个集合AB,带有两个二元运算+*,同态是一个函数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在相同的输入部分上。
这时单子群就发挥作用了:您可以先将域拆分为子集,并在这些子集上计算T,然后为了计算交叉验证的结果,您只需将相应子集的结果组合在一起即可。
举个例子:如果数据是{1,2,3,4},并且k = 3,而不是执行:
  • {3,4}上对T({1,2})进行测试
  • {2,4}上对T({1,3})进行测试
  • {2,3}上对T({1,4})进行测试

从这里可以看出,我们训练了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),即在线算法与所有这些数据点的批量算法给出相同的结果。


这其中更有趣(也更复杂)的部分是如何将训练任务视为同态映射等。我将把这留给您个人研究。

很好的第一个回答。 - MikeJRamsey56

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接