ww优德88官网_优德w88苹果手机版本_w88官方

admin1个月前174浏览量

全文共5838字,估计学习时长20分钟或更长


图片来历:unsplash.com/@alinnnaaaa


神常常微分方程学习动力体系的图画


今日,本文将带你回忆2018年度神经信息处理体系大会(NIPS)中的最佳论文奖:《神常常微分方程》(Neural ODEs)Neural Ordinary Differential Equations。

论文传送门:https://arxiv.org/abs/1806.07366


这篇文章的重点将介绍神常常微分方程的实践用处、运用这种所需的神经网络类型的办法、原因以及可行性。

GitHub代码传送门:https://github.com/Rachnog/Neural-ODE-Experiments



为什么需求重视常微分方程?


首要,快速回忆一下什么是常微分方程。它描绘了某个变量(这便是为什么是常微分)在某个进程中的改变,这种随时刻的改变用导数来表明为:


简略的常微分方程比方


假如存在一些初始条件(改变进程的起始点),并且想要调查该进程将怎么开展到某个终究状况的话,咱们可以讨论此微分方程的求解。函数解也称为积分曲线(因为可以对方程进行积分得到解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/EulersMe


请拜访图片下面的链接以取得更具体的阐明。但终究,关于此方程,咱们可得出一个十分简略的公式:


http://tutorial.math.lamar.edu/Classes/DE/EulersMe



在n个时刻步长的离散网格上的解为:


http://tutorial.math.lamar.edu/Classes/DE/EulersMe


ResNets是常微分方程的解吗?


当然!y_{n+1} = y_n + f(t_n, y_n) 仅仅ResNet中的一个残差衔接,其间某个层的输出是 f()层自身的输出与该层y_n的输入的总和。这基本上是神常常微分方程的首要思维:神经网络中的残差块链基本上是用欧拉法来求解常微分方程。

在这种状况下,体系的初始条件是“时刻”0,它表明神经网络的第一层,因为x(0)将作用于正常输入,这可以是时刻序列、图画,以及任何你想要的!“时刻” t的终究条件是神经网络的希望输出:标量值、表明类的或其他任何东西的向量。

假如这些残差衔接是欧拉法的离散时刻步长,那么就意味着只需挑选离散计划,可以调理神经网络的深度。因而,可以使解(又叫神经网络)更准确或更大略,乃至使它延伸至无限层!


具有固定层数的 ResNet与具有灵敏层数的常微分方程网之间的差异


欧拉法是不是过于原始了?的确如此,所以让咱们用一些笼统的概念来替代ResNet 或是 EulerSolverNet,比方ODESolveNet,其间ODESolve将是一个函数,它供给了一个比欧拉法更准确的常微分方程(简略地说:神经网络自身)处理计划。网络体系结构现在或许如下所示:

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


咱们忘掉了一件事……神经网络是一个可微函数,所以咱们可以用依据梯度的优化进程来完善它。咱们应该怎么经过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()法规划“反向传达”梯度


简而言之,随同体系与描绘该进程的原始动力体系一同,经过链式规矩(即众所周知的反向传达的本源地点)描绘后续进程的每个点的导数状况。正是由此可以得到导数的初始状况,并以相似的办法,经过一个函数的参数即动力学建模(一个“残差块”,或“旧”欧拉法的离散进程)。

主张观看论文作者之一的演示文稿,来获取更多信息:


神常常微分方程的或许运用


首要,与“正常ResNet”比较的优势和动机:

· 高效率内存:在反向传达时,不需求存储一切参数和改变率。

· 自拟合核算:可用离散化计划来平衡速度和精度,并且,在练习和推理时会有不同的离散化计划。

· 高效率参数:邻近“层”的参数主动绑定在一同(参阅:https://arxiv.org/pdf/1806.07366.pdf)。


· 对新式可逆密度模型进行流程规格化。

· 接连时刻序列模型:接连界说的动力学模型可以主动包括在恣意时刻抵达的数据。

依据这篇文章,除了用ODENet替代ResNet来完结核算机视觉外,还存在一些现在无法付诸实践的运用:

· 将杂乱的常微分方程紧缩为单个动力学建模神经网络。

· 将其运用于短少时刻步长的时刻序列。

· 可逆流程规格化(超出此文章的规模)。

关于不足之处,请参阅原论文。有了足够的理论后,现在来看看一些实例。

学习动力学体系

正如之前所展现的,微分方程广泛运用于描绘杂乱的接连进程。当然,在实践生活中,咱们把它们看成是离散的进程,最重要的是,在时刻步长 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/),并给出了翔实的解说。在接下来的几末节中将展现所树立的动力学体系模型在代码中的表现和体系怎么跟着时刻演化以及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)




