首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >表示Haskell中的计算图

表示Haskell中的计算图
EN

Stack Overflow用户
提问于 2020-08-06 00:23:02
回答 1查看 310关注 0票数 2

我试着用Haskell写一个简单的自动区分包。

在Haskell中表示类型安全(有向)计算图的有效方法是什么?我知道广告包为此使用了“data”方法,但我对它不太熟悉。有人能给我提供一些见解吗?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-06 04:43:50

正如Ness的评论所指出的,AD的正确抽象是一个类别,而不是一个图表。不幸的是,标准的班级并没有真正做到这一点,因为它需要任何Haskell类型之间的箭头,但是在光滑流形之间的区分才有意义。大多数库不知道流形,并将其进一步限制在欧氏向量空间(它们表示为“向量”或“张量”,即数组)。没有一个令人信服的理由来限制--任何仿射空间都可以用于前向模式AD;对于反向模式,还需要一个对偶空间的概念来区分向量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data FwAD x y = FwAD (x -> (y, Diff x -> Diff y))
data RvAD x y = RvAD (x -> (y, DualVector (Diff y) -> DualVector (Diff x)))

其中Diff x -> Diff y函数必须是线性函数。(您可以使用这类函数的专用箭头类型,也可以只使用碰巧是线性的(->)函数。)在反向模式下唯一不同的地方是,这个线性映射的伴随被表示,而不是映射本身。(在实值矩阵实现中,线性映射是雅可比矩阵,伴随版本是它的转置,但不要使用矩阵,它们在这方面效率很低。)

很干净,对吧?人们一直在谈论的那些图/遍历/变异/向后传递的无稽之谈并不是真正需要的。(详细说明请参见科诺氏纸。)

因此,要使它在Haskell中有用,您需要实现类别组合器。这正是我写受限-类别包的目的。下面是您所需的大纲实例化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import qualified Prelude as Hask
import Control.Category.Constrained.Prelude
import Control.Arrow.Constrained
import Data.AffineSpace
import Data.AdditiveGroup
import Data.VectorSpace

instance Category FwAD where
  type Object FwAD a
     = (AffineSpace a, VectorSpace (Diff a), Scalar (Diff a) ~ Double)
  id = FwAD $ \x -> (x, id)
  FwAD f . FwAD g = FwAD $ \x -> case g x of
     (gx, dg) -> case f gx of
       (fgx, df) -> (fgx, df . dg)

instance Cartesian FwAD where
  ...
instance Morphism FwAD where
  ...
instance PreArrow FwAD where
  ...
instance WellPointed FwAD where
  ...

这些实例都很简单,而且几乎毫不含糊,让编译器消息来指导您(类型化的漏洞_非常有用)。基本上,每当需要范围内的类型的变量时,就使用它;当需要一个不在作用域中的向量空间类型的变量时,使用zeroV

到那时,您将真正拥有所有基本的可微函数工具,但是要真正定义这些函数,您需要使用大量的.&&&***组合器和硬编码的数字基元,这些都是非常规的,也是相当混乱的。为了避免这种情况,您可以使用代理值:值,这些值基本上假装是简单的数字变量,但实际上包含来自某个固定域类型的整个类别箭头。(这基本上就是“建立一个图表”的一部分。)您可以简单地使用提供的GenericAgent包装器。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
instance HasAgent FwAD where
  type AgentVal FwAD a v = GenericAgent FwAD a v
  alg = genericAlg
  ($~) = genericAgentMap

instance CartesianAgent FwAD where
  alg1to2 = genericAlg1to2
  alg2to1 = genericAlg2to1
  alg2to2 = genericAlg2to2

instance PointAgent (GenericAgent FwAD) FwAD a x where
  point = genericPoint

instance ( Num v, AffineSpace v, Diff v ~ v, VectorSpace v, Scalar v ~ v
         , Scalar a ~ v )
      => Num (GenericAgent FwAD a v) where
  fromInteger = point . fromInteger
  (+) = genericAgentCombine . FwAD $ \(x,y) -> (x+y, \(dx,dy) -> dx+dy)
  (*) = genericAgentCombine . FwAD $ \(x,y) -> (x*y, \(dx,dy) -> y*dx+x*dy)
  abs = genericAgentMap . FwAD $ \x -> (abs x, \dx -> if x<0 then -dx else dx)
  ...
