2009年1月存档

什么是自动微分,为什么它有效?

伯特兰·罗素评论道

每件事都是模糊的,直到你努力使其精确为止,你才意识到这一点。

我又在考虑自动区分(AD),整理之前关于衍生产品和上的线性地图将其整合为一个连贯的整体,以提交ICFP。我理解其中的机制以及它正确的一些原因。毕竟,这是“链式法则”。

和往常一样,在写作过程中,我碰到了罗素的原则。我感到越来越不安,意识到我没有像我喜欢理解软件那样理解AD,也就是说,

  • 什么这是否意味着,独立于实施?
  • 怎么实现及其正确性是否从这个意义上优雅地流动?
  • 在哪里?否则,我们可以在前两个问题的答案的指导下走吗?

自从写作以来简单有效的功能反应性,想法类型类态射不断出现在我面前,作为一个提问和回答这些问题的框架。令我高兴的是,这个框架让我对自动差异化有了新的、更令人满意的见解。

继续阅读“什么是自动微分,为什么它有效?”»

比较高维、高阶导数的公式

我刚刚重读了杰森·福茨的帖子Haskell中的高阶多元自动微分,因为我又在思考这个话题。我喜欢他用国际地图保持偏导数和(递归地)这些偏导数的偏导数等。

一些想法:

  • 我打赌可以消除常数(C类)Jason代表的案例,因此有3/4的案例需要处理,性能没有太大损失。他已经有了一个相当有效的常数表示,这是一个D类有一个空的国际地图.

  • 我想还有一个很好的通用代码,用于组合他在第三个乘法案例中使用的两个有限映射。代码的含义和正确性来源于这些映射的模型,即总函数,缺少的元素表示默认值(在本例中为零)。

  • Jason的数据类型让我想起了稀疏矩阵表示,但它的无限嵌套方式更酷。也许是深度n个(以零开头)是稀疏的n维的矩阵。

  • 最后,我怀疑Jason的国际地图-基于实现和我的线性贴图-中描述的基于实现高维、高阶导数,函数和中更简单、更高效、功能性更强的线性映射.对于n个,我的公式使用带有以下项的trien个基本元素,而Jason使用国际地图(这也是一个trie)n个条目(计算任何隐式零)。

我怀疑Jason的公式更有效(因为它优化了常量的情况),而我的公式更静态类型,更灵活(因为它处理的比n个).

为了优化常量,我想我更喜欢使用带有也许 吧对于派生,消除代码重复。

我仍在努力理解报纸惰性多元高阶转发模式AD管理各种ε。

最后一句话:我更喜欢术语“高维”,而不是传统的“多元”。我在后者中听到了经典的语法/语义混淆。

通过放弃显而易见的东西来培养创造力

“这很明显”

最近关于haskell-cafe的一条帖子包括了“显而易见”的索赔和反诉。

第一,

O[b]很明显,底部[]不是()

然后是第二位作家,

为什么这是显而易见的——我认为底部是“显而易见的” ()–数据类型定义表示类型中只有一个值。[…]

第三,

很明显,因为()是一个定义的值,而底部不是-根据定义。

就我个人而言,长期以来,我一直没有意识到“显而易见”的痛苦,那就是(),我想其他很多人也有。我感谢鲍勃把我从成见中赶了出来。在权衡了一些选择之后,我可能会做出一个或另一个选择。尽管如此,我还是喜欢别人提醒我还有其他可能。

我不是有意挑剔这些作家。他们只是碰巧提供了我经常听到的通信(反)模式的一些例子。此外,如果你想解决必要地 () /= ⊥,我建议您参考haskell-cafe线程“Re:Laws and partial values”。

谬误

我理解关于什么是“显而易见的”的讨论是建立在谬误之上的,即认为显而易见是事物本身的属性,而不是个人或社区的心理习惯(惯例)。(请参见2位和1位单词.)

创造力

尽管如此,我还是想知道为什么我会这样恼怒 的关于“显而易见”在本次讨论和其他讨论中的用法。(这绝不仅仅是因为“互联网上有人错了”.)每当我被窃听时,我都会花时间看看我情绪反应的表面,我发现对我来说有一些重要而美好的东西。

我对“显而易见”的反应来自于我认为它有害于创造力这是我珍视自己和他人的东西。我明白“这很明显”的意思是“我不好奇”。更糟糕的是,在一场辩论中,我听说这是一种抑制他人好奇心的策略。

对我来说,创造力始于好奇心,并由好奇心维持。创造力对我来说很重要,也很美丽。这是一种价值观,从我很小的时候就被母亲快乐地灌输给了我,就像好奇心是由父亲灌输给我的一样。

我想知道“很明显”是不是最吸引人的言语手段之一。例如,“我确信”,如“我确信你的病猫会没事的”。也许“很明显”最常见的意思是“我不想想象替代品”,或者在辩论中使用时,“我不想要想象其他选择”。也许“我确定”意味着“我想确定”,或者“我希望你确定”。

赞美好奇心

以下是阿尔伯特·爱因斯坦的一句话:

重要的是不要停止提问。好奇心有其存在的理由。当一个人沉思永恒、生命和现实奇妙结构的奥秘时,他不禁感到敬畏。如果一个人每天只想了解一点这个谜就足够了。永远不要失去神圣的好奇心。

