什么是动态计算图?


19

通过TensorFlow Fold的PyTorch和TensorFlow之类的框架支持动态计算图,并受到了数据科学家的关注。

但是,似乎缺少帮助理解动态计算图的资源。

动态计算图的优点似乎包括适应输入数据中不同数量的能力。似乎可以根据训练期间的每个输入集实例自动选择层数,每层神经元数,激活功能和其他NN参数。这是准确的描述吗?

动态模型比静态模型有什么优势?这就是为什么DCG备受关注吗?总而言之,DCG是什么,它们的利弊是什么?

Answers:


8

两个简短答案

从理论角度来说,简短的答案是...

动态计算图是一种可变系统,表示为操作之间数据流的有向图。可以将其可视化为包含通过箭头连接的文本的形状,其中顶点(形状)表示对沿边缘流动的数据(箭头)的操作。

请注意,此类图定义了数据流中的依存关系,但未必定义操作应用程序的时间顺序,在没有其他机制指定时间优先级的情况下,图的顶点或循环中的状态保留可能会变得模棱两可。

从应用程序开发的角度来看,简短的答案是...

动态计算图框架是一个由库,接口和组件组成的系统,这些系统提供了灵活的,编程的,运行时接口,该接口通过连接有限但可能可扩展的一组操作来促进系统的构建和修改。

PyTorch框架

PyTorch是Torch框架与Python语言和数据结构的集成。Torch与Theano,TensorFlow和其他动态计算系统构建框架竞争。


———   理解的其他方法   ———

任意离散张量的任意计算结构

可以用来构建计算系统的组件之一是设计为相互连接以创建神经网络的元素。这些可用性支持构建深度学习和反向传播神经网络。还可以构建涉及组件的各种其他系统,这些组件可以在任意定义的计算结构中处理潜在的多维数据。

数据可以是标量值,例如浮点数,整数或字符串,也可以是它们的正交聚合,例如向量,矩阵,立方体或超立方体。这些数据形式的一般化操作是离散张量,而将张量操作组装成工作系统所创建的结构就是数据流。

理解动态计算概念的参考点

动态计算图并不是一个特别新的概念,即使该术语相对较新。计算机科学家对DCG的兴趣还不如数据科学家一词新。尽管如此,该问题正确地指出,除了书面示例以外,几乎没有写得很好的可用资源,可以从中学习有关其出现和使用的整体概念。

开始理解DCG的一个可能的参考点是Command设计模式,它是面向对象设计的支持者所普及的众多设计模式之一。命令设计模式将操作视为计算单元,其细节在触发它们的命令对象中被隐藏。命令设计模式通常与解释器设计模式结合使用。

对于DCG,还涉及Composite和Facade设计模式,以方便定义即插即用的离散张量操作,这些操作可以按模式组装在一起以形成系统。

设计模式与表单系统的这种特定组合实际上是一种软件抽象,在很大程度上类似于导致当今大多数计算机的中心的冯·诺依曼体系结构出现的激进思想。冯·诺依曼(Von Neumann)对计算机出现的贡献是允许将包含布尔逻辑,算术和分支的任意算法表示为数据并存储为程序的想法。

DCG的另一个先驱是表达式引擎。表达式引擎可以像算术引擎一样简单,也可以像Mathematica这样的应用程序一样复杂。规则引擎类似于DCG,除了规则引擎是声明性的,规则引擎的元规则在这些声明上运行。

程序操作程序

这些与DCG的共同点在于可以在运行时定义要应用的数据流和操作。与DCG一样,其中一些软件库和应用程序具有API或其他机制,以允许将操作应用于功能细节。本质上是一个程序的思想,它允许操纵另一个程序。

在原始级别理解此原理的另一个参考点是某些计算机语言中可用的switch-case语句。它是一种源代码结构,程序员本质上表示:“我们不确定必须做什么,但是此变量的值将告诉实时执行模型从一组可能性中做什么。”

switch-case语句是一种抽象,它扩展了将计算方向的决定推迟到运行时的想法。它是现代CPU控制单元内部所做操作的软件版本,是推迟某些算法细节的概念的扩展。其他原始示例包括C语言的函子(函数指针)表或C ++,Java或Python的多态性。

动态计算使抽象更进一步。它们推迟了大部分(如果不是全部)计算规范以及它们之间的关系来运行。这种全面的概括拓宽了运行时功能修改的可能性。

