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