还有另一个:

我没有特别的天赋。我只是充满好奇。

今天,我偶然发现了一份文件,它表达了我的好奇心,并以一种让我产生共鸣的方式表达了更多:理性的十二美德。我热烈推荐。

通过合并部分值实现延迟函数定义

这篇文章延续了Ryan Ingram在电子邮件中的想法如何使代码最不严格?.

一个美丽的故事

函数定义中的模式匹配非常方便,并且具有声明性的感觉。例如,

总和[]=0总和(x:xs)=x+总和xs

只需更换“=“由”==“将一组模式子句(部分定义)作为指定总和功能:

  • 空列表的总和等于零
  • (非空)列表的总和x: x轴等于x个加上X轴.

此外,这些属性定义这个总和函数,在其中总和是满足这两个属性的最小定义函数。

卫兵有类似的风格和含义:

abs x | x<0=-xabs x | x>=0=x

更换“=“由”==“通过逻辑含义保护,我们再次有两个属性定义防抱死制动系统:

x<0==>abs x==-xx>=0===>腹肌x===x

O、 谎言!

这个美丽的故事是一个谎言,当我们看到重叠的子句时,这一点就显而易见了。例如,我们更有可能写防抱死制动系统在没有第二个防护装置的情况下:

abs x | x<0=-xabs x=x

第二句的陈述词(∀x.abs x==x)为false。

我更可能写信

abs x | x<0=-x|否则=x

这更具欺骗性,因为“否则“并不是真的有别的意思。它只是“真的“.

正如ChrisK在如何使代码最不严格?:

邮政编码:[a]->[b]->[(a,b)]压缩[]_=[]zip _[]=[]zip(x:xs')(y:ys')=(x,y):zip xs'ys'

这三个子句读起来像独立的真属性拉链.前两个子句重叠,但它们的值一致,所以声明性阅读可能会出错吗?

问题是列表的味道,而不是两种。该定义明确地解决了无和无两种情况,留下了↓。

根据上述定义,“拉链[]“确实如此[]与各条款一致。然而,“拉链[]“是,因为Haskell语义表示每个子句都是按顺序尝试的,第一个子句强制计算将其与[].该值与将第二条解读为属性不一致。交换前两个子句可以修复第二个示例,但会破坏第一个示例。

可以修复吗拉链所以它的含义与这三个属性是一致的?我们似乎陷入了一种武断的偏见,在第一或第二个论点中有严格的规定。

还是我们?

继续阅读“通过合并部分值来定义Lazier函数”»

3D渲染作为功能性反应式编程

我一直在玩3D的简单/通用语义。在这个过程中,我惊讶地看到语义的一个关键部分看起来与库中体现的功能反应性语义的关键部分完全一样反应性.如本文所述,仔细一看,我们之间的联系更加紧密。

继续阅读“3D渲染作为功能反应式编程”»

功能未来价值的另一个角度

之前的一篇帖子介绍了功能未来价值这是一种价值观,直到未来才能知道,但可以在当前进行操作。该帖子提出了一个简单的未来值的指称语义,即时间/值对。在定义时间(使用马克斯幺半群),的实例Functor(仿真器),适用,莫纳德都是自动派生的。

后续帖子提供了通过多线程实现未来价值.不幸的是,该实现不一定满足语义,因为它允许线程调度的不确定性泄漏。尽管实现通常是正确的,但我并不满意。

过了一会儿,我想出了一个主意,真的很逗我发笑。如果我使用一种可以揭示部分信息的更微妙的时间形式,我最初的简单语义确实可以作为一种正确且可行的实现。实现这种微妙的时间形式变得相当棘手,这是我最初的动机无核武器论文中描述的操作员推拉功能反应式编程和帖子具有明确选择的功能并发.

在想到无核武器突破。像我最喜欢的许多想法一样,回顾过去,这很简单也很明显:消除不确定性选择的模糊性(如环境管理委员会运算符),将其使用限制为非底部时相等的值。每当我们有两种不同的方法来回答同一个问题(或可能失败)时,我们可以使用无核武器两者都试一下。在这种情况下,失败(错误或非终止)不是问题。更强大的变体无核武器是最小上界运算符润滑油,如中所述合并部分值.

我一直在和无核武器实施。当两个(兼容的)计算竞争时,失败者会被杀死,从而释放出不再需要的循环。然而,我的前几个实现并没有递归终止其他为废弃计算服务产生的线程(来自嵌套使用无核武器).我在中提出了这个问题螺纹赛车的智能终端,这建议了一些更好的定义。在几篇有用的读者评论中,我的定义中的一些问题得到了解决,特别是在阻塞和取消阻塞异常方面。到目前为止,这些定义都没有可靠地完成任务,现在看起来GHC运行时系统中似乎有一个bug。我希望这个bug(如果有)很快就会被修复,因为我看到了更多无核武器润滑油可以使函数式编程更加模块化(正如John Hughes在为什么函数编程很重要).

我开始将未来的价值观和明确的选择作为实现的一种方式反应性函数式反应式编程(FRP)库。(请参见未来的无功值推挽式函数反应式编程.)在过去的几天里,我思考了一些在没有明确选择的情况下实现未来价值观的方法。这篇文章描述了一个这样的选择。

编辑:

继续阅读“功能未来价值的另一个角度”»