迈向机器学习的一小步:基于 Taichi 自动微分的“魔法喷泉”

您好,欢迎访问我们的网站,我们将竭诚为您服务!

迈向机器学习的一小步:基于 Taichi 自动微分的“魔法喷泉”

时间:2022-10-02 19:26:37 阅读:108
可微分编程在科学计算与人工智能领域都有广泛的应用,自动微分(Automatic Differentiation)是一种对指定程序自动求导的技术,是实现可微分编程的重要工具。目前,Taichi Lang支持反向模式自动微分,允许用户在Taichi kernel中编写可微分代码。

  Taichi Lang通过Python scope内的轻量级tape和kernel内部的源码转换(Source Code Transformation)来实现自动微分。tape记录下启动的Taichi kernel,源码转换在编译期间生成gradient kernel,最后tape在反向传播期间以逆序重放gradient kernel。

  可微分物理仿真器是机器学习系统的常用组件,其提供的梯度信息可以使机器学习的收敛速度比无梯度算法(如model-free reinforcement learning)快整整一个数量级,在机器人技能学习、形态优化、物理仿真学习等领域有重要应用。Taichi Lang利用其原生基础架构生成高性能的梯度kernel,这使得借此实现的自动微分功能十分适合进行物理仿真。

  接下来,让我们一起动手实践:用Taichi Lang及其自动微分系统实现一个可微分物理仿真器。

  动图封面

  目录Contents

  01可微分光滑粒子流体力学仿真器

  02仿真器

  03神经网络

  04控制器

  05开始训练!

  01可微分光滑粒子流体力学仿真器Differentiable Smooth Particle Hydrodynamics Simulator

  方法论Methodology

  光滑粒子流体动力学方法(SPH)是一种用于模拟连续介质力学的计算方法,多用于固体力学和流体力学的仿真。SPH是一种基于粒子的仿真方法——即拉格朗日法,适合模拟喷泉等自由表面的流动。

  控制与决策是人工智能领域的一类经典问题,我们可以尝试用可微分物理仿真来解决一个简单的控制问题。本篇文章中,作者将用Taichi Lang建一座“魔法”喷泉,喷泉应以最小的努力尽快击中指定目标。创建这座喷泉需要两个组件:一个是流体仿真器,一个是控制器。仿真器用来模拟水流的运动,控制器用来实现喷泉的“魔法”——驱动水流,而神经网络则用来拟合决定控制策略的函数。

  02仿真器Simulator

  流体的运动常常用纳维斯托克斯(N-S)方程来描述。流体仿真需要求解N-S方程,求解过程涉及压力与速度的解算。在该部分,我们将介绍一个基于弱可压光滑粒子流体动力学(WCSPH)的可微流体仿真器是如何逐步实现的。

  可微分物理仿真器Differentiable physical simulator

  在不需要梯度信息的情况下,一个物理仿真器只缓存一个旧状态和一个新状态,这就是双缓存策略:物理仿真器每进行一次时间步的更新,两个缓存就会互换一次状态。基于链式法则计算导数需要物理量的所有历史状态,为了保留这些状态,仿真过程会被展开,即物理量每一仿真步的值都会被记录下来。

  弱可压缩光滑粒子流体动力学Weakly Compressible Smooth Particle Hydrodynamics

  WCSPH是SPH的变体。与严格保证液体不可压缩的常用投影方法不同,WCSPH通过自定义状态方程(例如Tait方程)允许弱可压,避免了求解泊松方程耗时的问题。我们不会在这里深究SPH的原理。有兴趣的读者可以阅读Eurographics Tutorial 2019了解更多。

  仿真展开Unrolled simulation

  由于整个仿真的历史都需要被存储下来,相关物理量分配内存时就需要增加一个维度steps。

  pos=ti.Vector.field(3,float)

  vel=ti.Vector.field(3,float)

  acc=ti.Vector.field(3,float)

  den=ti.field(float)

  pre=ti.field(float)

  ti.root.dense(ti.ijk,(batch_size,steps,particle_num)).place(pos,vel,acc,den,pre)

  密度更新Density update

  粒子的密度由其相邻粒子的密度之和决定。由于本示例的粒子数量有限(小于10k),为了简单起见,我们不对邻域搜寻过程应用任何加速算法(例如网格法、紧凑哈希),我们选择poly6作为核函数。

  压力更新Pressure update

  基于Tait方程更新压力。为了避免出现颗粒密度不够的情况,低于静水密度的密度值会被统一拉齐到设定的下限。

  压力和粘性力Pressure and viscosity force

  压力和粘性力的形式参见这篇论文Weakly compressible SPH for free surface flows

  时间积分Time integration

  时间积分采用半隐式欧拉方法。被水柱冲击的目标立方体的粒子速度始终设置为零。

  仿真域的边界处理Boundary handling

  为简单起见,边界的处理采用了基于碰撞的方法。流体粒子在与仿真域边界碰撞时会被推回仿真域,由系数damping控制碰撞过程中产生的速度损失。

  03神经网络Neural network

  得益于taichiLang的自动求导功能,利用其搭建的神经网络可以无缝嵌入同样基于Taichi Lang的物理仿真器。在动手实现控制器之前,我们先用Taichi Lang来搭建神经网络训练的流水线,这包括两个核心组件:神经网络和优化器。接下来,作者将向我们展示如何实现基于线性层(全连接层)的神经网络和随机梯度下降(SGD)优化器。taichi https://taichi-lang.cn/
郑重声明:文章内容来自互联网,纯属作者个人观点,仅供参考,并不代表本站立场 ,版权归原作者所有!

上一篇:首发荣耀60SE!荣耀50系列开启预约:有两款

下一篇:关于网络映射有哪些应用?都有些什么要了解的呢?

相关推荐

返回顶部