2017-02-06 10 views
7

私は進化的ニューラルネットワークを研究しており、HNNを使っています。私の最初の疑問は、ハスケルに進化的アルゴリズムのフレームワークが既に存在するかどうかです。haskellでfmapにランダムジェネレータを使う関数を使う方法は?

私は現在、一般的な方法でニューラルネットワークの重みを変更する方法を見つけるのに苦労しています。現時点では、HMatrix以上の重みのランダム関数(形式:(RandomGen g) => g -> a -> (b,g))をマップしようとしています。

既存の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'') 

これは私にはハックのように思える、と私はより多くのこのランダム性に対処する方法についていくつかのアドバイスがあるかもしれないより良いhaskellersのいくつかを期待していました効果的に?

答えて

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) 

rmapは基本的に別の名前になるように、私たちは、t ~ []a ~ StdGenを設定することができますmapAccumLの場合は、タプルフリップします。

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

私はこの問題のニューラルネットワーク側について何も言えません(私は誰かがそれについて何かを投稿したいと思っています)。一般的なHaskellerの観点からは、ある種のランダムなモナドの中で計算を行うべきであるように見えます。たとえば、MonadRandomです。

次に、あなたのrmapの署名のようなものに変わる:ちょうどその署名を見て、あなたはrmapが変装してtraverseであることを実現することができる

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

StdGen -> a -> (b,StdGen)のようなものは、ランダムなモナド(IOでさえあります)の場合はa -> m bに変換できます。一度それを見ると、Haskellのモナドユーティリティのフルパワーを使い始めることができます。

関連する問題