Press "Enter" to skip to content

计算机图形也能自动可微:MIT学神的微分太极框架开源,论文已被ICLR 2020接收

去年5月,机器之心报道了 MIT 华人学神胡渊鸣等开源的计算机图形库—— 太极 。近日,这位作者联合其他研究者推出了自动微分版本的太极——微分太极。这一框架可以基于太极实现自动微分,在物理模拟优化方面有很高的性能和灵活性。这意味着太极从计算机图形学进入了机器学习的领域。

 

 

目前,一作胡渊鸣已在 GitHub 上开源了基于这一框架完成的 10个 物理模拟器,项目登上了 GitHub 热榜。而微分太极论文也已被 ICLR2020 接收。

 

项目地址:https://github.com/yuanming-hu/difftaichi

 

论文地址:https://arxiv.org/pdf/1910.00935.pdf

 

胡渊鸣也在 Youtube 上传了微分太极的论文解读视频。

 

10 个不同的物理模拟器

 

微分太极框架极大了提升了可微物理模拟器的性能和生产力。例如,利用微分太极框架的可微弹性对象模拟器(ChainQueen)的速度比TensorFlow实现快了 188 倍;微分太极框架的运行速度与 CUDA 实现相当,但代码缩短了 4.2 倍。

 

大多数可微模拟器可以在 2 至 3 小时内实现。以下是其中一些模拟器的动态展示图:

 

可微 2D 弹性对象模拟器

 

 

左: 梯度下降迭代步数 0; 右: 梯度下降迭代步数 80。

 

可微 3D 弹性对象模拟器

 

 

梯度下降迭代步数 40。

 

可微 3D 流体模拟器

 

 

梯度下降迭代步数 450。

 

可微高度场水模拟器

 

 

梯度下降迭代步数 180。

 

可微(对抗性)水渲染器

 

这种渲染器包含三个组件:可微水模拟、可微水渲染和可微 卷积神经网络 (CNN)。

 

 

可微水渲染器结构图。

 

实验结果表明,在经过水模拟和水渲染之后,VGG-16 网络框架将带有动态水纹的松鼠照片误识别为金鱼。

 

 

可微刚性物体模拟器

 

 

时间步长 2048,梯度下降迭代步数 20。

 

可微弹簧质点模拟器

 

 

时间步长 682,梯度下降迭代步数 20。

 

可微台球模拟器

 

微分太极还能模拟台球等其他包含多个物体的复杂场景。

 

 

左: 梯度下降迭代步数 0; 右: 梯度下降迭代步数 100。

 

微分太极怎样实现自动微分

 

太极原本是用于计算机图形计算和模拟的,为什幺要开发为微分框架呢?这是因为使用可微模拟器进行物理控制器优化,相比 model-free 的强化学习算法,可以提升 1 到 4 个量级的收敛速度。

 

微分太极是基于太极项目的,它能够使用源码转换的方式,对模拟步骤生成梯度。模拟程序由一个轻量的 tape 进行记录,并以降序方式返回核的梯度,实现端到端反向传播。

 

基本架构

 

 

图 1: (左)微分太极可以和神经网络控制器及物理模拟模块无缝结合,并向控制器或初始化转台参数更新梯度。 模拟过程通常有 512 到 2048 个时间步,每个时间步达到 1000 次并行运算。 (右)10 个基于微分太极构建的微分模拟器。

 

微分太极的主要目标是进行自动微分,即自动生成模拟器的梯度,而且对于传统的前向模拟器的代码改变保持最小。

 

为了保证性能和灵活性,研究者开发了这样的自动微分系统:在核内使用源码转换的方法进行微分,并使用轻量 tape 记录函数指针和属性,用于模拟微分。全局张量是计算梯度的检查点。

 

 

图 2: 自动微分架构。 (左)微分太极系统。 白色部分为来自太极语言的重用架构,蓝色为微分程序的扩展部分。 (右)Tape 记录了核的运行,在反向传播时以降序方式重放(replay)梯度核。

 

使用源码迁移进行局部自动微分

 

典型的太极核由多层循环和一个程序体组成。为了使后续的自动微分变得简单,研究者采用了两种代码迁移方式,分别为平整分支(flatten branching)和消除可变变量(eliminate mutable var),用于简化程序体:

 

 

图 3: 程序体从左到右逐渐被简化(C++代码)。

 

使用 Tape 进行端到端反向传播的全局自动微分

 

在微分太极中,研究者构建了一个轻量级的 tape,用于核的执行,使得梯度核可以以降序的方式重放。Tape 很轻量,它不保存中间结果,而是在前向模拟中记录核的名称和输入变量。

 

在一个微分太极的核启动的时候,核的函数指针和参数会被添加到 tape 中。当进行梯度计算的时候,系统会顺着降序的 tape,将记录的参数输入梯度核中获得梯度。需要注意的是,微分太极的自动微分会根据输入的全局张量而非输入参数进行梯度计算。

 

举个例子,假定我们的目标是优化三个弹簧质点组成的几何图形,在模拟结束的时候需要使它们组成的面积为 0.2。损失函数可定义如下:

 

 

程序使用「ti.Tape」记录前向核的运行。它会自动返回这些核的梯度。刚开始的时候,三角形有着 [0.1, 0.1, 0.14] 的三边长,而优化后的长度是 [0.600, 0.600, 0.529]。这意味着三角形需要根据胡克定律从小到大进行形变。

 

 

上图中的代码表示了三角形的形变过程。左侧的代码类似于 PyTorch 或 TF2.0 的训练过程:设定迭代次数,在前向计算后计算损失,并更新梯度。通过梯度优化的方式,计算机图形的模拟会变得更快更精确。

 

论文一作胡渊鸣简介

 

 

胡渊鸣是 MIT人工智能实验室(CSAIL)的博士生,师从 Fredo Durand 和 Bill Freeman 两位教授。

 

他从小就对计算机表现出极大的兴趣,因其在 2012 年全国高中学科奥赛(信息学)中的优异成绩而被保送至清华大学。

 

2017 年 7 月,胡同学作为优秀毕业生从清华大学姚班毕业。他在微软亚洲研究院跟随 Stephen Lin 博士实习时从事深度学习和计算机视觉相关工作。胡同学的本科论文主要研究的是使用强化学习和对抗学习的自动照片后期处理(发表在 SIGGRAPH 2018 大会上)。2018 年 11 月,胡同学在 Wojciech Matusik 教授的指导下完成其硕士论文。

 

本科论文链接:https://arxiv.org/abs/1709.09602

 

硕士论文链接:http://taichi.graphics/wp-content/uploads/2018/11/thesis_ChainQueen.pdf

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注