Swift for Tensorflow项目的 Swift 中添加了对差分编程的原生支持。Julia 与Zygote有相似之处。
究竟什么是可微编程?
- 它有什么作用?维基百科说
这些程序可以在整个过程中有所区别
但是,这是什么意思?
- 一个人将如何使用它(例如一个简单的例子)?
- 以及它与自动微分有何关系(两者似乎很多时候混为一谈)?
Swift for Tensorflow项目的 Swift 中添加了对差分编程的原生支持。Julia 与Zygote有相似之处。
究竟什么是可微编程?
这些程序可以在整个过程中有所区别
但是,这是什么意思?
我喜欢从面向用户的特性(可微分编程)与实现细节(自动微分)的角度来思考这个问题。
从用户的角度来看:
“可微分编程”是用于微分的 API。一个例子是def gradient(f)
计算梯度的高阶函数f
。这些 API 可能是一流的语言特性,也可能是在库中实现和提供的。
“自动微分”是自动计算导数函数的实现细节。有许多技术(例如源代码转换、运算符重载)和多种模式(例如正向模式、反向模式)。
在代码中解释:
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.
在阅读您的问题之前,我从未听说过“可微分编程”一词,但是使用了您的参考文献中提到的概念,无论是从创建代码来解决具有符号微分和自动微分的导数以及编写解释器和编译器,到我这只是意味着他们使计算函数导数的数值变得更容易。我不知道他们是否将其设为一等公民,但新方法不需要使用函数/方法调用;它是通过语法完成的,编译器/解释器将翻译隐藏到调用中。
julia> f(10), f'(10)
大多数经验丰富的程序员会猜到我刚才提到的内容,因为没有研究论文对此进行解释。换句话说,它就是那么明显。
另一种思考方式是,如果您曾经尝试过在编程语言中计算导数,那么您有时会知道它有多难,然后问自己为什么他们(语言设计者和程序员)不将其添加到语言。在这些情况下,他们做到了。
令我感到惊讶的是,派生词通过语法而不是调用变得可用需要多长时间,但是如果您曾经在该级别使用过科学代码或编码神经网络,那么您将理解为什么这是一个被吹捧为的概念有价值的东西。
此外,我不会将其视为另一种编程范式,但我相信它会被添加到列表中。
它与自动微分有何关系(两者似乎很多时候混为一谈)?
在您引用的两种情况下,它们都使用自动微分来计算导数,而不是使用符号微分。我不认为可微编程和自动微分是两个不同的集合,而是可微编程有一种实现方式,他们选择的方式是使用自动微分,他们可以选择符号微分或其他方式。
似乎您正在尝试更多地了解差分编程的含义。这不是一种新的编程方式,而只是为进行衍生而添加的一个不错的功能。
也许如果他们将其命名为可微分语法,它可能会更清楚。编程这个词的使用给了它比我认为它应得的更多的华丽。
编辑
在浏览 Swift Differentiable Programming Mega-Proposal并尝试将其与使用 Zygote 的 Julia 示例进行比较之后,我将不得不将答案修改为谈论 Zygote 的部分,然后转而谈论 Swift。他们每个人都采取了不同的道路,但共同点和底线是这些语言知道一些关于差异化的东西,这使得编码它们的工作更容易,并希望产生更少的错误。
关于维基百科的引述
这些程序可以在整个过程中有所区别
乍一看,这似乎是胡说八道,或者至少缺乏足够的细节来理解它的上下文,这就是我相信你问的原因。
在对其他人试图传达的内容进行了多年的挖掘之后,人们了解到,除非来源经过同行评审以对它持保留态度,并且除非绝对有必要理解,否则就忽略它。在这种情况下,如果您忽略该句子,那么您的参考文献中的大部分内容都是有意义的。但是我认为你想要一个答案,所以让我们试着弄清楚它的含义。
让我困惑的关键词是整个,但是由于您注意到该声明来自维基百科,并且在维基百科中他们为该声明提供了三个参考,因此对整个单词的搜索仅出现在一个
因此,由于我们的 ∂P 系统不需要原语来处理新类型,这意味着几乎整个语言中定义的所有函数和类型都由 Zygote 自动支持,并且用户可以在他们认为需要时轻松加速特定功能。
所以我对此的看法是,通过回到源头,例如论文,您可以更好地理解它是如何渗透到维基百科中的,但似乎在此过程中失去了意义。
在这种情况下,如果您真的想知道该语句的含义,您应该在维基百科讨论页面上询问并直接询问该语句的作者。
另请注意,所引用的论文未经同行评审,因此其中的陈述目前在同行中可能没有任何意义。正如我所说,我会忽略它并继续编写精彩的代码。
您可以通过应用可微性来猜测它的定义。它被用于优化,即计算最小值或最大值 许多这些问题可以通过找到适当的函数然后使用技术找到所需的最大值或最小值来解决。