instance ( Fractional v, AffineSpace v, Diff v ~ v, VectorSpace v, Scalar v ~ v
         , Scalar a ~ v )
      => Fractional (GenericAgent FwAD a v) where
  ...
instance (...) => Floating (...) where
  ...

如果所有这些实例都已完成,并且可能需要一个简单的助手来提取结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
evalWithGrad :: FwAD Double Double -> Double -> (Double, Double)
evalWithGrad (FwAD f) x = case f x of
   (fx, df) -> (fx, df 1)

然后,您可以编写代码,例如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> evalWithGrad (alg (\x -> x^2 + x) 3)
(12.0, 7.0)
> evalWithGrad (alg sin 0)
(0.0, 1.0)

在此基础上,这些代数表达式建立了FwAD箭头的组合,&&&“分割”数据流和***并行合成,即即使输入和最终结果是简单的Double,中间结果也将通过一个合适的元组类型得到。[我猜,这就是你标题问题的答案:在某种意义上,有向图表示为一个分支的合成链,原则上与你在这些S中发现的一样。]

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63279576

复制
相关文章
在Java中将ArrayList转换为Array
In this tutorial you will learn how to convert ArrayList to Array in Java.
用户7886150
2021/04/29
1.7K0
python json转字符串_在python中将json转换为字符串
一开始我没有清楚地解释我的问题。在python中将json转换为字符串时,请尝试使用str()和json.dumps()。
全栈程序员站长
2022/11/16
10.3K0
如何在 Linux 中将 CSV 文件转换为 TSV 文件?
在Linux操作系统中,可以使用各种命令和工具来处理和转换文本文件。当需要将以逗号分隔的CSV文件转换为以制表符分隔的TSV文件时,可以使用一些简单的命令和技巧来实现。本文将详细介绍如何在Linux中将CSV文件转换为TSV文件。
网络技术联盟站
2023/06/20
1.1K0
如何在 Linux 中将 CSV 文件转换为 TSV 文件?
vue 带token下载——XMLHttpRequest + blob 下载文件流(vue导出excel乱码问题)
从网上查了些方法,后面采用了下面这种实现方式。具体每个模块的代码意思还不是很清楚,后续会在补充,此处直接先给出源码。
celineWong7
2020/11/06
4.1K0
Blob 文件流下载 type类型
let url = window.URL.createObjectURL(new Blob([文件流(一般为res.data)], { type: 'Blob类型' })) let link = document.creatElement('a') // 创建a标签来下载 link.style.display = 'none' link.href = url link.setAttribute('download', '下载的文件名') document.body.appendChild(link) lin
李维亮
2022/12/31
2K0
在 Python 中将数值变量转换为分类变量
这篇文章是今天发布的CTGAN的补充,我们可以使用pandas的cut函数将数据进行离散化、将连续变量进行分段汇总,这比写自定义函数要简单的多。
deephub
2021/11/16
2.1K0
JsBase64位转换为blob上传到服务器
var localData= 'data:image/png...'; //假定dataUrl为base64位 let base = atob(localData.substring(localData.indexOf(',') + 1)); // base是将base64编码解码,去掉data:image/png;base64部分 let length = base.length; let url = new Uint8Array(length); while (length
明知山
2020/09/02
1.1K0
blob视频如何下载_blob加密视频下载
前言 网页上有些视频是直接给的视频地址,那么很多浏览器都有插件进行视频下载,比如 猎豹浏览器的:
全栈程序员站长
2022/11/17
2.9K0
blob视频如何下载_blob加密视频下载
在PHP中将图片转换为base64编码的方法
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。
魏杰
2022/12/23
1.3K0
pandas读取excel文件,转换为字典
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/17
9520
python excel转txt文件
直接上代码吧 import xlrd def row2str(row_data): values = ""; for i in range(len(row_data)): if i == len(row_data) - 1: values = values + str(row_data[i]) else: values = values + str(row_data[i]) + "," return
week
2018/08/24
2.7K0
文本文件转excel文件
Excel文件是我们常用的一种文件,在工作中使用非常频繁。Excel中有许多强大工具,因此用Excel来处理文件会给我们带来很多便捷。但是有时候我们拿到了文件不是Excel文件,而且我们又想用Excel中的工具,这个时候我们就可以想办法把这个文件转换成Excel文件了。今天我们就来实现一下,需要注意我们只能把有规律的文件转换成Excel,而且今天的内容也不是普遍通用的。只提供一种思路。
ZackSock
2021/12/18
1.9K0
文本文件转excel文件
文件下载,excel导出
在实际的开发过程中,我们经常会遇到这种需求,导出文件或者下载文件的时候,弹出保存弹框然后指定文件名或者路径然后再点保存的这种, 一般网上看到的excel文件到处,基本上看到的都是指定下载路径的,这里我针对弹框这种方式做一个说明
java攻城狮
2020/10/10
1.5K0
如何在 Python 中将作为列的一维数组转换为二维数组?
数组是编程中的基本数据结构,使我们能够有效地存储和操作值的集合。Python作为一种通用编程语言,提供了许多用于处理数组和矩阵的工具和库。特别是,在处理表格数据或执行需要二维结构的操作时,将 1−D 数组转换为 2−D 数组的能力是一项基本技能。
很酷的站长
2023/08/11
3980
如何在 Python 中将作为列的一维数组转换为二维数组?
Python selenium chrome parses blob url
When crawling video sites, many videos use blob url to hide the source address. Through F12, you can find the download address of m3u8 corresponding to the request, but the amount of crawled data is very large. Use f12 to analyze each one. Obviously impossible, this article will parse the blob URL through selenium chrome to get the source m3u8 address
py3study
2020/09/18
2.6K0
linux中将图像转换为ASCII格式
本指南介绍如何在 Linux 中将图像转换为 ASCII 格式。我们将使用Jp2a。Jp2a 是一个命令行工具,可帮助你将给定的图像转换为 ascii 字符格式。你可以指定图像文件和 URL 的混合,Jp2a 工具会立即将它们全部转换为 ascii 字符。Jp2a 有许多有用的选项来处理图像。 从标准输入读取图像, 将背景模式设置为浅色或深色, 设置边框, 设置输出高度和宽度, 为输出图像设置自定义尺寸, 垂直或水平翻转输出图像, 在生成输出 ASCII 图像时使用特定字符, 反转图像, 从网上下载图像并转
入门笔记
2022/06/02
4.2K0
linux中将图像转换为ASCII格式
outputstream转byte数组_int类型转换为byte类型
Java中将inputstream输入流转换成byte[]字节数组
全栈程序员站长
2022/11/08
7.8K0
DOMString、Document、FormData、Blob、File、ArrayBuffer (转)
我大学那会儿,一个称为Ajax的东西对前端行业造成了深远影响,不仅是JS语言,而包括前端地位、职位兴起以及工作分工等。抛开IE6浏览器不谈,其他浏览器的Ajax实际上都是借助XMLHttpRequest实现的。
javascript.shop
2019/09/04
2.8K0
DOMString、Document、FormData、Blob、File、ArrayBuffer (转)
Java中将Map转String,String转Map
但很多时候并不能直接将Map对象的toString() 而是应该转换为JsonObject后再调用toString()后存入就正常了
JavaEdge
2021/02/22
14.5K0
如何下载chrome的crx文件
ID为最后面的 bfbmjmiodbnnpllbbbfblcplfjjepjdn
老高的技术博客
2022/12/27
1.3K0

相似问题

在NodeJS中将缓冲区数据转换为blob

294

在javascript中将base64转换为blob

4209

如何在react js中将blob数据转换为可下载的excel/CSV文件

22

将blob转换为Excel文件并下载,文件无法打开

1457

在java中将base64转换为excel文件

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文