Functional programming 函数式编程中的大数据结构

Functional programming 函数式编程中的大数据结构,functional-programming,Functional Programming,我是函数式编程的新手 我有一个巨大的神经网络,有数千个神经元,神经元之间的每一个连接都有它的权重。我必须经常更新这些权重,每次学习几千次 FP在这里仍然适用吗?我的意思是,在fp中,我们不能修改变量,只能返回新变量,而不能更改以前的值。这是否意味着我必须在每次重量更新时重新创建整个网络?查看单子中哪些包含可变变量 您不必在每次发生权重更新时重新创建整个网络。据推测,您的神经元被建模为单个对象-这意味着要“更新”单个神经元,您实际上将创建一个具有更新权重的新神经元。然后,这个神经元将被插入到网络中

我是函数式编程的新手

我有一个巨大的神经网络,有数千个神经元,神经元之间的每一个连接都有它的权重。我必须经常更新这些权重,每次学习几千次


FP在这里仍然适用吗?我的意思是,在fp中,我们不能修改变量,只能返回新变量,而不能更改以前的值。这是否意味着我必须在每次重量更新时重新创建整个网络?

查看单子中哪些包含可变变量

您不必在每次发生权重更新时重新创建整个网络。据推测,您的神经元被建模为单个对象-这意味着要“更新”单个神经元,您实际上将创建一个具有更新权重的新神经元。然后,这个神经元将被插入到网络中,以代替旧的神经元,而旧的神经元将被垃圾收集器免费回收


我不同意使用可变状态的想法。函数式语言知道它们是函数式的,因此它们对函数式编程进行了优化。如果函数式语言真的是这项工作的最佳工具,那么就要充分利用它的优点。

如果你以一种可以使用持久数据结构来建模神经网络的方式来构造数据,那么对神经网络的函数式更新将是便宜的(至少与复制整个内容相比)

如果它仍然不够快,你的语言可能允许其他技术(如小心使用变异)来加速它;例如,如果您正在使用Clojure,您可以使用一些附加速度的瞬态

FP在这里仍然适用吗

当然,你可以用函数式的方式写这篇文章,具有相当好的渐进算法效率,但你不可能得到相当好的命令式解决方案10倍的性能,因为纯粹的函数式编程很难有效地使用CPU缓存

我的意思是,在fp中,我们不能修改变量,只能返回新变量,而不能更改以前的值。这是否意味着我必须在每次重量更新时重新创建整个网络

不,有两个原因:

  • 纯功能数据结构可以高效更新,因为它们将大型结构(如哈希表)分解为许多递归定义的小型结构(如平衡二叉树)。当您更新不可变树中的单个节点时,您将从根到目标的路径中的每个节点复制数据,但通过引用安全地引用所有其他分支,因为它们是不可变的,因此在您的权限下无法更改。所以你只做O(logn)功,而不是O(n)功

  • 纯功能数据结构通常提供诸如
    map
    之类的函数,允许以相同的方式更新每个元素,并通过复制源树的结构避免重新平衡。所以n次更新的时间是O(n)而不是O(n log n)


  • 因此,您应该能够实现类似甚至相等的渐近时间复杂度,但从绝对值来看,您将使用的空间和时间是命令式解决方案的数倍。我在书中详细描述了这些基础知识,并为写了这篇文章。

    假设我有一个简单的树:Root |\Node1 Node2,那么如果我创建Node3并用Node3替换Node1,这不意味着我要更改整个树吗?您的示例有两个错误。首先,你的帖子询问你是否需要为每次体重更新重新创建整个网络,而不是它是否“改变”。我在答复中谈到了这个问题。其次,您将其设置得足够小,以便每个节点都有一些更改。想象一下,你有一个由1000个节点组成的网络,只需要更换其中一个节点。你还在改变整棵树吗?你说的“那么这个神经元将被插入到网络中代替原来的那个”难道不是意味着神经网络真的改变了吗?我的意思是替换一个整体的一部分-这不是一个变量的变化吗(在这种情况下是神经网络)?试着把神经网络看作一组实体(节点),而不是一个单一的实体。