如何从有向无环图导出FRP?

2024-06-22

我目前正在研究我的下一个项目。目前处于预规划阶段,因此这个问题只是为了了解现有技术的概述。

Setup

我有一个具有多个输入和输出的有向无环图(DAG),现在考虑人工神经网络:

处理这种结构的常见方法是在每个(时间)步骤上处理整个网络。我相信这是 frp 库使用的方法,例如netwire http://hackage.haskell.org/package/netwire.

现在我很幸运,我有一系列的事件,每个事件都带来了变化one输入节点的数量。这个想法是,如果我可以静态地知道给定的更改只会影响网络中的一部分,那么我可能不必步进网络中的每个节点。

Example

在上图中,5、7 和 3 是输入,11 和 8 是“隐藏”节点,2、9 和 10 是输出节点。节点 5 的更改只会影响节点 11,并实际上影响节点 2、9 和 10。我不需要处理节点 7、3 和 8。

The goal

以尽可能短的延迟处理此类网络。图的大小可能会达到 100k 个节点,每个节点进行适量的计算。

The plan

我希望有人能够站出来为 X 库做广告,以完成工作。

否则,我当前的计划是从图形描述中导出每个输入节点的计算。也许我会使用Parmonad,这样我就不必自己处理数据依赖性,并且仍然可以从多核机器中受益。

问题

  • 有没有什么图书馆可以满足我的需要?
  • Is my Par计划可行吗?这在多大程度上取决于每个节点所需的处理量?

像这样的问题通常是针对以下任一者进行编码的:Applicative or Arrow抽象。我只讨论Applicative. The Applicative类型类,发现于Control.Applicative,允许通过提供值和函数pure和应用于值的函数<*>.

class Functor f => Applicative f where
    -- | Lift a value.
    pure :: a -> f a

    -- | Sequential application.
    (<*>) :: f (a -> b) -> f a -> f b

您的示例图可以非常简单地编码为Applicative(用加法替换每个节点)为

example1 :: (Applicative f, Num a) => f a -> f a -> f a -> f (a, a, a)
example1 five seven three = 
    let
        eleven = pure (+) <*> five   <*> seven
        eight  = pure (+) <*> seven  <*> three
        two    = pure id  <*> eleven
        nine   = pure (+) <*> eleven <*> eight
        ten    = pure (+) <*> eleven <*> three
    in
        pure (,,) <*> two <*> nine <*> ten

可以通过遍历图以编程方式从图的表示创建相同的编码,使得每个节点将在其所有依赖关系之后被访问。

您可能希望进行三种优化,但对于仅使用以下代码进行编码的网络来说无法实现Applicative。一般策略是将问题编码为Applicative以及一些用于优化或额外功能所需的附加类。然后,您提供一个或多个解释器来实现必要的类。这使您可以将问题与实现分开,从而允许您编写自己的解释器或使用现有的库,例如reactive https://hackage.haskell.org/package/reactive, 反应香蕉 http://hackage.haskell.org/package/reactive-banana, or mvc 更新 http://www.haskellforall.com/2014/06/spreadsheet-like-programming-in-haskell.html。我不打算讨论如何编写这些解释器或将此处给出的表示方法调整为特定的解释器。我只想讨论底层解释器能够利用这些优化所需的程序的通用表示。我链接的所有三个库都可以避免重新计算值,并且可以适应以下优化。

可观察的分享

在前面的例子中,中间节点eleven仅定义一次,但在三个不同的地方使用。一个实现Applicative将无法通过引用透明度看到这三个elevens 都是一样的。您可以假设该实现使用了一些通过引用透明度查看 IO 魔法 https://stackoverflow.com/q/25698375/414413或者定义网络,以便实现可以看到计算正在被重用。

下面是类Applicative Functor计算结果可以在多个计算中划分和重用。据我所知,此类并未在任何库中定义。

class Applicative f => Divisible f where
    (</>) :: f a -> (f a -> f b) -> f b

infixl 2 </>

然后您的示例可以非常简单地编码为Divisible Functor as

example2 :: (Divisible f, Num a) => f a -> f a -> f a -> f (a, a, a)
example2 five seven three = 
    pure (+) <*> five   <*> seven </> \eleven ->
    pure (+) <*> seven  <*> three </> \eight  ->
    pure id  <*> eleven           </> \two    ->
    pure (+) <*> eleven <*> eight </> \nine   ->
    pure (+) <*> eleven <*> three </> \ten    ->
    pure (,,) <*> two <*> nine <*> ten

和与阿贝尔群

