- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
HLearn 的自述文件指出 Monoid 类型类用于并行批量训练。我在几个文件中看到了 trainMonoid
,但我很难剖析这个巨大的代码库。有人可以用初学者友好的术语解释它是如何工作的吗?我猜这与关联性属性有某种关系。
最佳答案
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
多次对输入的相同部分进行操作。
这里幺半群开始发挥作用:您可以首先将域拆分为子集,然后计算 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)
哪里m
是一个已经训练过的模型(通常是该点之前训练过的模型)并且 d
是您为训练添加的新数据点。
结果的准确性再次取决于同态,它告诉您如果 m = T(x)
然后m * T(d) = T(x+d)
,即在线算法对所有这些数据点给出与批处理算法相同的结果。
这一切中更有趣(也更复杂)的部分是如何将训练任务视为同态等。我将把它留给你个人研究。
关于haskell - Monoid 如何协助并行训练?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39943545/
也许这些陈述都不是绝对精确的,但是单子(monad)通常被定义为“内仿函数类别中的一个幺半群”; Haskell Alternative 被定义为“应用仿函数上的幺半群”,其中 applicative
Applicative 是一个 Monoidal Functor : mappend :: f -> f -> f $ :: (a -> b) -> a ->
假设我有一个函数列表 E => Either[Exception, Unit] 在事件 E 上调用并累积错误以返回 Either[List [异常(exception)],单位]。 type Even
在 Scala 函数式编程一书中,我看到了以下签名: def productMonoid[A,B](A: Monoid[A], B: Monoid[B]): Monoid[(A,B)] 描述是这样说的
从下面的例子中,我认为说 String 在串联操作下定义了一个幺半群是正确的,因为它是一个关联二元操作,而 String 恰好有一个标识元素,它是一个空字符串 "" 。 scala> ("" + "J
Typeclassopedia提出以下练习: Implement pure and () in terms of unit and (**), and vice versa. 这是Monoidal和M
从下面的例子中,我认为说 String 在串联操作下定义了一个幺半群是正确的,因为它是一个关联二元操作,而 String 恰好有一个标识元素,它是一个空字符串 "" 。 scala> ("" + "J
我之前定义了一个函数,它接受一个列表 Maybe s 并将其变成 Maybe一个列表,像这样: floop :: [Maybe a] -> Maybe [a] floop [] = Just [] f
HLearn 的自述文件指出 Monoid 类型类用于并行批量训练。我在几个文件中看到了 trainMonoid ,但我很难剖析这个巨大的代码库。有人可以用初学者友好的术语解释它是如何工作的吗?我猜这
假设我有如下的 Monoid 特征: trait Monoid[A] { def combine(a1: A, a2: A): A def identity: A } 现在如果我想为此写一个
在 haskell IO 类型中有 Monoid 的实例: instance Monoid a => Monoid (IO a) where mempty = pure empty 如果我有三
trait Monoid[A] { def op(a1: A, a2: A): A def zero: A } def mapMergeMonoid[K, V](V: Monoid[V]):
我正在研究这个 Functional Programming in Scala练习: // But what if our list has an element type that doesn't
我试图以更实际的方式理解 monads 和 monoids 之间的关系。如果这个问题没有意义,我提前道歉,我仍在挣扎。 假设例如,我有: trait Monoid[T] { def zero: T
我想写一个方法mergeKeys将值分组在 Iterable[(K, V)] 中由 key 。例如,我可以写: def mergeKeysList[K, V](iter: Iterable[(K,
我正在阅读一本书,内容如下: sealed trait Currency case object USD extends Currency ... other currency types case
我在具有 SceneGraph 类型字段“_scene”的记录上使用下面的代码。我使用 makeLenses 为它创建了镜头。 inputGame :: Input -> Game -> Game i
我有一个数据类型是 Monoid 的实例所以我可以得到很好的值(value)观组合: data R a = R String (Maybe (String → a)) instance Monoid
根据定义或幺半群,二元运算符必须是关联的,例如A op (B op C) == (A op B) op C . base mconcat definition在 haskell 是: mconcat
这个问题在这里已经有了答案: Why MonadPlus and not Monad + Monoid? (4 个回答) 6年前关闭。 我对 Monads 和 Monoids 都很陌生,最近还了解了
我是一名优秀的程序员,十分优秀!