计算的有向图表示

这就是动态计算模型。现在进入图部分。

一旦决定将要执行的操作的选择推迟到运行时,就需要一种结构来保存这些操作,它们之间的依赖关系以及映射参数。这样的表示不仅是语法树(例如表示源代码层次结构的树)。与汇编语言程序或机器代码不同,它必须容易且任意可变。它必须包含比数据流图更多的信息,而不仅仅是内存映射。指定计算结构的数据结构必须是什么样?

幸运的是,任何任意的,有限的,有界的算法都可以表示为指定操作之间的依赖关系的有向图。在这样的图形中,顶点(在显示时通常表示为各种形状的节点)表示对数据执行的操作,而边沿(在显示时通常表示为箭头)是源自某些操作(或系统输入)的信息的数字表示以及其他操作(或系统输出)所依赖的。

请记住,有向图既不是算法(指定了精确的操作顺序)也不是声明(因为可以显式存储数据,并且可以定义和嵌套循环,分支,函数和模块)。

这些大多数动态计算图框架和库都允许组件在支持机器学习的组件输入上进行计算。有向图中的顶点可以是神经元的仿真,用于构造神经网络或支持微积分的组件。这些框架提供了可用于更广泛意义上的深度学习的构造的可能性。

在计算机历史中

同样,到目前为止,对于计算机科学而言,没有什么是新的。LISP允许通过其他算法修改计算原理图。许多长期的即插即用接口和协议都内置了通用的输入维数和数字性。学习框架的思想也可以追溯到二十世纪中叶。

新的和流行的是集成功能和相关术语集的特定组合,每种功能的现有术语的集合,为那些已经在软件行业学习和工作的人提供了更广泛的理解基础。

  • 当代的(时髦的)API接口风格
  • 面向对象
  • 离散张量支持
  • 有向图抽象
  • 与支持大数据,数据挖掘,机器学习和统计分析的流行语言和软件包的互操作性
  • 支持任意和系统的神经网络构建
  • 动态神经网络结构适应的可能性(这有助于神经可塑性的实验)

这些框架中的许多框架都支持对输入维数(维数和维数范围)的适应性。

与编译器中抽象符号树的相似性

操作的输入和输出的依存关系图也出现在抽象符号树(AST)中,一些更先进的编译器在解释源代码结构时构造了它。然后,在与库链接并形成可执行文件的过程中,使用AST生成汇编程序指令或机器指令。AST是一个有向图,表示数据的结构,执行的操作以及由源代码指定的控制流。

数据流只是操作之间的依赖关系集,AST必须具有固有的依赖关系,AST才能使用AST在汇编程序或机器代码中创建执行指令,这些指令完全遵循源代码中指定的算法。

与编译器中的切换案例语句或AST模型不同,动态计算图框架可以进行实时处理,优化,调整(例如在塑料人工网的情况下),反转,通过张量转换,抽取,修改以添加或删除熵,根据一组规则进行突变或以其他方式转换为派生形式。它们可以存储为文件或流,然后从它们中检索。

对于LISP程序员或了解John von Neumann建议将操作规范存储为数据的建议的性质的人来说,这是一个微不足道的概念。从后面的意义上讲,程序是一种数据流,用于通过编译器和操作系统指示以VLSI数字电路实现的动态计算系统。

实现适应性的维度和计算能力

问题是没有一个评论,“需要数据集-其中的所有实例都具有相同的固定数量的输入”。该陈述不会促进准确的理解。有更清晰的方法可以说出输入适应性的正确性。

必须定义DCG与整个系统的其他组件之间的接口,但是这些接口可能具有内置的动态尺寸或数量性。这是一个抽象问题。

例如,离散张量对象类型表示特定的软件界面,而张量是一种动态数学概念,可以在其周围使用通用接口。离散张量可以是标量,向量,矩阵,立方体或超立方体,并且每个维度的因变量范围可以是变量。

可能的情况是,动态计算图中定义的系统层中的节点数量可能是特定类型输入数量的函数,并且也可能是推迟到运行时间的计算。

可以对框架进行编程,以选择层结构(再次是开关案例范式的扩展)或计算定义结构大小和深度或激活的参数。但是,这些复杂的功能不足以使该框架成为动态计算图框架。

