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?
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:
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.
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:
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.