我是功能编程的新手.
我有一个巨大的神经网络,有数千个神经元,神经元之间的每个连接都有它的重量.我必须经常更新这些权重,每次学习会话数千次.
FP仍适用于此吗?我的意思是在fp中我们不能修改变量,只能返回不改变先前值的新变量.这是否意味着我必须在每次重量更新时重新创建整个网络?
FP仍适用于此吗?
你当然可以用功能性的渐近算法效率来编写它,但你不太可能获得10倍的体面命令式解决方案的性能,因为纯粹的函数式编程使得很难有效地使用CPU缓存.
我的意思是在fp中我们不能修改变量,只能返回不改变先前值的新变量.这是否意味着我必须在每次重量更新时重新创建整个网络?
不,有两个原因:
纯功能数据结构可以有效地更新,因为它们将大型结构(例如散列表)分解为许多小的递归定义结构(例如,平衡二叉树).当您更新不可变树中的单个节点时,您将从路径中的每个节点复制数据从根到目的地,但通过引用安全返回所有其他分支,因为它们不能在您之下更改,因为它们是不可变的.所以你只做O(log n)工作而不是O(n)工作.
纯功能数据结构通常提供的功能map
允许以相同的方式更新每个元素,并通过复制源树的结构来避免重新平衡.所以n次更新的时间是O(n)而不是O(n log n).
所以你应该能够达到类似甚至相等的渐近时间复杂度,但从绝对意义上说,你将使用几倍于空间和时间的必要解决方案.我在我的Visual F#2010 for Technical Computing一书中详细描述了这些基础知识,并为OCaml期刊撰写了人工智能:神经网络(2010年5月8日)的文章.