深度学习是一种新型编程吗?

2020-12-13 11:59:44

在有关如何使编程更好的大多数讨论中,最终有人会说一些类似的话,我们只需要等到深度学习解决问题即可!"我认为这是一个天真乐观的想法,但它提出了一个有趣的问题:从什么意义上说,使用深度学习创建的程序与通过手工编写的程序不同?

这个问题最近出现在我们作为程序项目一部分的讨论中,该项目探讨了关于什么是(计算机)程序的历史和哲学观点。因此,本文欠参与该项目的其他人很多债,尤其是MaëlPégny,Liesbeth De Mol和Nick Wiggershaus。

许多人会直观地认为,如果您训练一个深度神经网络来解决某个问题,则得到的程序与手动编写一些逻辑来解决该问题的程序不同。但是到底有什么区别呢?在这两种情况下,程序都是一序列的指令,这些指令由一台机器确定性地执行以产生结果。

最近在阅读HasokChang的优秀著作Inventing Temperature时,我遇到了操作主义的概念,我认为它为思考深度学习和编程问题提供了有用的观点。物理学家珀西·威廉姆斯·布里奇曼介绍了操作论的观点。 Toquote:我们所说的任何概念不过是一组操作而已;该概念与相应的操作集同义。这对深度学习和编程有什么启示?

在谈论编程之前,我需要谈一谈操作主义。我将依靠Chang的有关温度的书中的描述,但Bridgman以长度的测量为例。关键思想是,诸如长度之类的概念由与其一起使用的操作所定义。这意味着,使用标尺测量的长度与根据光传播的时间量测的天文长度是不同的长度。

我们习惯于思考长度,以至于这个想法看起来很奇怪,但以温度测量为例。温度历史上的一个问题是常规温度计无法在极高的温度下工作(汞的沸点为356.7°C)。英国陶工约西亚·韦奇伍德(Josiah Wedgwood)发明了另一种测量高温的方法。他的Wedgwood比例尺(°W)是基于小型粘土圆柱体的收缩而定的。在高温下,圆柱体会收缩。将它们从火上移开后,您可以使用随附的标尺读取温度。 (这仅适用于Wedgwood矿场生产的特定粘土,但他将所有粘土捐赠给了英国皇家学会)。赤热温度为0°W,铜的熔点为27°W,铜的熔点为0.5°C。金是32°W。

弄清楚如何将基于水银温度计的温度刻度与Wedgwood刻度相匹配是很困难的,因为两者在操作上不会重叠。 Wedgwood自己尝试生产转换表是一个遥不可及的过程,其银的熔点为4,717°F(而不是1,763°F)。

编程与测量温度不一样,但是肯定有一些实用的操作用于通过程序执行各种操作。创建基于深度学习的程序和普通程序时,您使用的许多操作都大不相同。

程序执行首先,对于常规程序和深度神经网络来说,执行实际上是非常相似的操作。在这两种情况下,程序都是一长串指令以及一些数据。它提供了一些输入,使用这些输入执行计算并产生输出。如果我们只看执行力,那么我们可能不会看到太大的差异。

编程或培训。当我们开始研究程序的构造时,区别变得明显。对于普通程序,您需要编写一些逻辑。在深度网络(或任何其他基于机器学习的程序)的情况下,该程序是通过训练获得的,即根据样本数据调整一些数值参数。

了解程序。一个更有趣的问题是了解程序的功能。如果它既大又复杂,这对于普通程序而言可能是一个挑战,但是您通常可以研究编码器或询问编写该程序的人。对于机器学习而言,这取决于所使用的算法的类型。虽然您可以了解决策树如何做出决策,但尚不清楚如何理解深度神经网络的功能。

验证程序。如果您想证明普通程序是正确的,则可以(也许很费力)证明它与描述其关键属性的规范相符。对于深层神经网络,您可以验证它是否正确传播了权重,但是要证明有关程序实际功能的任何事情都很棘手。 (顺便说一句,这也是为什么我总是发现2015年AI公开信在强调" Verification"作为AI系统的研究目标方面没有抓住重点的原因。)

在上面的列表中,执行和编程或培训的情况分别显示出相当明显的异同。更微妙的情况是理解和验证程序。关于这些的有趣参考文献是《计算机模拟,机器学习和拉普拉斯恶魔:高能物理中的不透明性》一文,它研究了欧洲核子研究组织的程序和ML算法的物理实验(感谢尼克的建议!)

该论文比较了非常大和复杂的深度神经网络和计算机模拟的不透明性(即理解的可能性),但在其他方面则是“不透明”。程序。它标识许多不同类型的不透明度。

计算机仿真和深度网络在算法上都是透明的,这意味着一个人可以在执行指令时遵循指令序列。对于人类来说,这在尝试理解程序时无济于事(但是对于拉普拉斯恶魔来说足够了,因此这两种程序都没有作者所谓的基本不透明性)。

然后,不透明度与参与该过程的人员紧密相关。对于计算机仿真而言,主要问题是它们既庞大又复杂。顺便说一下,这对于许多其他软件系统而言都是如此,我们可以合理地认为大型系统(或模拟)是与小型程序不同的一种程序,正是因为了解这些程序的操作各不相同。再次引用Bridgman:

数学并不认识到,随着物理范围的增加,基本概念变得模糊,并最终完全失去了物理意义,因此必须用其他在操作上有很大不同的概念来代替。

我认为规模问题是计算机科学家很容易忽略的问题。例如,用于证明小的几行长算法正确性的方法与用于证明针对实际编程语言的编译器正确性的方法在操作上有很大不同。

在深度神经网络的情况下,复杂性的问题更加严重。上一篇论文引用的一个有用概念是``路径的不透明度''。在深度神经网络(权重为非零)中,数字数据流经的可能路径的每一层都呈指数增长。复杂的普通程序中的数据依存关系的数量也可能很大,但是它不会随例如每个新班级。

上一篇文章提出了关于机器学习的另一点。 ML算法具有拟自治性,并执行参数的迭代调整。对于普通程序,程序员编写程序的每一行(并调整所有常量)。换句话说,即使我们不能立即理解普通程序的每个方面,我们也应该能够找到认识的人(或至少在过去的某个时候知道)。为了了解深度网络中的权重,我们需要回溯整个学习过程...

从操作员的角度看程序和机器学习也提出了一个有趣的未来研究问题。如果我们有两个可以同时应用于某个域的测量操作,则可以使这些操作在公共域上匹配并统一比例。韦奇伍德本人试图通过使用基于金属膨胀的刻度作为水银温度计与其黏土缸之间的中介,将其刻度与华氏刻度相匹配(韦奇伍德刻度被遗忘在任何人产生正确的映射之前,但是正确的映射肯定可以被创建。)

我想得出一个奇怪的问题是:是否存在用于构造,理解和验证的操作,而这两种操作对于“普通”而言都是相同的 程序和机器学习算法? 当然不是今天,而且肯定不会很快。 但是,我想可能会有一种更具交互性,机器辅助的方式来编程和执行其他一些任务,这些任务可以与两种实体一起工作-频谱的一端是普通程序,而另一端是深度神经网络。