我正在研究进化神经网络,并且正在使用HNN.我的第一个问题是Haskell中是否存在任何进化算法框架,因为我无法找到任何?
我目前正在努力寻找一种以一般方式改变神经网络权重的方法.目前,我正试图(RandomGen g) => g -> a -> (b,g)在HMatrix权重上映射一个随机函数(形式的).
我想要一种通用的方法来修改现有的fmap(或fold?)来使用随机函数(如果可以的话).例如,我可能有一个函数可能会或可能不会在其输入中添加一些高斯噪声,并希望将其应用于整个网络.我遇到的问题是如何使用随机数生成器.
对于地图,我目前正在执行以下操作:
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'')
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎是一个黑客,我希望一些更好的haskellers可能会对如何更有效地处理这种随机性提出一些建议?
Ale*_*lec 10
我不能说这个问题的神经网络方面(我希望有人发布一些关于这个问题).从一般的Haskeller看来,看起来你应该在某种随机monad中进行计算.例如,MonadRandom.
然后,你rmap的签名就变成了:
rmap :: MonadRandom m => (a -> m b) -> [a] -> m [b]
Run Code Online (Sandbox Code Playgroud)
只要看看那个签名,你就会发现这rmap是traverse伪装的.
这里要识别的关键模式是,看起来像的东西StdGen -> a -> (b,StdGen)可以转换a -> m b为随机monad(甚至可能是IO).一旦你看到了,你就可以开始使用Haskell的monad实用程序的全部功能了.
这就是Traversable班级的用途.mapAccumL(以及它的从前到后的双胞胎mapAccumR)是一个高阶函数,它捕获一种广义的折叠和映射操作,在可遍历的结构上有状态地工作并转换元素.你的随机映射函数是这种模式的一个例子 - 正如你所看到的,mapAccumL's类型非常接近你的函数类型:
mapAccumL :: Traversable t => (a -> b -> (a, c)) -> a -> t b -> (a, t c)
rmap :: (StdGen -> a -> (b, StdGen)) -> StdGen -> [a] -> ([b], StdGen)
Run Code Online (Sandbox Code Playgroud)
在一些元组翻转之后,我们可以设置t ~ []和a ~ StdGen,这rmap基本上是另一个名称mapAccumL.
rmap f z = swap . mapAccumL (\x y -> swap (f x y)) z
Run Code Online (Sandbox Code Playgroud)