什么是可微分编程?

What is differentiable programming?

Swift for Tensorflow project. Julia has similar with Zygote 的 Swift 添加了对差分编程的本地支持。

什么是可微分编程?

在阅读您的问题之前,我从未听说过“可微分编程”这个术语,但是我使用了您参考文献中提到的概念,无论是从创建代码来解决带有 Symbolic differentiation and with Automatic differentiation and having written interpreters and compilers, to me this just means that they have made the ability to calculate the numeric value of the derivative of a function easier. I don't know if they made it a First-class citizen 的导数,但是新的方式不需要使用 function/method 调用;它是通过语法完成的,compiler/interpreter 隐藏了对调用的翻译。

如果您查看 Zygote example it clearly shows the use of prime notation

julia> f(10), f'(10)

大多数经验丰富的程序员都会猜到我刚刚注意到的是什么,因为没有研究论文解释它。换句话说,就是这么明显。

另一种思考方式是,如果您曾尝试用一种编程语言计算导数,您就会知道有时这有多难,然后问问自己为什么不这样做(语言设计者和程序员) 只需将其添加到语言中即可。在这些情况下,他们做到了。

让我感到惊讶的是,在通过语法而不是调用可以使用导数之前花了多长时间,但是如果您曾经在该级别使用过科学代码或编码神经网络,那么您就会理解为什么这是一个概念这被吹捧为有价值的东西。

此外,我不会将其视为另一个 programming paradigm,但我相信它会被添加到列表中。

How does it relate to automatic differentiation (the two seem conflated a lot of the time)?

在您提到的两种情况下,他们都使用自动微分来计算导数,而不是使用符号微分。我不认为可微分编程自动微分是两个不同的集合,而是可微分编程有一种实现方式,他们选择的方式是使用自动微分,他们本可以选择符号微分或其他一些方式。

看来您正在尝试更多地了解差分编程是什么,而不是实际情况。它不是一种新的编程方式,而只是为做衍生品而添加的一个很好的功能。

也许如果他们将其命名为可区分语法,它可能会更清楚。 编程这个词的使用使它比我认为它应得的更华丽。

编辑

略读 Swift Differentiable Programming Mega-Proposal 并尝试将其与使用 Zygote 的 Julia 示例进行比较后,我不得不将答案修改为谈论 Zygote 的部分,然后切换到谈论 Swift。他们每个人都走了不同的道路,但共同点和底线是这些语言都知道一些关于差异化的知识,这使得编写它们的工作更容易,并希望产生更少的错误。

关于

的维基百科引用

the programs can be differentiated throughout

乍一看,这似乎是胡说八道,或者至少缺乏足够的细节,无法在上下文中理解它,这就是为什么我确定你会问的原因。

在多年深入研究其他人试图交流的内容后,我们了解到,除非来源经过同行评审以持保留态度,并且除非绝对有必要理解,否则请忽略它。在这种情况下,如果您忽略该句子,那么您的引用大部分都是有意义的。但是我认为你想要一个答案,所以让我们试着弄清楚它是什么意思。

让我感到困惑的关键词是 throughout,但由于您注意到该声明来自维基百科,并且在维基百科中他们为该声明提供了三个参考,搜索该词贯穿只出现了一个

∂P: A Differentiable Programming System to Bridge Machine Learning and Scientific Computing

Thus, since our ∂P system does not require primitives to handle new types, this means that almost all functions and types defined throughout the language are automatically supported by Zygote, and users can easily accelerate specific functions as they deem necessary.

所以我对此的看法是回到源头,例如这篇论文,你可以更好地理解它是如何渗入维基百科的,但似乎意义在这个过程中丢失了。

在这种情况下,如果您真的想知道该陈述的含义,您应该在维基百科上询问 talk page 并直接询问该陈述的作者。

另请注意,所引用的论文未经同行评审,因此其中的陈述目前在同行中可能没有任何意义。正如我所说,我会忽略它并继续编写精彩的代码。

我喜欢从面向用户的特性(可微分编程)与实现细节(自动微分)的角度来思考这个问题.

从用户的角度来看:

  • “可微分编程”是微分的API。一个例子是用于计算 f 梯度的 def gradient(f) 高阶函数。这些 API 可能是第一个 class 语言功能,或者在库中实现并由库提供。

  • “自动微分”是自动计算微分函数的实现细节。有很多技术(例如source code transformation, operator overloading)和多种模式(例如forward-mode,reverse-mode)

在代码中解释:

def f(x):
  return x * x * x

∇f = gradient(f)
print(∇f(4)) # 48.0

# Using the `gradient` API:
# ▶ differentiable programming.

# How `gradient` works to compute the gradient of `f`:
# ▶ automatic differentiation.

你可以通过应用可微性来猜测它的定义。 它已用于优化,即计算最小值或最大值 通过找到合适的函数,然后使用技术找到所需的最大值或最小值,可以解决其中许多问题。