典型的神经元计算其输入的加权和,并对该和应用响应函数。对于度数较大的神经元来说,将其所有输入求和是非常耗时的。更新总和的一个简单优化是减去旧值并添加新值。这利用了加法的三个属性:

Inverse - a * b * b⁻¹ = a减法是加数的逆运算,这个逆运算允许我们从总数中删除先前添加的数字

交换律 - a * b = b * a无论执行顺序如何,加法和减法都会得到相同的结果。这样,即使旧值不是最近添加的值,当我们减去旧值并将新值添加到总数中时,我们也会得到相同的结果。

关联性 - a * (b * c) = (a * b) * c加法和减法可以在任意分组中进行,并且仍然得到相同的结果。当我们减去旧值并将新值添加到总数中时,即使旧值是在加法中间的某个位置添加的,这也可以让我们得到相同的结果。

任何具有这些属性以及闭包和恒等的结构都是一个阿贝尔群 http://en.wikipedia.org/wiki/Abelian_group。以下字典包含足够的信息,供底层库执行相同的优化

data Abelian a = Abelian {
    id  :: a,
    inv :: a -> a,
    op  :: a -> a -> a
}

这是可以对阿贝尔群求和的一类结构

class Total f where 
    total :: Abelian a -> [f a] -> f a

类似的优化也可以用于地图的构建。

阈值和平等

神经网络中的另一个典型操作是将值与阈值进行比较,并完全根据该值是否超过阈值来确定响应。如果对输入的更新不会改变该值落在阈值的哪一侧,则响应不会改变。如果响应没有改变,则没有理由重新计算所有下游节点。能够检测到阈值没有变化Bool或者响应是平等的。以下是可以利用平等的结构类别。stabilize提供了Eq底层结构的实例。

