我正在研究进化神经网络,并且正在使用 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/