2017-02-06 68 views
7

Ben evrimsel sinir ağları ile araştırıyorum ve HNN kullanıyorum. Benim ilk sorum şu ki, Haskell'de herhangi bir evrimsel algoritma çerçevesi var mı? nasıl Haskell fmap ile rastgele jeneratörü kullanan işlevini kullanmak için?

Şu anda genel bir şekilde nöral ağın ağırlıkları mutasyona için bir yol bulmak mücadele ediyorum. Şu anda, ben ağırlıkların HMatrix üzerinde (formun (RandomGen g) => g -> a -> (b,g) arasında) rasgele fonksiyonu eşleştirmek için çalışıyorum.

varolan fmap değiştirmek (ya da katlama?) Yapılabilir eğer rastgele bir fonksiyonu faydalanmak için bir genellenebilir şekilde istiyoruz. Örneğin, ben ya da girişine bazı Gauss gürültü eklemek olmayabilir ve bu ağın tamamına uygulamak istiyoruz bir işlevi olabilir. Sorun şu ki, rasgele sayı üreteçleriyle nasıl çalışacağım.

haritası için, Şu anda yapıyorum şu:

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'') 

Bu benim için kesmek gibi görünüyor ve ben daha bu rastgelelik nasıl başa bazı tavsiyelerde olabilir daha iyi haskellers bazı umuyordum etkili bir şekilde?

cevap

8

Traversable sınıfının anlamı şudur. mapAccumL (önden arkaya ikizle birlikte mapAccumR), bir çapraz genelleme yapısına sahip olan ve öğeleri dönüştüren, bir tür genelleştirilmiş harita ve harita çalışmasını yakalayan bir üst düzey işlevdir. Sizin randomize haritalama fonksiyonu bu modelinin bir örneğidir - Gördüğünüz gibi, mapAccumL 'ın tipi oldukça yakından fonksiyonun türüne uygun: rmap temelde başka bir isim olacak şekilde,

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

Biz t ~ [] ve a ~ StdGen ayarlayabilirsiniz mapAccumL için, bazı tuple saygısız sonra.

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

Bu sorunun sinir ağları hakkında bir şey söyleyemem (umarım birisi bunun hakkında bir şeyler yayınlar). Genel bir Haskeller'in bakış açısına göre, bir çeşit rastgele monad içinde hesaplamanız gereken gibi görünüyor. Örneğin, MonadRandom.

Ardından, rmap imzası gibi bir şey dönüşür:

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

Sadece o imza bakarak, sen rmap kılık değiştirmiş traverse olduğunu fark edebilir.

burada tanımak için anahtar desen StdGen -> a -> (b,StdGen) gibi görünen şeyler (yani hatta IO olabilir) rastgele monad için a -> m b dönüştürülebilir olmasıdır. Bunu gördükten sonra, Haskell'in monad yardımcı programlarının tam gücünü kullanmaya başlayabilirsiniz.