w88体育_w88官方网站_w88优德官方网站

优德88金殿_w88优德手机版本登录_w88优德体育88

admin3周前187浏览量

图:可视化的神经网络常微分方程学习动力体系

在本文中,我将测验扼要介绍一下这篇论文的重要性,但我将着重实践运用,以及咱们怎么运用这种需要在运用程序中运用各种神经网络。

原标题 | Neural ODEs: breakdown of another deep learning breakthrough

作 者 | Alexandr Honchar

翻 译 | had_in(电子科技大学)、HERAT(中山大学)、王鑫雨(山东科技大学)

编 辑 | Pita

大家好!假如你正在读这篇文章,意味着你一向留心着AI前沿技术。今日所要谈及的论题来自于NIPS2018,并且这篇文章仍是NIPS2018会议的最佳论文:神经常微分方程(Neural ODEs,论文地址:https://arxiv.org/abs/1806.07366)。在本文中,我将测验扼要介绍一下这篇论文的重要性,但我将着重实践运用,以及咱们怎么运用这种需要在运用程序中运用各种神经网络,假如能够的话。与平常相同,假如您想直接阅览代码,能够查看此GitHub储存库(https://github.com/Rachnog/Neural-ODE-Experiments),我主张您在Google Colab中发动它。

为什么咱们重视常微分方程呢?

首要,让咱们快速扼要归纳一下令人讨厌的常微分方程是什么。常微分方程描绘了某些由一个变量决议的进程随时刻的改动。这个时刻的改动经过下面的微分方程来描绘。

简略的常微分方程的比方

通常状况下,假如咱们知道了某些初始条件(进程开端的当地),并且咱们想了解这个进程将怎么改动成某些终究状况,咱们才干评论解这个微分方程。求解函数也被叫做积分曲线(由于咱们能够经过对这个方程积分得到方程的解x(t)).让咱们测验用SymPy软件包来解一下上面图片上的方程:

from sympy import dsolve, Eq, symbols, Function
t = symbols('t')x = symbols('x', cls=Function)deqn1 = Eq(x(t).diff(t), 1 - x(t))sol1 = dsolve(deqn1, x(t))

这将会得到下面的解:

Eq(x(t), C1*exp(-t) + 1)

其间C1为常数,能够在给定初始条件时进行确认。假如以恰当的办法给出微分方程,咱们能够用解析法进行求解,但通常是选用数值办法求解。最陈旧和最简略的算法之一是欧拉法:其间心思维是用切线逐渐迫临求解函数:

http://tutorial.math.lamar.edu/Classes/DE/EulersMethod.aspx

请拜访上图下方的链接能够取得更具体的解说,在最终,咱们得到了一个非常简略的公式,如下

http://tutorial.math.lamar.edu/Classes/DE/EulersMethod.aspx

其在n个时刻步长的离散网格上的解是

http://tutorial.math.lamar.edu/Classes/DE/EulersMethod.aspx

关于微分方程的更多细节,特别是怎么用Python编写它们以及它们的处理办法,我主张你去看看这本书(https://www.springer.com/gp/book/9783319781440),在化学、物理和工业领域中也有许多这种时刻演化进程的比方,均能够用微分方程来描绘。此外,关于微分方程与ML模型相关的其他主意,请拜访此资源(https://julialang.org/blog/2019/01/fluxdiffeq)。与此同时,细心看看欧拉方程,莫非它没有让你想起最近的深度学习架构中的任何东西吗?

残差网络是一种微分方程的解吗?

确实是这样的!y_{n+1} = y_n + f(t_n, y_n)便是ResNet中的一个残差衔接,表明该层的输出y_{n+1}是f(t_n,y_n)自身的输出和该层的输入y_n的总和。

假如咱们记住,这些残差衔接是欧拉法离散化的时刻步长,这意味着咱们能够经过挑选离散计划来调理神经网络的深度,从而使解(又叫神经网络)或多或少的准确,乃至使它像无限层!

固定层数的ResNet与能够灵敏改动层数的ODENet的差异

欧拉法是不是太粗糙了呢?确实如此,所以让咱们用一些笼统的概念来替代ResNet / EulerSolverNet,比方ODESolveNet,其间ODESolve是一个函数,它供给了ODE(低沉点:咱们的神经网络自身)的处理办法,其精度比欧拉法高得多。现在的网络架构或许是如下所示:

nn = Network( Dense(...), # making some primary embedding ODESolve(...), # "infinite-layer neural network" Dense(...) # output layer)

咱们忘了一件事…神经网络是一个可微函数,所以咱们能够用依据梯度的优化手法来练习它。咱们应该怎么经过ODESolve函数进行反向传达呢?在咱们的比方中,ODESolve函数实践上也是一个黑盒吗?在这儿,咱们能够运用一个由输入和动态参数组成的丢掉梯度函数。这种数学技巧叫做随同灵敏度法。关于更多细节,我将参阅原始论文(https://arxiv.org/pdf/1806.07366.pdf)以及这篇教程(https://nbviewer.jupyter.org/github/urtrial/neural_ode/blob/master/Neural%20ODEs%20%28Russian%29.ipynb),但其本质如下图所示(L代表咱们要优化的首要丢掉函数):

取得ODESolve法的反向传达梯度

简略地说,随同体系除了描绘初始的动态体系的进程外,还经过链式法则(这便是众所周知的反向传达法的关键所在),描绘了反向进程中每一点的导数状况。正是经过随同体系,咱们能够得到微分的初始状况,并以相似的办法,取得一个描绘动态体系的函数(“残差块”或欧拉法离散化进程)的参数。

神经网络常微分方程或许的运用场景

首要,让神经网络微分方程替代一般的残差网络的动机和优势如下:

  • 存储功率:咱们不需要在反向传达时存储一切的参数和梯度

  • 自适应核算:选用离散化计划,既能平衡速度和精度,又能在练习和推理进程中坚持不同的精度

  • 参数功率:将相邻的“网络层”的参数主动衔接在一起(见论文:https://arxiv.org/pdf/1806.07366.pdf)

  • 规范化流,是一种新式的可逆密度模型

  • 接连时刻序列模型:接连界说的动态进程能够方便地承受恣意时刻输入的数据。

依据这篇论文,除了将ResNet替换为ODENet用于核算机视觉之外,我现在以为有些还未运用的场景如下:

  • 将杂乱的微分方程紧缩成单个的动态建模神经网络

  • 将其运用于短少时刻步的时刻序列

  • 可逆规范化流(超出本博客的评论规模)

这种办法也有一些缺陷,请参阅原论文。在介绍了满足的理论后,让咱们现在看一些实践的比方。提示一下,一切的试验代码都在这儿(https://github.com/Rachnog/Neural-ODE-Experiments)。

学习动态体系

正如咱们之前所看到的,微分方程被广泛用于描绘杂乱的接连进程。当然,在实践生活中,咱们把它们看作是离散的进程,并且,最重要的是,在t_i的时刻步上或许会丢掉许多调查值。假定你想用神经网络来构建这样的一个体系。在经典的序列建模进程中,您会怎么处理这种状况呢?把它扔给递归神经网络,乃至不需要进一步规划模型。在这一部分中,咱们将查看神经网络微分方程怎么处理这个问题。

咱们的设置如下:

  1. 将微分方程界说为PyTorch的一个网络模块nn.Module

  2. 界说一个简略的(或许不是完好的)神经网络,它将在从h_t到h_{t+1}的两个接连动态进程之间树立动态模型,或许在动态体系的状况下,为x_t和x_{t+1}。

  3. 运转运用微分方程求解器反向传达进行的优化进程,并最小化实践动态进程和建模的动态进程之间的差异。

在接下来的一切试验中,神经网络都是如下所示(这应该足以用两个变量来模仿简略的函数):

self.net = nn.Sequential( nn.Linear(2, 50), nn.Tanh, nn.Linear(50, 2), )

咱们一切的比方都深受一个代码库(https://nbviewer.jupyter.org/github/urtrial/neural_ode/tree/master/)的启示,并这个代码库给出了非常好的解说。鄙人一末节中,我将展现咱们所建模的动态体系怎么运用代码进行可视化,以及体系怎么随时刻演化,以及ODENet怎么拟合相位图。

简略的螺旋形函数

在这儿以及接下来一切的可视化中,虚线代表拟合模型。

true_A = torch.tensor([[-0.1, 2.0], [-2.0, -0.1]])
class Lambda(nn.Module): def forward(self, t, y): return torch.mm(y, true_A)

左面是相位空间,右边是时刻空间。直线代表实在的轨道,虚线代表由神经ODE体系学习的演化轨道

随机矩阵函数

true_A = torch.randn(2, 2)/2.

左面是相位空间,右边是时刻空间。直线代表实在的轨道,虚线代表由神经ODE体系学习的演化轨道

Volterra-Lotka体系

a, b, c, d = 1.5, 1.0, 3.0, 1.0true_A = torch.tensor([[0., -b*c/d], [d*a/b, 0.]])

左面是相位空间,右边是时刻空间。直线代表实在的轨道,虚线代表由神经ODE体系学习的演化轨道

非线性函数

true_A2 = torch.tensor([[-0.1, -0.5], [0.5, -0.1]])true_B2 = torch.tensor([[0.2, 1.], [-1, 0.2]])
class Lambda2(nn.Module): def __init__(self, A, B): super(Lambda2, self).__init__ self.A = nn.Linear(2, 2, bias=False) self.A.weight = nn.Parameter(A) self.B = nn.Linear(2, 2, bias=False) self.B.weight = nn.Parameter(B) def forward(self, t, y): xTx0 = torch.sum(y * true_y0, dim=1) dxdt = torch.sigmoid(xTx0) * self.A(y - true_y0) +torch.sigmoid(-xTx0) * self.B(y + true_y0) return dxdt

左面是相位空间,右边是时刻空间。直线代表实在的轨道,虚线代表由神经ODE体系学习的演化轨道

正如咱们所看到的,单个“残差块”不能很好地学习这个进程,所以咱们会运用愈加杂乱的结构。

神经网络函数

让咱们运用多层感知器与随机初始化的权重构建一个彻底参数化的函数:

true_y0 = torch.tensor([[1., 1.]])t = torch.linspace(-15., 15., data_size)
class Lambda3(nn.Module): def __init__(self): super(Lambda3, self).__init__ self.fc1 = nn.Linear(2, 25, bias = False) self.fc2 = nn.Linear(25, 50, bias = False) self.fc3 = nn.Linear(50, 10, bias = False) self.fc4 = nn.Linear(10, 2, bias = False) self.relu = nn.ELU(inplace=True) def forward(self, t, y): x = self.relu(self.fc1(y * t)) x = self.relu(self.fc2(x)) x = self.relu(self.fc3(x)) x = self.relu(self.fc4(x)) return x

左面是相位空间,右边是时刻空间。直线代表实在的轨道,虚线代表由神经ODE体系学习的演化轨道

这儿2-50-2的网络作用非常不抱负,由于它太简略了,现在咱们添加网络的深度:

self.net = nn.Sequential( nn.Linear(2, 150), nn.Tanh, nn.Linear(150, 50), nn.Tanh, nn.Linear(50, 50), nn.Tanh, nn.Linear(50, 2), )

左面是相位空间,右边是时刻空间。直线代表实在的轨道,虚线代表由神经ODE体系学习的演化轨道

现在成果或多或少像有预期的作用了,不要忘掉查看代码:) (代码链接:https://github.com/Rachnog/Neural-ODE-Experiments)。

神经网络常微分方程作为生成模型

作者还宣称他们能够经过变分自编码器(VAE)结构构建一个时序信号生成模型,并将神经网络ODE作为其间的一部分。那它是怎么作业的呢?

原论文插图(https://arxiv.org/pdf/1806.07366.pdf)

  • 首要,咱们用一些规范的时刻序列算法对输入序列进行编码,比方RNN,以取得时序进程的初始嵌入向量。

  • 将嵌入向量输入到神经网络常微分方程中,得到接连的嵌入向量

  • 从接连的嵌入向量中,运用变分自编码器康复初始序列

为了证明这个观念,我仅仅从头运转了这个代码库中的代码,看起来在学习螺旋轨道方面作用比较不错:

点为采样的噪声轨道,蓝线为实在的轨道,橙色线为康复的和插值的轨道

下一步干什么呢?

  • 增强神经网络常微分方程: https://github.com/EmilienDupont/augmented-neural-odes

  • 神经跳动随机微分方程:https://www.groundai.com/project/neural-jump-stochastic-differential-equations/1

咱们也会花些时刻去探究:) 。

结 论

个人以为,神经网络常微分方程还没有准备好在实践中运用。这个主意自身很棒,从立异的水平来看,它让我想起杰弗里·辛顿(Geoffrey Hinton)的胶囊网络,但它们现在怎么样了呢?除了神经网络,这些主意在仅较简略的使命上才干显示出杰出的成果,在任何挨近实践运用或大规模数据集上都失利了。

现在我只能看到两个实践运用:

  • 在经典神经网络中,运用ODESolve层来平衡速度与精度

  • 将惯例常微分方程“紧缩”到神经网络结构中,将它们嵌入到规范的数据科学处理进程中。

就我个人而言,我期望这个方向进一步开展(我在上面展现了一些链接),使这些神经网络(常)微分方程能表达更丰厚的函数类,我将亲近重视这些信息。

* 注:相关链接可点击阅览原文拜访。

via https://towardsdatascience.com/neural-odes-breakdown-of-another-deep-learning-breakthrough-3e78c7213795

封面图来历:https://www.thetalkingmachines.com/article/neural-ordinary-differential-equations-0

最新评论