Monoid如何协助并行训练?

dim*_*mid 3 parallel-processing haskell machine-learning monoids

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

Bak*_*riu 13

本文对此进行了解释,该文章链接在您在问题中链接的页面中.既然你想要一个初学者友好的描述,我会在阅读这篇文章后给你一个非常高级别的描述.认为这是观念的一个粗略的概述,了解你到底都必须研究的文章.

基本思想是使用代数属性来避免一遍又一遍地重复做同样的工作.他们通过使用幺半群运算和同态的相关性来做到这一点.

由于两套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不是做:

  • 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)
Run Code Online (Sandbox Code Playgroud)

其中m是已经训练过的模型(通常是该点之前的训练模型),并且d是您为训练添加的新数据点.

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


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