Eurographics 2023最新综述:图形学中的神经-符号模型
随着 CVPR 2023 Best Paper 的公布,其中一篇名为 VISPROG 的工作引起了广泛关注。这项工作利用自然语言指令解决复杂且组合性的视觉任务,重新将神经-符号方法带回了人们的视野,并证明了计算机视觉社区对这种方法的认可。实际上,VISPROG 并不仅仅是简单地将语言模型和视觉处理库进行拼接。能够获得最佳论文奖,说明神经-符号这种非端到端的方法和框架的优势还是值得我们认真研究和思考的!那么,什么是神经符号呢?它有哪些优势?如何与 2D/3D 视觉计算结合起来呢?
本文选取了来自 Brown、Adobe、UCL、UoW、Autodesk 和 Stanford 的博士生以及教授合著的一篇 Eurographics 2023 上的综述报告,全面介绍了神经符号模型在图形学(包括 2D/3D 视觉)领域的应用。
论文标题:
Neurosymbolic Models for Computer Graphics
https://arxiv.org//pdf/2304.10320
摘要与内容概览:程序模型就是一种用来表示图形内容的方法,比如植被、建筑物、纹理等等。它们有很多好处,比如可以解释设计参数、可以随机变化、输出的质量高、表示方式紧凑等等。不过也有一些限制,比如从零开始创建程序模型比较困难。最近,基于人工智能的方法变得很流行,尤其是神经网络在创建图形内容方面。这些技术让用户可以直接指定他们想要创建的东西的属性,通过示例、约束或目标来进行指定,然后搜索、优化或学习算法会负责处理具体的细节。
▲ 图1:神经符号模型通过符号程序和机器学习的结合产生视觉数据。从左到右:神经网络编写的 CAD 程序的输出;推断再现输入手绘图的 2D 绘图程序;由神经网络生成的程序材料程序(即节点图)。
神经符号到底是什么?它与视觉领域又会有什么碰撞?
纵观计算机图形学的发展历史,可以发现该领域的进步往往是由于视觉数据表示的改进。新的视觉数据表示方法能够激发新的创意能力,或者更有效地提升现有的能力。举个例子,纹理贴图作为一种表面细节表示方法,使得虚拟对象能够以更真实的外观模仿现实世界的对象。而多边形网格的细节层次系统则能够以交互速度渲染出人口密集的虚拟场景。
此外,各种类型的样条线能够更准确地对光滑曲面进行建模。而隐式表面表示则能够以简洁的代数表达式编码美丽的景观,并且已被证明在从图像观察中重建 3D 几何形状方面非常有用。
在计算机图形学历史中,有一类广泛应用的表示形式被称为过程模型:这些是一种在执行过程中输出视觉数据的符号程序。从某种程度上说,程序模型和计算机图形学本身一样古老,可以追溯到 Ivan Sutherland 在 SketchPad 系统中使用的约束程序来生成工程草图。现在,程序方法被广泛用于建模某些类别的 3D 形状,包括树木、建筑物以及整个城市景观。它们还被用于建模对象表面的外观,比如材质、纹理,甚至是虚拟角色在人群中的行为。
程序模型之所以如此受欢迎和持久,是因为它们有很多理想的特点。它们提供可解释的参数,可以通过改变这些参数来改变生成的视觉数据的属性,比如调整虚拟建筑物的高度。此外,这些参数的随机化能够让单个程序模型生成多种不同的视觉输出,这对于快速探索设计空间或用非重复内容填充大型虚拟世界非常有用。
但是,程序模型确实也有一些局限性。首先,创建程序模型比较具有挑战性:通常需要编程专业知识和艺术/设计的敏锐度,这样的组合只有一些从业者具备。此外,单个程序模型能够实现的变化类型通常仅限于参数的变化,如果想要进行更复杂的结构变化,通常需要对程序模型本身的结构进行重大修改,比如要改变跑车模型来生成卡车。
最近,机器学习模型在生成视觉数据方面变得越来越流行,尤其是深度神经网络。这些模型被广泛应用于图像合成、处理和操作、3D 形状建模、材料和纹理建模、2D 绘图和草图绘制等领域。从原理上讲,这些模型很容易创建:只需要提供示例/训练数据,学习算法就会处理剩下的事情。而且,它们非常通用:相同的模型架构(有时甚至是相同的训练模型)可以表示很多不同类型的视觉数据,比如所有人脸的外观。
然而,它们也有自身的局限性。这些模型学习到的表示通常是不透明且难以解释的,这使得它们难以编辑或操作(尽管在这个领域中也有一些研究人员取得了进展)。此外,由于机器学习方法生成的模型是对其训练数据所暗示的真实函数的统计近似值,因此这些模型可能会生成一些具有伪影的输出,无法泛化到训练集之外,比如模糊的图像或斑点状的几何形状。
如表 1 所示,程序/符号模型和学习/神经模型各有其优点和缺点。大家可能自然而然地想问:是否有一种方法可以将这两种表示形式结合起来,以获得最佳效果呢?在本报告中,作者总结了最新研究成果,专注于这种称为神经符号模型的方法,它使用人工智能/机器学习技术增强了符号程序生成视觉数据的能力。
为了让这篇文章更简洁易懂,作者限定了讨论的范围:具体来讲,专注于使用人工智能和机器学习技术来增强符号程序生成视觉数据的任务。在这篇文章中,当提到神经符号模型“使用符号程序”时,指的是它明确地构建生成的视觉数据的中间符号表示。也就是说,视觉数据是用离散的符号表示的,这些符号通过一个或多个组合形成一个结构,然后使用符号操作符(即具有明确定义的符号实现的函数)来处理。
2.1深度学习
深度学习和神经网络在计算机图形学领域被广泛应用。通常,神经网络被用作学习函数逼近器,它可以通过基于梯度的优化技术找到从源域 X 到目标域 Y 的映射。在深度学习中,通过组合多个简单的神经层和非线性操作来构建复杂的神经架构。这些方法在很多计算机图形任务中都很成功,这些任务可以被看作是映射问题,比如特征检测、去噪、渲染、动画等。然而,如何应用深度学习以及何时会取得成功是一个复杂的问题,涉及到很多特定问题因素。
除了重建,神经方法也被证明对于计算机图形内容的生成模型很有用。深度生成模型学习表示输入域 X(如视觉数据的集合)的概率分布,然后可以从中进行抽样,生成新的实例(如新的视觉数据)。
有许多不同类型的深度生成模型,如生成对抗网络(GANs)、变分自动编码器(VAEs)、规范化流、自回归模型和扩散模型,每种模型都有其优点和缺点。这些深度生成模型已应用于许多视觉领域,如自然图像、材料、草图、场景、体素、网格、隐性形状和人物运动。然而,与重建类似,大多数这些方法都设计为直接生成视觉输出,没有中间的符号表示,因此不在研究范围之内。生成性神经符号模型通常使用上述学习范式之一,但训练网络来生成新的符号表示,这些表示可以执行以生成新的视觉输出。
最后,对于以神经方式表示视觉数据的方法,人们越来越感兴趣。在某些应用中,神经表示将专门用于特定的数据。例如,在神经辐射场(NeRFs)中,一个场景由一个神经网络表示,该网络学习从空间位置和观察方向输入对到体积密度和发射辐射输出对的映射关系。
程序性几何学:程序化几何建模最早应用于计算机辅助设计(CAD),可以追溯到 Ivan Sutherland 的 SketchPad 系统。在 CAD 中,一个模型由一系列参数化的操作组成,这些操作可以进行调整,重新执行建模程序以生成更新的几何形状。构造性实体几何(CSG)是一种三维几何生成的编程模型,通过组合参数化的基本元素集合(可能包括约束条件)的布尔运算(如交集、并集、差集)来创建更复杂的形状。
从结构上看,通过 CSG 程序生成的表面几何形状是完整的,并且与实体物体相吻合,这使得它非常适合用于制造物体的建模。边界表示法(B-reps)是 CSG 的一种替代方案,用于表示实体几何形状。B-rep 由一组连接的表面补丁(形状上的任何流形)组成,它们一起构成了实体区域的边界。人们可以对 B-rep 进行布尔运算(就像 CSG 一样),但它们还支持其他有用的建模操作,如边缘的倒角或锉刀处理。通常,通过挤压、旋转或其他操作,将二维工程草图转化为三维形状(见图 2)。
总体而言,这种基于特征的实体建模范式通常被称为工业标准 CAD 软件采用的实体建模的主流形式。在本文的第 6 节中,研究了神经符号 CAD 建模的工作。之前的一些工作试图从原始输入几何体(如点云)中推断出 B-reps,但这种推断系统并不考虑可以生成这种 B-reps 的更高级 CAD 程序,因此不在本文讨论的范围内。
无上下文语法是另一种流行的程序性几何生成方法。一个著名的例子是 L-系统,它是一种无上下文字符串重写系统,它的输出字符串被解释为生成几何图形。由于它们具有递归性质,因此非常适合对自然界中出现的分形结构(如树木和其他植被类型)进行建模。另一个流行的上下文无关语法例子是形状语法,它直接在几何学上操作的重写系统,通常用于细分空间区域。这种语法被广泛应用于规则、重复的结构,特别是建筑中出现的结构,如建筑物、外墙和城市。
程序合成是一个研究编程语言的重要领域,它探索自动生成符合高级规范的程序的方法。尽管自动代码生成的理念可以追溯到计算机科学的起源,而且关于综合算法的第一篇论文可以追溯到 1957 年,但直到最近几十年,该领域才取得了巨大的进步,特别是在归纳合成方面。在归纳合成中,用户提供了一个(可能是部分的)规范来描述所需的意图,并使用搜索方法来探索可能的程序空间,以生成满足规范的程序。这包括以下内容:
(i)开发用于描述用户意图的方法;
(ii)通过限制现有语言或设计新颖的特定领域语言来定义搜索空间;
(iii)开发搜索算法以有效地探索该空间。
在程序合成领域,人们通过提出不同的接口来指定意图,包括输入输出示例、演示、自然语言、部分程序和断言。搜索算法则包括枚举、约束求解、概率搜索等方法,有时候也会将它们组合使用。第一个商业应用程序合成的例子是 Excel 2013 中的 FlashFill,它能从数据操作示例中自动生成小段程序。现在,程序合成技术已经在许多应用中得到了应用,并且一些框架如 Sketch 和 Rosette 使得开发新语言的合成工具变得更加容易。在本文中,将在第 3.3 节更详细地讨论与神经符号推理相关的搜索算法。
近年来,程序综合技术也以新颖和令人兴奋的方式应用于解决计算机图形学中的问题。这些应用受到形状程序化表示的启发,将建模转化为代码生成的任务。一些最近的工作包括从三维形状中反向设计 CAD 程序和形状程序操作。
此外,最近还使用程序重写技术来生成更紧凑且易于操作的 3D CAD 代码。这些工作利用了一种称为 E-graphs 的数据结构,这种数据结构在代码优化中非常流行,因为它需要搜索大量在语法上不同但在语义上相同的程序。E-graphs 数据结构能够高效地表示许多等效程序,通过尽可能共享子程序,从而支持以最小成本提取程序。尽管这类程序优化方法存在于程序综合和编译器的交叉领域,但它们在计算机图形学中变得越来越流行,例如用于优化木工的设计和制造计划。
尽管取得了这些进展,在将合成技术的推理能力扩展到复杂领域方面仍然存在根本性的挑战。这是因为:
(i)随着合成代码的规模增大,搜索空间呈指数级增长;
(ii)从人类交互的自然形式中推断意图是具有挑战性的。
至此,本文已经以一种广义的方式描述了神经符号模型:就是用机器学习增强的符号程序。这个核心思想有很多不同的实现方式,本节将把这些不同的实例整理到一个正式的设计空间中。
设计空间是一组设计轴,可以沿着这些轴进行系统设计,并在每个轴上做出一些设计选择。提出的这个设计空间是为了涵盖先前研究中提出的一系列神经符号模型,并将在本报告的后面进行讨论。随着神经符号模型领域的发展,这个设计空间应该仍然是一个有用的框架,因为它能够涵盖如此广泛的工作。在第 8 节中,还强调了一些在这个设计空间中尚未探索的新点,可能值得进一步研究。
▲ 图3:神经符号模型的设计空间。一个神经符号模型将用户意图的说明和特定领域的语言(DSL)作为输入,并合成输出满足用户意图的视觉数据的程序。然后,视觉输出可以在一个非符号化的神经后处理中进一步完善。已经提出了几种方法来学习这种模型的各种神经组件。注意:本图中介绍的图标和颜色方案在整个报告中被用来识别不同的先前作品在这个设计空间中的位置。
3.1 任务规范
神经符号模型执行的任务可以通过其给定的输入和它应该产生的输出来指定。一般来说,神经符号模型将接受一些关于用户希望模型生成的视觉数据类型的用户输入;然后,它将提供一个或多个程序作为输出,这些程序可以被执行以生成满足这些输入的视觉数据。该模型通常还给出了表达这些输出程序的语言的正式规范(参见第 3.2 节)。
用户有很多方法可以向神经符号模型说明他们的意图。潜在的用户输入包括(但不限于):
视觉目标:要重建的单一视觉基准(如图像或三维形状)。 视觉范例:一个视觉数据的集合,其分布应该被模仿。 黑盒生成器:一个现有的视觉数据生成器,其行为应该被模仿(例如,一个预先训练好的三维形状的深度生成模型)。 文本提示:对要生成的视觉数据类型的自然语言描述。 目标函数:将程序的视觉输出映射到可取性分数的函数(例如,在重力作用下生成的三维形状的稳定性)。
作为输出,该神经符号模型可以产生:
确定性程序:一个单一的程序,每次执行时都返回相同的视觉输出。这样的程序可以包括可以变化的连续参数,以产生一系列可能的视觉输出。许多 CAD 程序就属于这一类。 概率性程序:一个做出随机选择的单一程序,每次执行都会产生不同的视觉输出(例如,飞船上翅膀的类型和位置)。由于这些随机选择可以影响连续和结构元素,与确定性程序相比,这些程序可以捕获更多的视觉输入。 程序分布:一个不同程序分布的采样器。采样的程序可以有一系列不同的结构,使得这种表示法可以捕捉到比前两种类型更广泛的视觉输出。在我们将在本报告中调查的作品中,这种取样器通常是表示输出程序的生成神经网络。
神经符号模型的核心是它产生的程序;为了指定一个程序,我们需要用一种语言来表达这些程序。虽然原则上可以使用通用的编程语言,如 C++ 或 Python,但标准的做法是使用特定领域的语言,或 DSL:这种语言的数据类型和运算符是专门针对特定的兴趣领域(如生成 3D 形状)。这样的语言可以更简洁地表达该领域的有用程序,这使得它们更容易使用和修改,也更容易让神经符号模型产生(因为可能的输出程序的空间更小)。
对于神经符号模型的目的,在指定 DSL 时,有几个重要的设计轴需要考虑:
编程范式:DSL 可以采用许多编程语言范式中的任何一种。作者在本文中调查的工作包括功能语言(例如代表程序材料的基于节点的数据流程序)、命令式程序(例如可缩放矢量图形、SVG、描述绘图命令序列的文件),以及约束语言(例如,CAD 工程草图语言,指定不同草图元素的几何属性之间的约束关系)。
基元类型:通过机器学习增强符号程序的方法之一是学习语言中的神经基元——原始数据类型或原始函数。例如,3D 形状的语言可以包括 3D 零件库,每个零件都由学习的神经场表示。如果 DSL 没有这样的基元,我们说它仅使用硬编码基元。
固定的:作为输入的语言保持不变。 预处理的:在神经符号模型学习生成程序之前,作为输入的语言被神经符号模型在预处理步骤中修改(例如,通过在一些示例程序中找到共同的模式并将其分解为新的程序)。 可演变的:神经符号模型在学习生成程序的过程中不断修改作为输入的语言(例如,通过发现越来越复杂的子程序,使其更容易生成更复杂的程序)。 自发明的:不提供语言作为输入;神经符号模型自己发明了整个语言。发明 "一种语言的过程将涉及提出一套原始数据类型和函数,将这些数据类型结合起来,以解析性地表示来自特定领域的视觉数据。在第 8 节中简要地讨论了沿着这个方向的潜在的未来工作思路。
3.3 程序合成器
给定任务规范和领域特定语言(DSL),神经符号模型必须生成满足该 DSL 规范的生成程序。这个问题本质上是一个搜索程序:搜索 DSL 中可表达的程序空间以找到满意的程序。这是一个具有挑战性的搜索问题,有许多可能的策略来解决它。读者可以沿着以下设计轴组织这些策略:
程序优先权:在任何非严格复杂的 DSL 中,很可能存在多个同样满足输入规范的程序。为了区分这些程序,读者必须问自己一个问题:先验地喜欢什么样的程序?就先前的工作(在图形的神经符号模型和更普遍的程序合成领域)所考虑的这个问题而言,答案是倾向于更短/更简单的程序(即遵循奥卡姆剃刀的说法)。然而,这个设计轴可以接受不同的/额外的先验因素。
数据库检索:最简单的程序 “合成” 形式:不是生成一个新的程序,而是从现有程序的数据库中检索一个。有些方法会对检索到的程序进行修改,例如通过调整其参数来更好地满足用户的目标。 显式列举:对语言中可能的程序进行确定性的探索。枚举可以以自上而下或自下而上的方式进行,也就是说,无论搜索是从程序的抽象语法树的根或叶开始。这种方法通常只适用于在相对简单的语言中寻找短的程序;在更复杂的环境中,往往需要额外的技术来使搜索变得可行。最常见的方法是使用一些启发式方法来限制搜索空间。贪婪搜索是最极端的限制形式。梁式搜索的变体也被广泛使用。在自上而下的搜索中,可以采用分支和边界策略。最近的一类技术涉及通过紧凑地表示大类等价子程序来压缩搜索空间;这些表示方法包括版本空间和电子图谱。 随机搜索:对于具有非常大的程序空间的语言来说,枚举是不可行的,随机搜索的形式可以是一种可行的替代方法。这些算法从一些初始程序开始(可以是语言中的随机程序,也可以用一些启发式的方法进行初始化),然后反复地对程序进行随机修改,希望能够改进它们。其中一些算法保持一个单一的候选程序:这些算法包括马尔科夫链蒙特卡洛(MCMC)和模拟退火。其他的算法则维护一组或一群程序;算法所使用的随机变化可能涉及同时对多个程序进行推理。这种算法的例子包括顺序蒙特卡洛(SMC)和遗传编程。 约束满足:在某些情况下,可以将任务规范转化为一组约束条件,并将问题视为约束满足问题。一种常见的方法是将规范转换为布尔可满足性问题。如果可以做到这一点,而问题的大小又不会出现难以解决的膨胀,那么就可以应用高效的SAT求解器。如果这样的转换是不可能的,那么可以将规范转换为一阶逻辑可满足性问题,这样就可以使用 SMT 求解器。 用户在回路中:与其自动合成程序,不如让人参与进来,帮助合成器决定输出程序的不同部分应该是什么样子(例如,用稀疏的用户涂鸦来指导将纹理图像分解成多个程序性组件)。
最后,值得讨论的是搜索算法的终止条件。基于枚举和基于约束的算法一旦探索完所有可能的程序就会终止;实际上,达到这个终止条件可能需要大量的计算时间。此外,随机搜索算法没有自然终止条件:原则上它们可以永远运行,并且可以继续产生更好的程序。考虑到上述情况,大多数程序合成器将其搜索算法视为随时算法,一旦超过某个固定的计算预算,就会终止并返回迄今为止找到的最佳程序。
神经指导:上面讨论的许多搜索算法都有可以从某种形式的启发式指导中受益的步骤:波束搜索需要对可能的下一个搜索状态集进行排序以进行探索;分支和约束需要在决定是否扩展搜索树之前约束部分搜索树的可能得分;随机搜索方法可以对其随机变化使用非均匀分布。在迄今为止的先前工作中,这是机器学习发挥作用的最常见的地方:学习搜索指导启发式。这种启发式通常采取 “建议下一步添加到程序中的内容” 的形式。
因此,自回归语言模型是最广泛使用的神经引导架构,特别是 Transformer。过去的一些工作也使用了指针网络,因此神经引导可以建议重复程序的先前部分(例如,变量重用)。各种形式的图卷积网络也得到了应用,尽管自从 Transformer 和其他基于注意力的模型出现后,这些网络在很大程度上已经不再受到青睐。对于通过从数据库中检索程序来 “合成” 程序的系统来说,学习到的深层特征空间(在这里进行相似性搜索)作为一种神经指导形式。第 3.6 节讨论了如何训练这些指导网络。
当神经符号模型生成一个程序时,它的工作还没有完成——接下来必须执行该程序以产生视觉输出。执行程序的过程可以采用不同的形式:
直接执行:程序被线性化,其操作按顺序执行。这种类型的执行是最常见的;它对应于大多数(非并行)通用编程语言(无论是解释的还是编译的)所使用的执行模式。 求解器:在某些语言中,执行程序需要解决搜索、优化或约束满足问题。作者认为值得在神经符号模型设计空间中为此类执行器分配一个独特的点,原因有两个:首先,如果学习需要计算梯度,那么使用它们可能会使模型的神经组件更难学习。其次,正如程序组合期间的搜索提供了神经指导的机会一样,程序执行期间的搜索也是如此。。 可学习代理:代替硬编码的执行器(无论是直接的还是基于求解器的),人们可以选择学习程序文本和程序输出之间的映射。与任何学习的函数一样,这样的执行器只能是近似正确的;然而,它对于学习神经符号模型的其他神经组件有优势(见 3.6 节)。
3.5 可选的神经方法后处理
3.6 学习算法
至此,已经完成了对神经符号模型管道的考察:从输入规范到最终的视觉输出。然而,还有一个关键的设计轴需要讨论;这个轴涉及到神经符号模型的多个部分:它的可学习部分是如何训练的?
端到端(无监督)训练:最明显的方法是通过在整个模型中反向传播最终任务损失函数来一次性训练模型的所有神经组件。这是可取的,因为它在概念上很简单,并且不需要对管道中的中间步骤进行任何真值监督——最值得注意的是,不需要提供成对的(输入空间,真值程序)。作为此过程的一部分,损失梯度必须通过合成器引导网络在构建程序时所做的每一个选择进行反向传播。如果这些选择代表程序中的连续值,则该反向传播是明确定义的。然而,程序通常也表现出由离散选择决定的复杂结构(例如分支决策、要使用的基元类型)。通过这种离散选择的梯度并没有明确定义。至少有两种方法可以解决这个难题:
平滑松弛:定义离散结构程序选择的连续松弛,使单个程序能在不同的离散结构之间平滑融合。这种策略还需要设计一个程序执行器,它可以在程序的输出域中产生相应的(和语义上有意义的)平滑的输出。设计这样的松弛(及其执行器)是具有挑战性的、耗时的和特定领域的:创建一个新的松弛通常需要发表一篇研究论文。一些方法使用端到端的可微分学习来训练其模型的连续部分;为了简单起见,也将这类方法归入这一类别。 强化学习:具体来说,策略梯度 RL 与得分函数梯度估计器(例如 REINFORCE 或 PPO)。这些算法随机地估计梯度,不要求模型的任何部分是可微的(除了神经网络本身)。虽然是无偏的,但这些梯度估计可能具有极高的方差,导致训练收敛缓慢,无法达到局部最优,或者根本无法收敛。
值得注意的是,在端到端训练中使用基于求解器的执行器需要在神经符号模型训练的外部迭代优化循环中运行一个迭代求解器循环,这将是缓慢的,更不用说可能不(容易)区分。因此,只要这样做的近似误差可以接受,通常最好使用学习的代理执行器来代替。与此相关的是:在端到端学习范式中,学习型代理执行器可能与程序中的神经基元不相容(因为梯度可能永远不会通过实际执行器传播,以训练神经基元)。
模块化训练: 端到端训练的替代方法是分别训练神经符号模型的不同阶段。这通常(但并非总是)需要在模型训练阶段以真实输出的形式进行监督。对于某些阶段,这种监督比其他阶段更容易获得(例如,给定输入规范的“真实程序”可能很难获得)。作者描述了如何将模块化训练应用于图 3 中神经符号建模流程的不同阶段:
人:在最好的情况下,人们可以获得由人们为满足特定任务规范而编写的一套精心策划的程序。这样的数据很少,但确实存在这样的例子;见第4节。 合成程序:在缺乏人们创建的“真实”程序的情况下,人们可以编写一个过程来创建各种合成程序以及它们满足的任务规范。这样的过程可以像从 DSL 语法中随机抽取样本一样简单,也可以利用领域知识。在此类数据上训练的模型通常不能很好地推广到感兴趣的实际任务规范,因此它们通常仅用于为另一种学习方法提供初始化。 自举法:从基于合成数据预训练的模型开始,一些算法可以通过对模型自身预测的变化进行迭代训练来改进模型。
另外,这里也可以使用平滑松弛或强化学习方法(通常也是在合成数据上进行最大似然预训练的初始化)。
模块化训练,用于学习代理执行引擎或解算器引导网络:这两种类型的网络都可以在(程序,程序输出)对上使用监督学习进行训练。与训练合成器引导网络一样,这些数据可以通过创建和执行合成程序来获得;然而,在这些数据上训练的网络可能无法推广到推理时呈现给模型的 “真实” 数据。
神经细化网络的模块化训练:完善程序化建模程序的输出可以被表述为一种领域转换问题:将程序的输出从 "看起来是程序生成的 "外观领域转换为 "看起来是现实的 "外观领域。由于人们通常无法获得成对的(程序性的、真实的)数据,因此非成对的领域转换方法在这里是有用的。
在这篇文章中,作者讨论了几种神经符号方法,它们都需要某种形式的监督。对于一些方法来说,传统的数据集就足够了,比如一组 3D 形状或 2D 图像。但是,其他方法需要更结构化的数据作为更适合神经符号建模的监督。在这里,简要介绍了一些提供更符号化表示的数据集的示例,例如以程序或高级结构的形式。图 4 展示了其中几个数据集的示例。
二维形状:
有几个数据集提供了关于 2D 形状的高级描述,比如它们由哪些参数化基元组成,或者使用哪些笔画集来创建。这些数据集通常来自 CAD 程序,因为 CAD 程序通常提供了创建 2D 工程草图的界面。这些草图使用参数化的图元(比如圆、直线和圆弧)以及图元之间的空间关系(比如邻接或相切)来表示。有两个数据集提供来自 CAD 程序的 2D 草图。
一个是叫做 SketchGraphs 的数据集,它包含了来自 OnShape 的 1500 万个 2D 草图;但是已知数据样本中存在很多重复。另一个叫做 CAD as Language 的数据集,它包含约 450 万个草图,也是从 OnShape 中抓取的,并试图解决其中一些问题。此外,Wong 等人还介绍了两个按照程序生成的 2D 绘图数据集。第一个数据集包含了 1000 个来自家具、车辆和小工具等类别的绘图,每个绘图都包含简单的图元,比如直线和曲线。
第二个数据集包含了 1000 个简单的 2D 建筑物草图,比如塔、桥梁和由蓝色和红色块组成的房屋。还有一些数据集以矢量化笔划及其绘制顺序的形式提供关于草图中笔划的高级信息。举例来说,OmniGlot 数据集包含了 1600 个手写字符,来自于 50 个不同的字母表,每个字符由 20 个不同的人绘制。
还有一个叫做 Quick, Draw! 的数据集,包含了 5000 万张来自 345 个类别的图画。此外,可扩展矢量图形(SVG)也是一种流行的矢量图形内容格式,可以被视为一种用于生成参数形状的简单编程语言。有一些数据集提供了这种格式的二维形状。DeepSVG 引入了一个叫做 SVG-Icons8 的数据集,其中包含了来自 Icons8 网站的 10 万个图标。这些图标描绘了各种类别的物体,比如床、自行车和杯子。另外,SVGFonts 数据集提供了 1400 万个不同字体的矢量化字符。
三维形状:
除了网格以外,这三个数据集还提供了关于 3D 形状的高级结构信息。PartNet 是一个数据集,提供了 26,000 个合成的 3D 形状,涵盖了室内场景中常见的一些制造对象,比如椅子、桌子和灯。这些形状来自 ShapeNet 数据集,而 PartNet 还提供了每个形状的分层分解,包括它们的组成部分。比如,一个椅子可以首先分解为靠背、座椅和底座等部分,而这些部分又可以进一步分解为更小的组件。这种分解方式在同一类别的所有形状中都是一致的。
ABC 数据集包含了一百万个机械零件和装配体,都是由 OnShape CAD 建模软件创建的。除了网格之外,ABC 数据集还提供了用于创建每个形状的参数化边界曲线和曲面等信息。Fusion 360 Gallery 数据集基于使用 Autodesk Fusion 360 CAD 建模软件创建的 20,000 个设计。除了网格之外,这个数据集还提供了多种不同类型的高级信息,包括子组件的分层分解、零件之间的接头、孔、接触面,以及某些设计的“草图和拉伸”构造序列。此外,还可以将每个形状分割为用于创建曲面每个部分的建模操作。
材料和纹理:
在实际应用中,常常将程序材料定义为节点图,这是功能程序的一种可视化表示形式。最近,一些神经符号方法已经开始尝试合成这些节点图。总共有三个主要的数据来源,其中只有两个是公开的。Substance Source 是一个由专业材质艺术家创建的数据集,包含大约 7,000 个节点图。这个数据集在 MatFormer 中被用作训练集,但不对外公开。
作为公共替代方案,我们有 Substance 3D Community Assets,这是一个网站,提供了由 Substance 3D Designer 用户创建的可供公众使用的节点图。不过,这个网站上的图表尚未组合成一个完整的数据集。此外,Nvidia vMaterials 是一个包含 800 多种真实材质的数据集,并且还提供了对应的节点图。这个数据集可以作为另一个可用的资源。
▲ 图4:提供更适合神经符号模型的结构化数据的数据集示例。作者展示了 2D 形状、3D 形状和材料的数据集示例。所有数据集都提供某种形式的结构信息,例如零件分解、构造顺序或零件之间的几何关系。
▲ 表2:第 5 节中讨论的神经符号 2D 形状建模工作的总结,其中每种方法都属于设计空间内。
5.1 布局生成
布局生成问题在很多领域都存在,比如图形设计布局、平面图合成和家具布局。这些领域都涉及到将元素按照一定的空间和拓扑排列进行布局(可能需要满足一些约束条件)。举个例子,在平面图合成中,相邻约束可能规定主卧室要位于浴室旁边,从而形成两个房间之间的空间和拓扑关系。关于布局生成的研究非常丰富,但在这里我们只介绍了与神经符号建模相关的一些精选工作。
平面图合成任务旨在生成符合一系列建筑约束的真实平面图。Para 等人提出了一种神经符号方法来解决这个问题。首先,他们使用一个 Transformer 网络来生成布局元素参数的约束,比如房间类型和宽度/高度范围;然后,使用指针网络在元素之间生成关系约束,比如门或墙的边缘。这些约束条件一起形成了一个约束程序,然后执行(即解决)该程序,以生成一个符合约束条件的空间布局(参见图 5 右侧)。
软件用于创建二维工程草图的历史可以追溯到第一个 CAD 系统。工程草图构成了参数化 CAD 的二维基础,而参数化 CAD 是用于设计各种制造对象,从汽车零件、电子设备到家具等的最重要的三维建模方法。工程草图(如图 6 所示)由由线、弧、圆等二维几何元素组成的复合曲线,以及描述这些元素如何连接在一起的拓扑信息和使用拓扑定义的约束(如重合、相切、对称)。
实质上,工程草图可以看作是一个程序:根据其参数的变化,该程序可以重新执行以生成满足任何约束的新的二维几何图形。生成高质量的工程草图是自动生成适合制造的参数化 CAD 文件的一项有益技术。大规模工程草图数据集的可用性(见第 4 节)使得基于学习的工程草图生成方法成为可能。一些正在进行的工作将工程草图视为一种序列语言,可以使用 Transformer 进行建模,而不必考虑约束。对于工程草图生成,提供控制是一个重要的挑战,因为设计者需要一种方法来影响生成的形状。一种方法是根据用户提供的图像或手绘草图来调整网络。另一种方法是由 SkexGen 引入的,它使用编码簿将草图的几何和拓扑结构的控制分离出来,通过学习这些编码可以选择性地指导生成具有相似拓扑或几何特征的形状。Yang 等人从工程草图中学习模块化的“概念”,以捕捉重复的设计模式,并帮助进行基于图像条件的生成和自动完成任务。
▲ 图6:工程草图构成了参数化 CAD 的二维基础。几何基元,如圆和线(左),被表示为第一列的节点。草图约束被应用于几何基元,在第二列中表示为节点。第三列按频率顺序列出了约束类型。节点的顺序(从上到下)是按照 Ganin 等人的学习模型的生成顺序。
5.3 矢量图形生成
工程草图之外还有一个矢量图形领域,它也是用二维几何元素来展示可扩展的图形艺术作品,比如线和贝塞尔曲线。一个 SVG 文件本质上就像是一个简单的程序,它使用各种参数化函数(比如 moveTo、lineTo、cubicBezier)的组合来生成各种几何图形。早期有个叫 SVG-VAE 的深度学习方法,用基于 LSTM 的 VAE 对字体字符进行训练来生成矢量图形。
还有一个叫 DeepSVG 的方法,它用非自回归 Transformer 的结构展示了字体字符和图标的生成。虽然这些方法都很有潜力,但生成的结果却缺少了人类设计矢量图形中常见的规律性,比如对称、同心或切线曲线。为了克服这个限制,最近的一些工作尝试使用替代的矢量图形表示方法。其中有个叫 DeepVecFont 的项目,它采用混合的光栅/矢量表示法。
▲ 图7:Im2Vec 系统学习一个神经网络,可以在矢量图形程序之间进行重建、合成和插值。它使用了一个端到端的训练设置,带有一个可区分的矢量图形光栅器,避免了将真实的 SVG 程序作为训练数据的需要。
5.4 逆向二维图形
除了图形的生成,最近的文献还研究了从近似输入(如图像或手绘草图)中恢复二维形状程序的逆向问题。Ellis 等人介绍了一种将简单的手绘转换为程序表示的方法,该方法捕获了人类设计中常见的规律性,如对称性、重复性和结构重复使用。这种方法使用神经引导的搜索来从输入的草图中提取原始的图形元素,然后通过基于约束的程序合成来找到生成这些原始元素的程序。
Guo 等人展示了如何利用神经引导来学习具有分支结构的像素图像的 L 系统表示,正如在树木和其他自然模式中发现的那样。Ellis 等人使用强化学习来合成简单的二维 CAD 程序,以再现输入形状;同样,SPIRAL 使用 RL 和对抗学习来合成简单的绘画程序,以再现输入图像。Im2Vec,如图 7 所示,使用一个可区分的光栅化管道和输入图像与光栅化生成的矢量图形之间的重建损失。
▲ 图8:在 LOGO 图形任务上使用 DreamCoder 学习的程序库实例。学习到的例程包括绘制曲线族的参数化例程(左),以及将整个子程序作为输入的高阶函数(右)。
▲ 表3:第 6 节中讨论的神经符号三维形状建模的工作总结,每种方法在设计空间中的位置。* Ritchie 等人对他们的神经语言基元使用监督训练。
6.1 推断三维形状的程序
许多方法已经研究了如何推断三维物体的底层结构。换句话说,想找到一种能够很好地表示输入形状的程序,这样就可以对底层三维物体进行分析或操作。这个问题是程序合成的一个子问题,需要根据三维物体的视觉表现来推断出与之几何匹配的程序输出。这个问题有时也被称为视觉程序归纳。
在这个领域中,一种常见的方法是将程序线性化成标记序列。然后可以训练一个程序推理网络,根据视觉数据的条件自动生成程序标记。在 Fusion 360 Gallery 中,一个模型通过对人类编写的程序进行有监督的训练,学会将 3D 形状表示为草图和挤出的 CAD 操作序列。虽然当有程序数据集可用时,监督学习是首选策略,但在许多领域和语言的组合中缺乏这种信息。在没有程序数据集可用的情况下,一些方法研究了如何使用强化学习来重建作为命令序列的三维形状。
CSGNet 使用波束搜索,并在自回归推理网络的指导下找到相对于输入形状具有低重建误差的 CSG 程序。然后可以通过启发式细化步骤进一步改进这些程序的参数。Ellis 等人采用了一种顺序蒙特卡洛搜索的方法,其中一个合成代码的策略网络和一个学习评估部分程序前景的价值网络共同引导搜索过程。他们使用一个 REPL(读取-评估-循环)来限定程序搜索,将其建模为一个马尔科夫决策过程(MDP),其中每个网络对由部分构建的程序执行输出所代表的状态进行推理。尽管政策梯度强化学习提供了一个不依赖于真实程序数据集的解决方案,但由于高方差梯度,它的收敛速度和性能都不太稳定。
一些先前的工作已经开发了专门针对其特定领域的形状程序推断方法。当推断一个以输入草图为条件的三维 CAD 模型时,网络的噪声预测可以通过拟合程序映射到符号 CAD 操作而被规范化。在 Sketch2CAD 框架中,一个网络被训练来预测与分段草图笔画对应的 CAD 操作。
Free2CAD 通过额外学习如何将一个完整的草图分割成可以被映射到 CAD 操作的组来概括这个系统(图 10)。由于旨在逆向工程 CAD 模型的方法的搜索空间可能是巨大的,一些方法已经研究了启发式方法,使问题更容易解决。区域图将三维形状的边界表示转换为区域的划分。虽然这种分区允许使用列举式搜索策略,但用神经模块进一步引导这种搜索,可以改进程序。这些特定领域的方法在其各自的应用中表现良好,但它们依赖于启发式方法和设计原则,不容易被推广到其他领域。
一个主要的困难是神经符号模型中的梯度不能在符号元素之间流动,这导致端到端学习变得复杂。为了解决这个问题,有一种方法是训练一个系统,在这个系统中,用可区分的代理替换符号化的 DSL 组件。然后在推理时,这些代理可以被类似输出的 DSL 表达式所取代。在 Lambourne 等人的研究中,他们使用一个网络学习可区分的挤出物集合,这些挤出物是从人类编写的程序中学习到的,用来重构目标形状。
在推理过程中,这些挤压被来自输入集合的观察轮廓所取代,形成一个完整的 CAD 操作序列来重建输入形状。在 Point2Cyl 中,通过将可区分的挤压代理与布尔操作相结合,一个网络学习表示一个形状。然后,这些代理可以通过可微分的闭合形式转换为挤压圆柱,从而生成一个可编辑的 CAD 模型。这种带替换的松弛方案允许进行端到端的学习,输出结果具有高保真度,但需要对架构的构建和替换方案具有特定领域的洞察力。
为了进一步推动这个趋势,一些方法学习如何以纯粹的端到端方式推断 3D 形状程序,通过设计神经架构作为 DSL 执行器的平滑放松。某些 DSL 语言比其他语言更适合这种方法。例如,在 CSG 中,基元很容易区分,硬的布尔集操作可以被软的版本所替代。但这些方法使用的神经结构对于程序结构的限制性约束往往是有限的。
作者在图 11 中描述了 CAPRI-Net 这样一种方法的结构。在他们的描述中,基元通过相交转化为凸点,通过凸点的组合形成左右形状,最终输出结果是左右形状之间的差异。在 CSG-Stump 中,输出的 CSG 程序是基元或基元互补的交点的组合。ExtrudeNet 在 CAPRI-Net 架构的基础上进行了扩展,使用二维草图进行挤压,同时保持端到端的可区分性。
▲ 图11:CAPRI-Net 推断出一个重建输入形状的 CSG 程序。它的神经结构作为一个 CSG 执行引擎,限制了它可以发现的程序结构类型,但允许系统以端到端方式进行训练。
6.2 三维形状的生成
应用:材料和纹理
结论和未来展望
在本文中,作者回顾了神经符号模型的技术,这种模型结合了程序模型和机器学习的最佳特点,用于生成计算机图形应用程序的视觉数据。作者为这种模型定义了一个正式的设计空间,为组织不同的神经符号模型实例提供了一个框架。
然后,作者调查了在 2D 形状建模、3D 形状建模以及材料和纹理建模方面的最新神经符号建模工作,并将每个先前的工作放入设计空间中。除了组织过去的工作,设计空间还有另一个好处:它可以识别出先前工作尚未涉及的空间区域,这些区域可能需要进一步探索。考虑到这一点,以下是计算机图形学背景下神经符号建模未来工作的一些未解决问题和机会。
新的应用领域:也许未来工作最直接的机会是将本报告中描述的一些技术应用于其他图形领域的数据建模。任何类型的视觉数据都是公平的游戏,但特别值得关注程序化表示已被证明有用的领域。一个这样的例子是着色器编程,这是一个存在大量数据存储库的领域。角色动画和行为建模也值得研究,因为一些人群模拟软件已经使用手工制作的动画程序。该报告涵盖了制造感知 3D 形状建模方面的一些最新工作;其他制造感知设计领域值得探索。例如,服装的缝纫图案表现出反复出现的结构模式,神经符号模型可以学习将其预测为程序。最后,在与计算机图形相关的非视觉领域也存在机会。例如,游戏可以使用音乐的程序表示来动态地改变他们的配乐以响应玩家的动作;神经符号建模技术可能会为该应用程序带来新功能,或者可以更自动地生成此类表示。
更复杂的程序:学习生成具有复杂结构的生成程序是一个具有挑战性的问题;因此,在本报告中介绍的神经符号建模的许多早期工作都使用简单的语言(例如,用于 3D 形状建模的 CSG)。为了超越研究实验室并对现实世界的设计应用有用,神经符号模型必须能够使用丰富的、功能齐全的领域特定语言生成复杂的程序:例如,完整的 CAD 语言,如 OpenSCAD,或着色语言比如 GLSL。MatFormer 模型以详细的 Substance 材质图的形式生成程序,是朝这个方向迈出的一步。然而,这个模型是在一个大型的人工程序数据集上训练的,这给我们带来了下一个未解决的问题:
在没有直接监督的情况下学习: 神经符号模型学习生成程序的最直接方法是对人编写的程序进行训练。然而,对于大多数感兴趣的语言,此类数据很少能大规模获得。在没有这种监督的情况下学习,尤其是在目标语言变得更加复杂的情况下,仍然是一个挑战。设计空间为此设置确定了三种学习方法:平滑放松、强化学习和自举。这些方法中的每一种都值得进一步研究:是否可以为新语言设计更通用的平滑放松?RL 文献中是否有新技术可以很好地合成生成程序?是否可以扩展 PLAD 等引导方法以处理更复杂的语言,可能涉及层次结构?
发现新语言: 到目前为止,神经符号建模的工作以现有的特定领域语言为目标,可能通过添加新的抽象来修改它们。是否有可能发明全新的语言,以最好地适应正在建模的数据领域?神经符号模型使考虑这个问题成为可能:可以想象学习一组神经基元,它们代表被建模数据域的视觉“原子”(例如对象、部分),然后学习一组组合这些原子的基元函数创建更复杂的视觉结构。发现的语言可以适应其所训练的特定数据分布,从而为缩写 “DSL” 赋予新的定义:分布特定语言。
捕捉用户意图: 神经符号模型的有用性在很大程度上取决于其任务规范捕捉用户意图的程度。在本规范的输入端,支持更多输入类型有助于使神经符号模型对更广泛的用户群更有用。在定义设计空间(第 3.1 节)时,已经提到了几种可能值得未来探索的新型输入。例如:目前不知道任何先前的神经符号模型将文本提示作为输入,尽管这似乎是一种指定用户意图的吸引人的方式(如果文本到图像生成器的最近成功是任何指标)。这种自然语言输入可以指定要生成的视觉数据、将生成该数据的程序或两者的所需属性(包括两者之间的联系,例如,应该使用特定的程序构造来生成特定的视觉特征)。
在任务规范的输出端,神经符号模型必须生成可供人们使用的程序。如何评估程序的可用性,以及如何鼓励神经符号模型生成此类程序?如第 3.3 节所述,大多数先前工作考虑的唯一先验程序结构是对较短程序的偏好。这可以通过诉诸信息论或奥卡姆剃刀原理来证明,但不适用于可用性。事实上,过短的程序可能变得无法使用。此外,不同的用户可能喜欢不同的程序结构。对于程序的可用性,是否有比程序长度更好的先验?用户指定他们对程序结构的偏好的有效机制是什么?
人类解释和交互: 虽然程序表示具有暴露可解释结构的关键优势,但对程序进行推理和操作通常非常具有挑战性,需要领域和编码专业知识。通过将程序表示与学习相结合,可以在三个基本方向上推进符号推理:解释、操作和合成。
代码解释是指分析代码的能力:暴露其结构、功能和潜在的错误。编程语言社区通过使用定理证明器或 SMT 求解器来检测和暴露错误,在此领域取得了重大进展。然而,这些方法在规模和领域上仍然受到限制。如何利用机器学习的进步来帮助检测代码错误并揭露它们?这样的系统能否超越检测并提出解决方案?对于生成可视化输出的代码,操作对于实现定制和迭代设计极为重要。
虽然最近有一些工作描述了基于视觉输出的直接操作来优化代码的技术,但这些方法在允许的变化类型方面存在限制。它们只允许改变程序的参数,而不能改变其结构。此外,现有技术很难从根本上推断用户的意图,因为直接的视觉操作只提供了部分规范(因此有些模棱两可)。
那么神经符号模型如何应对这些挑战,实现更广泛的变化类别,不仅仅局限于参数的修改,还需要对程序进行重写呢?是否可以利用现有的数据集或从用户的交互中提取信息,以学习消除部分规范的歧义呢?典型的生成视觉输出的程序设计具有层次结构和组合结构。这种设计决策不仅对于人类可理解的编辑和交互至关重要,而且允许分析方法对视觉模型的不同语义部分进行推理。
更多阅读
#投 稿 通 道#
让你的文字被更多人看到
如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。
总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。
PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学术热点剖析、科研心得或竞赛经验讲解等。我们的目的只有一个,让知识真正流动起来。
📝 稿件基本要求:
• 文章确系个人原创作品,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注
• 稿件建议以 markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题
• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬,具体依据文章阅读量和文章质量阶梯制结算
📬 投稿通道:
• 投稿邮箱:hr@paperweekly.site
• 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者
• 您也可以直接添加小编微信(pwbot02)快速投稿,备注:姓名-投稿
△长按添加PaperWeekly小编
🔍
现在,在「知乎」也能找到我们了
进入知乎首页搜索「PaperWeekly」
点击「关注」订阅我们的专栏吧