上边是相空间,下边是时刻-空间。直线代表实在的轨道,虚线代表神常常微分方程体系学习的改变进程。

随机矩阵函数

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





上边是相空间,下边是时刻-空间。直线代表实在的轨道,虚线代表神常常微分方程体系学习的改变进程。

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.]])





上边是相空间,下边是时刻-空间。直线代表实在的轨道,虚线代表神常常微分方程体系学习的改变进程。


非线性函数

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




上边是相空间,下边是时刻-空间。直线代表实在的轨道,虚线代表神常常微分方程体系学习的改变进程。

如上所示,单个“残差块”不能很好地学习这个进程,所以或许会使其愈加杂乱,以应对随后的函数。

神经网络函数

运用带有随机初始权值的多层感知器充沛确认函数的参数:

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



左面是相空间,右边是时刻-空间。直线代表实在的轨道,虚线代表神常常微分方程体系学习的改变进程。

此处的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),
)




左面是相空间,右边是时刻-空间。直线代表实在的轨道,虚线代表神常常微分方程体系学习的改变进程。

现在基本上可以依照预期作业了,请勿忘掉查看代码。


作为生成式模型的神常常微分方程


论文作者还宣称可以经过运用神经节点作为VAE结构的一部分来树立生成时刻序列模型。那么作业原理怎么呢?


图片来自原论文


· 首要,运用一些“规范”时刻序列算法对输入序列进行编码,例如RNN,以进行进程中的初度嵌入。

· 经过神常常微分方程运转嵌入,完结“接连”嵌入

· 从VAE的“接连”嵌入中康复初始序列。

为证明此概念,咱们可以从存储库中从头运转代码,它好像在学习螺旋轨道方面运转杰出:



点代表采样噪声轨道,蓝线是实在轨道,橙线代表康复轨道和插值轨道。

随后,咱们可以从心电图(ECG)转换为 x(t)认为时刻-空间,x`(t)为微分-空间的相图(如本文所示),并测验拟合不同的VAE设置。这种用例关于像MAWI BandMawi Band这样的可穿戴设备或许十分有用,因为有噪声或中止的信号,咱们有必要康复它(实践上咱们是在深度学习的协助下完结的(the help of deep learning),但心电图是一个接连的信号,不是吗?)不幸的是,它并没有很好地保持一致,显现出了一切过度拟合于单一办法的跳动痕迹。




相空间。蓝线—实践轨道,橙线—抽样轨道以及噪声轨道,绿线—主动编码轨道。




时空。蓝线-实践信号,橙线-抽样信号和噪声信号,绿线-主动编码信号。

咱们还可以测验另一个试验:只在每个跳动的部分研讨该主动编码器,并从中康复整个波形(即外推出一个信号)。不幸的是,无论怎么进行超参数和数据预处理,将这段信号向左或向右外推,都无法得出任何有意义的成果。或许读者们可以协助处理这个问题。


下一步是什么?


很明显,神常常微分方程是为了研讨相对简略的进程而规划的(这便是为什么标题中有“常”字),所以需求一个可以对更丰厚的函数族建模的模型。已经有两种风趣的办法:

· 扩展神常常积分方程: https://github.com/EmilienDupont/augmented-neural-odes

· 神经跳动随机DE: https://www.groundai.com/project/neural-jump-stochastic-differential-equations/1

当然,咱们还需求时刻来进行探求。究竟神常常微分方程现阶段无法投入实践。这自身是个巨大的主意,现在只存在两个实践运用:

· 在经典神经网络中运用ODESolve()层来平衡速度/精度折衷。

· 将惯例常微分方程“紧缩”到神经架构中,以将其嵌入规范数据科学流水线中。

留言 点赞 重视

咱们一同共享AI学习与开展的干货

欢迎重视全渠道AI垂类自媒体 “读芯术”

最新评论