Wie benutze ich eine Zufallsgenerator-Funktion mit fmap in haskell?

7

Ich forsche mit evolutionären neuronalen Netzen und verwende HNN. Meine erste Frage ist, ob es in Haskell bereits evolutionäre Algorithmen-Frameworks gibt, da ich keine finden konnte?

Ich bin gerade dabei, einen Weg zu finden, die Gewichte des neuronalen Netzwerks auf eine allgemeine Art zu verändern. Im Moment versuche ich eine zufällige Funktion (in der Form (RandomGen g) => g -> a -> (b,g) ) über die HMatrix der Gewichte zu mappen.

Ich möchte eine verallgemeinerbare Möglichkeit, eine existierende fmap zu modifizieren (oder falten?), um eine zufällige Funktion zu benutzen, wenn es möglich ist. Zum Beispiel könnte ich eine Funktion haben, die ihrer Eingabe etwas Gauß'sches Rauschen hinzufügt, und möchte, dass dies für das gesamte Netzwerk gilt. Das Problem, das ich habe, ist, wie man mit den Zufallszahlengeneratoren arbeitet.

Für die Karte mache ich derzeit folgendes:

%Vor%

Das scheint mir ein Hack zu sein, und ich hatte gehofft, dass einige der besseren Haskeller einen Rat bekommen könnten, wie sie mit dieser Zufälligkeit besser umgehen können?

    
Eric Klinkhammer 06.02.2017, 22:25
quelle

2 Antworten

8

Dies ist die Traversable Klasse. mapAccumL (zusammen mit seinem Back-to -front twin mapAccumR ) ist höher -Order-Funktion, die eine Art verallgemeinerte Falte-und-Map-Operation erfasst, die übergreifend über eine verfahrbare Struktur arbeitet und die Elemente transformiert. Ihre randomisierte Mapping-Funktion ist ein Beispiel für dieses Muster - wie Sie sehen, stimmt der Typ von mapAccumL ziemlich genau mit dem Typ Ihrer Funktion überein:

%Vor%

Wir können t ~ [] und a ~ StdGen setzen, so dass rmap im Grunde genommen ein anderer Name für mapAccumL ist, nach einigen Tupel-Flips.

%Vor%     
Benjamin Hodgson 06.02.2017, 22:51
quelle
10

Ich kann nichts über die neuralen Netzwerke dieses Problems sagen (ich hoffe, dass jemand etwas dazu schreibt). Aus der Perspektive von Haskeller scheint es, als müssten Sie Ihre Berechnungen in einer Art zufälliger Monade durchführen. Zum Beispiel MonadRandom .

Dann wird die Signatur von rmap zu etwas wie:

%Vor%

Wenn Sie sich diese Signatur anschauen, werden Sie vielleicht feststellen, dass rmap traverse verkleidet.

Das Schlüsselmuster, das hier erkannt wird, besteht darin, dass Dinge, die wie StdGen -> a -> (b,StdGen) aussehen, in a -> m b für eine zufällige Monade umgewandelt werden können (möglicherweise sogar IO ). Sobald Sie das sehen, können Sie die volle Leistung von Haskells Monad Utilities nutzen.

    
Alec 06.02.2017 22:46
quelle

Tags und Links