haskell - 如何在haskell中使用带有fmap的随机生成器使用函数?

标签 haskell random

我正在研究进化神经网络,并且正在使用 HNN。我的第一个问题是 Haskell 中是否已经存在任何进化算法框架,因为我找不到任何?

我目前正在努力寻找一种以一般方式改变神经网络权重的方法。目前,我正在尝试在 (RandomGen g) => g -> a -> (b,g) 上映射一个随机函数(形式为 HMatrix )的重量。

我想要一种通用的方法来修改现有的 fmap(或折叠?)以利用随机函数(如果可以的话)。例如,我可能有一个函数可能会或可能不会在其输入中添加一些高斯噪声,并希望将其应用于整个网络。我遇到的问题是如何使用随机数生成器。

对于 map ,我目前正在执行以下操作:

rmap :: (StdGen -> a -> (b,StdGen)) -> StdGen -> [a] -> ([b],StdGen)
rmap _ g [] = ([],g)
rmap f g (x:xs) = let (mapped, g') = rmap f g xs
                      (rVal, g'')  = f g' x
                   in (rVal:mapped, g'')

这对我来说似乎是一个黑客,我希望一些更好的haskellers可能对如何更有效地处理这种随机性有一些建议?

最佳答案

关于这个问题的神经网络方面,我不能说任何话(我希望有人对此发表一些评论)。从一般 Haskeller 的角度来看,您似乎应该在某种随机单子(monad)中进行计算。例如, MonadRandom .

然后,您的 rmap的签名变成了这样的东西:

rmap :: MonadRandom m => (a -> m b) -> [a] -> m [b]

看看那个签名,你可能会意识到 rmap traverse 变相。

这里要识别的关键模式是看起来像 StdGen -> a -> (b,StdGen) 的东西。可以转化为a -> m b对于随机单子(monad)(甚至可能是 IO )。一旦你看到了,你就可以开始使用 Haskell 的 monad 实用程序的全部功能了。

关于haskell - 如何在haskell中使用带有fmap的随机生成器使用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42078395/

相关文章:

haskell - 如何创建一个事件,其中包含当前刻度的值与前一个刻度的值之间的差异?

list - 如何使用随机选择对 Haskell 中的列表进行洗牌

algorithm - 水库取样

C#概率和随机数

haskell - Eta reduce 和 DuplicateRecordFields 语言扩展

haskell - Coyoneda 没有更高等级的类型,但实际上它是什么类型?

c - 我应该如何构造随机质询以进行质询-响应身份验证?

random - 如何随机化一个非常大的内存的内容?

algorithm - 在 Haskell 中合并排序的输入?

performance - 为什么添加多态类型签名会降低性能?