class Stabilizes f where
    stabilize :: Eq a => f a -> f a
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从有向无环图导出FRP? 的相关文章

  • 没有由文字“1”产生的 Num String 实例

    main do putStrLn myLast 1 2 3 4 myLast a gt a myLast x x myLast xs myLast xs 当我尝试运行此代码时 我收到此消息 没有由文字 1 产生的 Num String 实例
  • Haskell:GHC 无法推断类型。由类型签名错误绑定的刚性类型变量

    我看过几篇主题相似的帖子 但它们并不能真正帮助我解决我的问题 所以我才敢重复 现在我有一个带有签名的函数 run Expr query gt RethinkDBHandle gt query gt IO JSON 这是一个数据库查询运行函数
  • 是否有适用于 Haskell 或 Scala 等函数式语言的 LL 解析器生成器?

    我注意到明显缺乏用函数式语言创建解析器的 LL 解析器 我一直在寻找但没有成功的理想发现是为 ANTLR 风格的 LL 语法生成 Haskell 解析器 语法的模小数重新格式化 并且令我惊讶的是 每个最后一个解析器生成器都具有函数我发现的语
  • Haskell 中的所有图形和 Web 库是如何实现的?

    我才开始学习Haskell 我读到它是一种纯函数式语言 其中的所有内容都是不可变的 因此 输入输出 写入和读取数据库之类的事情会导致状态的可变性 我知道 Haskell 中有一种叫做 monad 的东西 它允许在 Haskell 中使用命令
  • Repa 数组上的并行 mapM

    在我最近的work https github com bgamari mixture model with Gibbs sampling 我一直在充分利用RVar http hackage haskell org packages arch
  • 在类型级别未定义

    通常 当我使用 Haskell 代码时 我会使用类型注释将内容存根并undefined foo String gt Int foo undefined 是否有类型级别的 未定义 我可以以类似的方式使用 理想情况下 与某种注释结合使用 typ
  • 如何从有向无环图导出FRP?

    我目前正在研究我的下一个项目 目前处于预规划阶段 因此这个问题只是为了了解现有技术的概述 Setup 我有一个具有多个输入和输出的有向无环图 DAG 现在考虑人工神经网络 处理这种结构的常见方法是在每个 时间 步骤上处理整个网络 我相信这是
  • 记录语法和求和类型

    我有关于 Haskell 中的总和类型的问题 我想创建一个由两个或多个其他类型组成的总和类型 并且每个类型可能包含多个字段 一个简单的例子是这样的 data T3 T1 a Int b Float T2 x Char deriving Sh
  • 在 Haskell 中使用 Maybe 类型

    我正在尝试利用 Haskell 中的 Maybe 类型 我有一个查找返回 Maybe 的键 值元组 如何访问 Maybe 包装的数据 例如 我想将 Maybe 包含的整数与另一个整数相加 或者 您可以进行模式匹配 case maybeVal
  • 当 Haskell 持久库中需要“Key”时,如何通过“Int”获取实体?

    我将持久性 orm 与 scotty Web 框架一起使用 我想通过 id 从 db 获取值 这些是来自 GET 请求的 有 get 函数接受 Key Entity 变量并返回 Maybe Entity 我使用以下代码从数据库获取值 k l
  • 我必须实现 Applicative 和 Functor 来实现 Monad

    我正在尝试实现一个 Monad 实例 作为一个更简单的示例 假设如下 data Maybee a Notheeng Juust a instance Monad Maybee where return x Juust x Notheeng
  • Haskell 中的纯函数是否有可能改变变量的本地副本?

    Haskell 中的纯函数是否有可能改变变量的本地副本 就像 clojure 中提到的那样函数式编程是一个骗局 http swannodette github io 2013 06 10 porting notchs minecraft d
  • Haskell 乘加运算的数学性能

    我正在用 Haskell 编写一个游戏 我当前在 UI 上的传递涉及大量几何图形的程序生成 我目前专注于识别一项特定操作的性能 C ish 伪代码 Vec4f multiplier addend Vec4f vecList for int
  • 如何在 Haskell 中处理这个简单的 IO 异常

    全部处理 在下面的代码中 getDirectoryContents dir可能会失败 例如dir可能不存在 如何捕获这个并向用户抛出有意义的消息 我知道 IO 异常处理已经被问过很多次了 但我仍然找不到一个简单的方法来做到这一点 walk
  • ghci 中严格求和/严格折叠导致内存爆炸

    正如中提到的为什么 sum takeWhile 以下是not炸毁记忆ghci https stackoverflow com questions 14298930 why does sum takewhile 10000000 1 use
  • 对于 Haskell 的 QuickCheck,什么是收缩?

    我正在学习 QuickCheck gt 2 6 的诀窍 但我不明白什么是心理医生 从看类型签名 http hackage haskell org packages archive QuickCheck 2 6 doc html Test Q
  • Haskell 中有“对象平等”的感觉吗?

    如果我在 Haskell 中有一个单链表 data LL a Empty Node a LL a deriving Show Eq 我可以轻松实现在末尾和开头插入的方法 但是在特定元素之后或之前插入又如何呢 如果我有一个LL of Inte
  • Haskell 中的模式匹配正则表达式模式

    在 Scala 中 我有一个正则表达式模式匹配 如下所示 val Regex d 4 d 2 d 2 r val Regex year month day 2013 01 06 结果是 year String 2013 month Stri
  • 如何向http-client-tls提供客户端证书?

    我在用http 客户端 tls http hackage haskell org package http client tls 0 2 1 2连接到需要客户端证书的启用 TLS 的服务器 我怀疑我需要调整TLS设置 http hackag
  • 为什么这个 HasField 实例没有被解析?

    我在用着GHC 8 2 1 我有以下模块 LANGUAGE FlexibleInstances LANGUAGE MultiParamTypeClasses LANGUAGE UndecidableInstances LANGUAGE Ty