什么条件可以支持动态计算图的框架?

要获得动态计算图框架的资格,该框架必须仅支持推迟确定运行时算法,因此为运行时在计算依赖性和数据流上进行大量操作打开了大门。推迟的操作基础必须包括表示操作系统的有向图的规范,操作,执行和存储。

如果算法的规范没有推迟到运行时,而是被编译成针对特定操作系统设计的可执行文件,而仅具有低级语言(如if-then-else,switch-case,多态性,函子和可变长度的字符串,它被认为是静态算法。

如果操作,运行之间的依赖性,数据流,流中数据的维数以及系统对输入数字和维数的适应性在运行时都是可变的,则可以创建一个高度适应性的系统,那么算法在这些方面都是动态的。

同样,在LISP程序上运行的LISP程序,具有元规则功能的规则引擎,表达式引擎,离散张量对象库,甚至相对简单的Command设计模式在某种意义上都是动态的,从而延迟了运行时间的某些特征。DCG具有灵活而全面的功能,以创建深度学习实验和系统实现的丰富环境的方式来支持任意计算结构。

何时使用动态计算图

DCG的优缺点完全是针对特定问题的。如果研究以上各种动态编程概念以及在相关文献中可能与之紧密相关的其他概念,那么是否需要动态计算图将变得显而易见。

通常,如果您需要表示一个任意且不断变化的计算模型以促进深度学习系统,数学操纵系统,自适应系统或其他能够很好地映射到DCG范例的灵活复杂的软件构造的实施,则可以证明使用动态计算图框架进行概念设计是定义问题解决方案的软件体系结构的良好第一步。

并非所有的学习软件都使用DCG,但当对运行时间的要求是系统且可能连续地操纵任意计算结构时,它们通常是一个不错的选择。


PyTorch是Python语言的Torch框架的集成 ” –我认为该语句可能被误解为“ PyTorch是Python语言的Torch框架的包装库 ”,这可能是一个错误的声明。您可能应该改写它。
nbro

通过动态计算图形框架,不像在编译器的switch-case语句或中间AST模型,一个可以操纵的操作 ” ......“ 对其进行翻译 ” -你说的“翻译行动”是什么意思?
nbro

1

简而言之,动态计算图可以解决一些静态图不能解决的问题,或者由于不允许分批训练而效率低下的问题。

更具体地说,现代神经网络训练通常是分批进行的,即一次处理多个数据实例。一些研究人员选择的批处理大小为32、128,而另一些研究人员选择的批处理大小大于10,000。单实例训练通常很慢,因为它不能从硬件并行中受益。

例如,在自然语言处理中,研究人员想训练具有不同长度的句子的神经网络。使用静态计算图,它们通常必须首先进行填充,即在较短句子的开头或结尾添加无意义的符号,以使所有句子的长度相同。此操作使训练变得非常复杂(例如,需要屏蔽,重新定义评估指标,在那些填充符号上浪费大量计算时间)。使用动态计算图,不再需要填充(或仅在每个批次中都需要填充)。

一个更复杂的示例是(使用神经网络)基于其解析树来处理句子。由于每个句子都有自己的解析树,因此每个句子都需要不同的计算图,这意味着使用静态计算图进行训练只能进行单实例训练。与此类似的一个例子是递归神经网络


0

许多深度神经网络都有一个静态的数据流图,这大致意味着其计算结构(其计算图)在不同输入下保持稳定。这很好,因为我们可以利用此功能来提高性能,例如通过迷你批处理(一次处理大量输入)。

但是某些神经网络可能对每个输入都有不同的计算图。这会导致一些问题(难以处理,图形构造在计算上很昂贵),因此这些网络很难使用。

您链接的论文通过提出一种可以将多个计算图成批处理的方法来克服了这个问题。然后,我们可以执行常规的NN技术。

好处是加速,这激发研究人员探索不同的结构并更具创造力。

动态计算图的优点似乎包括适应输入数据中不同数量的能力。似乎可以根据训练期间的每个输入集实例自动选择层数,每层神经元数,激活功能和其他NN参数。这是准确的描述吗?

这是不正确的。


0

动态计算图是具有较高抽象级别的简单修改的​​CG。“动态”一词解释了这一切:数据如何流经图形取决于输入结构,即DCG结构是可变的而不是静态的。它的重要应用之一是在NLP神经网络中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.