如何在 Haskell 中随时间对系统建模

How to model system over time in Haskell

我正在尝试在 Haskell 中实现某种神经网络。该网络具有时间感知能力,因此时间步长是其功能的重要组成部分。不需要太多细节,我对 运行 网络随时间推移的一般实现是:

foldM stepNetwork initialNetwork (zip images labels)

这个想法是每个时间步生成一个新网络,该网络又学习了一对 image/label。然而,这种方法会导致一些粗糙的数据结构试图记住以前网络中的东西。这是我的隐藏层结构:

data HiddenLayer = HiddenLayer { hResponse    :: Response
                               , hOldResponse :: Response
                               , hNeurons     :: [YNeuron]
                               } deriving Show

我当前的 stepNetwork 函数类似于:

stepNetwork (Network x y z) = Network newX newY newZ
  where
    newX = stepLayer x (hOldResponse y)
    newZ = stepLayer z (hOldResponse y)
    newY = stepLayer y (currentResponse newX) (currentReponse newZ)

我不想在网络中携带旧的响应。这里是网络中各层之间的关系,其中X、Y、Z为三层。

由于它对时间敏感,FRP 似乎是对这种关系建模的好方法,但我只是不确定如何在 FRP 范例中对此建模。有什么建议吗?

观察输入向量 x 并具有状态 h 的循环神经网络 f 的架构是

f :: h -> x -> h

正如您已经观察到的,如果它有一些副作用或输出,您可以将其建模为

f :: h -> x -> m h

和运行它与foldM f。另一个典型的做法是训练一个输出层,它从 h 产生输出 o,或者是一个单独的网络 g :: h -> o

f :: h -> x -> (h, o)

相当于f :: x -> State h o;如果有副作用,那就是 f :: x -> StateT m h o.

训练网络相当于学习函数 f,在某些情况下学习类型 h。循环网络在所有时间步都使用相同的函数 f学习 过去的哪些特征需要在 h 中记住是训练的工作。您不需要 "some gross data structures attempting to remember things from previous networks",网络学会使用 h 来记住之前时间步长的相关内容。

任何网络或监督训练机制都可用于实施和学习f

如果您使用卷积而不是循环神经网络,那么您将需要记住卷积作用的 window 时间。执行此操作的简单方法是将整个 window 呈现为输入向量 x'。在这两种情况下,您都没有明确存储网络实施中的任何历史记录 f。卷积网络不一定会看到从较早的时间步向前推进的状态,它可能是一个函数 f :: x' -> o.


我认为您正在尝试更深入,因为您同时展示了图像和标签(我认为这是监督学习的示例)。如果您想从一组已知示例中训练 f,那么您不需要建模 从一系列经验中学习

如果您想建模从一系列经验中学习,您将拥有机器训练 t 的状态 f,以及函数 t -> typeOf(f)。机器训练的类型 f 将取决于机器与现实世界的连接方式。如果现实世界不能可靠地重复经验,机器将想要记住以前的经验(尤其是 f 表现不佳的经验),以便它可以将这些经验呈现给 f 以进行额外训练。围绕着学习的东西 f 的机器应该会给 f 噩梦。它可能想要记住一些经验 f 做得很好,以确保它不会失去现有的性能,在这种情况下 f 可以享受一些愉快的梦想。

在任何情况下,记住以前的经历都不是f的工作。


您想更深入一点吗?如果训练机器需要学习如何训练 f 之类的东西,它将针对问题家族进行训练,例如 f 正在学习的问题。训练机器的参数将在问题之间共享,机器将学习要记住哪些东西。在某种程度上,机器可能会自我监督,而这种学习不良参数并卡住的机器将被一些破坏无能机器的更大的选择系统淘汰。