gpt4 book ai didi

haskell - 如何在 Haskell 中有效地实现通用神经网络?

转载 作者:行者123 更新时间:2023-12-03 15:30:03 25 4
gpt4 key购买 nike

神经网络实际上只是一个带有许多参数的巨大函数,因此您可能认为用函数式语言编写这样的函数会很漂亮,但是在为其他语言编写了一些 NN 库之后,我对如何编写有一定的疑问在这个范例中有效地实现它们。

传递信息:如果你绘制每个神经元或层的依赖关系图,你会得到这样的结果

enter image description here

在哪里 x 是输入,是输出。虽然它在图中看起来很简单,但如果你真的将网络视为一个函数,那么 必须将输入(加上权重参数的子集)传递给 g1 g2 , 他们每个人都必须将这些传递给 h1 , h2 h3 谁最终将结果发送到上面的层。考虑到输入集加上权重集可能是一千个或更多变量,这看起来非常低效。在其他语言中,您不必这样做,因为每个神经元都可以保留它的参数,并且输入可以直接传递到输入层。

州:如果您查看图表, g1 g2 将单独调用 h2 , 但自从 h2 必须为两者产生相同的值,计算其输出两次是没有意义的。由于你没有状态或副作用,这变得很棘手,如果你有一个非常庞大的网络,那么即使有一些并行计算,这也会浪费很多时间。

最后,当我说网络是 通用 ,我的意思是它可以具有任意形状,只要它的结构不包含循环。我见过的大多数库都使用一堆层,因此您只需定义层数和每层中的神经元数,但它的形状是线性图;这对于简单的应用程序来说很好,但真正的硬核东西需要具有更复杂架构的网络

我想要一些关于如何解决这些问题的建议,因为我想根据自己的需要实现一个库。

注:

我对语言并不完全陌生。我使用了相当多的 Functor 和 Monad(主要在我的基于 haskells API 的 C# FP 库中),但我之前从未将 haskell 用于真正的应用程序。

更新
State monad 似乎很有前途!

最佳答案

我的意思是,由于 Haskell 具有相互递归,因此编写您构建的图形的最简单方法可能是使用一个大的相互递归 where 子句:

run_graph x = run_f g1 g2 where
g1 = run_g1 h1 h2
g2 = run_g2 h2 h3
h1 = run_h1 x
h2 = run_h2 x
h3 = run_h3 x

通过赋予这些数字比 Double 更丰富的类型您可以构建一种与图相对应的抽象数据结构,然后您可以在其上使用反向传播。

您可能不必担心过早地优化图形以进行评估:Haskell 会自动缓存函数输入的答案;这是可能的,因为在 Haskell 中,函数不应该有副作用。很有可能当您的 run_*函数在数据结构中创建抽象节点, eval_g1 h2 h3最终将使用 eval_h2 x 中的缓存值当你跳回 h2 .如果这变得太乏味,那么您可能仍然可以切换到携带 IntMap 的节点的广度优先遍历。状态,在你必须明确开始指定层和传播之前 Data.Array.Unboxed是通过图形的层。

关于haskell - 如何在 Haskell 中有效地实现通用神经网络?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26092063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com