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

时间:2017-02-06 22:25:12

标签: haskell random

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

我目前正在努力寻找一种以一般方式改变神经网络权重的方法。目前,我正在尝试将(RandomGen g) => g -> a -> (b,g)形式的随机函数(HMatrix)映射到权重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'') 上。

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

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

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
         }

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

2 个答案:

答案 0 :(得分:10)

我不能说这个问题的神经网络方面(我希望有人发布一些关于这个问题)。从一般的Haskeller看来,看起来你应该在某种随机monad中进行计算。例如,MonadRandom

然后,您的rmap签名会变成:

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

只要查看该签名,您就会发现rmap伪装成traverse

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

答案 1 :(得分:8)

这是Traversable类的用途。 mapAccumL(以及它的前后双胞胎mapAccumR)是一个高阶函数,它捕获一种广义的折叠和映射操作,在可遍历的结构中有状态地工作并转换元素。你的随机映射函数就是这种模式的一个例子 - 正如你所看到的,mapAccumL的类型非常接近你函数的类型:

mapAccumL :: Traversable t => (a      -> b -> (a, c))      -> a      -> t b -> (a, t c)
rmap      ::                  (StdGen -> a -> (b, StdGen)) -> StdGen -> [a] -> ([b], StdGen)

我们可以设置t ~ []a ~ StdGen,这样rmap基本上是mapAccumL的另一个名称,经过一些元组翻转。

rmap f z = swap . mapAccumL (\x y -> swap (f x y)) z