随机推荐

  • 为什么嵌套权重对性能不利?备择方案?

    我写了几个布局文件 其中使用了layout weight属性来创建不同视图之间的比率 在某些时候 我开始收到有关嵌套权重的 lint 警告 所以 我想知道为什么嵌套权重对性能不利 以及是否有一种更有效的方法来创建视图尺寸之间的恒定比率 该比
  • 如何在项目提交历史中找到已删除的文件?

    曾几何时 我的项目中有一个文件 我现在希望能够获取它 问题是 我不知道我什么时候删除了它 也不知道它在哪条路径上 当该文件存在时 如何找到该文件的提交 如果您不知道可以使用的确切路径 git log all full history the
  • Windows 10 UWP 应用程序的记录器

    我找不到任何适用于 Windows 10 通用应用程序的记录器 我尝试过 log4net Microsoft 企业库 Nlog 但 Windows 10 通用平台均不支持它们 谁能给我推荐适合 Windows 10 UWP 的优秀记录器 您
  • SQL Server 2008 R2中ntext和varchar有什么区别

    我想知道数据类型之间的基本区别ntext and varchar在 SQL Server 2008 R2 中 我应该在什么情况下使用ntext and varchar From ntext 文本和图像 Transact SQL http m
  • C# 线程安全(特别是 MVVM/WPF)

    我想知道我需要做什么才能使模型在 MVVM 中线程安全 假设我有以下类 它被实例化为单例 public class RunningTotal INotifyPropertyChange private int total public in
  • microsoft Visual Studio 2008 构建不断失败

    我的构建不断失败并出现以下错误 Project error PRJ0002 Error result 31 returned from C Program Files Microsoft SDKs Windows v6 0A bin mt
  • 使用 Web api 的 AngularJS 客户端路由和令牌身份验证

    我想使用 asp net mvc webapi 作为后端和客户端路由 无 cshtml 在 SPA angularjs 应用程序中创建一个身份验证和授权示例 以下只是可用于设置完整示例的函数示例 但我就是无法把它们放在一起 任何帮助表示赞赏
  • 如何使用递归函数返回 ArrayList

    我是java新手 我正在努力克服 我必须做一些作业 我从中解决了很多问题 但有时我不知道该怎么做 我的问题 我必须为二叉树构建一些函数 例如添加节点 计数节点 删除节点等 其中大多数我都能找到自己的算法 现在我正在努力解决递归方法 我在其中
  • 引起:java.lang.IllegalArgumentException:令牌(spring.cloud.vault.token)不能为空 - Hashicorp Vault

    我正在跟进Vault Configuration示例引用自 https spring io guides gs vault config https spring io guides gs vault config 当我执行代码时 出现以下
  • “*text=auto”和“*text=auto eol=lf”有什么区别?

    我正在读关于 gitattributes文件和强制行结尾的规则some https rehansaeed com gitattributes best practices line endings教程是这样写的 text auto and
  • Prolog中统计一个列表中出现次数的方法

    我必须编写一种方法 可以计算一个列表在给定的另一个列表中出现的次数 例如 reps a b c a b c a b c 0 R R 2 no 我试图编码它 incr X X1 X1 is X 1 reps C D incr C D reps
  • Amazon Redshift 如何从 s3 复制并设置 job_id

    Amazon Redshift 提供使用 复制 命令从 s3 对象加载表数据的功能 他们是使用复制命令的一种方法 但也为每个插入的行设置额外的 col CONSTANT 我想在每个复制的行上设置一个 job id 不在源数据中 我认为当 c
  • 如何在Unity上制作循环动画片段

    我正在使用 Unity Mecanim 并且有两个动画剪辑 问题是 当剪辑的动画完成时 它不会从头开始 也不会循环 而且我找不到任何选项让它循环 有帮助吗 在哪里寻找循环选项 EDIT 我根据这里的答案找到了选项 但没有可编辑的 是因为我从
  • 一个批处理文件如何获取另一个批处理文件的退出代码?

    我有两个批处理文件 task bat and runtask bat The runtask batcalls task bat我想要runtask bat获取退出代码task bat到一个变量中 这怎么可能做到呢 任务 bat echo
  • 如何在类属性中存储函数?

    在我的代码中 我有一个类 其中一个方法负责过滤一些数据 为了允许后代自定义 我想将过滤函数定义为类属性 如下所示 def my filter func x return x 2 0 class FilterClass object filt
  • Java:未映射的目标属性

    我在使用 Mapper 时遇到问题 我正在使用 mapstruct processor 来构建 Maven 项目 每次我都会收到警告 警告 15 16 java 未映射的目标属性 from to 警告 13 13 java 未映射的目标属性
  • 运行时错误'-2147352567 (80020009)'指定集合的​​索引超出范围

    我定期遇到错误 运行时错误 2147352567 80020009 指定集合的 索引超出范围 抛出这个错误就行了 对于 wks Shapes 中的每个 cb 这是完整的代码 Sub SelectAll wks As Worksheet Ap
  • 以编程方式切换“限制后台数据”

    如果我进入 设置 数据使用 并按 属性 我可以使用运行 Android 4 1 2 的 Samsung Galaxy S2 i9105P 激活 限制后台数据 有什么方法可以以编程方式执行此操作 无论是打开还是关闭 我只想在某些条件下激活 停
  • 一些 sonatype 关系问题

    我在 LAN 内部署了一个 sonatype nexus 服务器 将一些远程存储库映射到我的公共存储库 替代文本http img576 imageshack us img576 5517 7875d01884ad4234a5b02e2 pn
  • 如何从有向无环图导出FRP?

    我目前正在研究我的下一个项目 目前处于预规划阶段 因此这个问题只是为了了解现有技术的概述 Setup 我有一个具有多个输入和输出的有向无环图 DAG 现在考虑人工神经网络 处理这种结构的常见方法是在每个 时间 步骤上处理整个网络 我相信这是