Neural ODE 神经常微分方程

Neural ODE

ODE常微分方程
欧拉法求解:欧拉法求解过程是一个递归的过程,这个思想和牛顿法、梯度下降法是相似的。并且它将函数离散化,分割成一个个小段来求解。欧拉法求解的常微分方程的形式通常为在这里插入图片描述
在这里插入图片描述
图片来自知乎Neural ODE,这个世界终究是连续的

使用欧拉法解方程的例子:摘自欧拉法(Euler‘s method)求常微分方程(ODE)近似解
在这里插入图片描述
代码:

import numpy as np
import matplotlib.pyplot as plt
y0=1 #初始条件
def f(x,y):
    return y-2*x/y
def Eular(y0,n,f):
    y=[y0] #储存各个点的函数值
    y0=y0
    for x in np.linspace(0,1,n):
        '''求函数在区间[0,1]近似解,分n份'''
        y1=y0+f(x,y0)/n
        y.append(y1)
        y0=y1
    return y
y=Eular(1,10,f=f)
x=np.linspace(0,1,len(y))
plt.plot(x,y,color='blue')
plt.show()

神经常微分方程:
在这里插入图片描述
求解常微分方程时,可以用ODEsolver。它就相当于是计算器,我们给出初始to,h(t0),神经网络,要求的时间t ,它就可以自动求解。
在这里插入图片描述
ODEsolver本质上就是用数值解法一步步求解到T。数值法求wi+1是由wi加上步长h*区间上的平均变化率。不同的算法,对平均变化率的取法不同。
Euler方法的平均变化率取的ti点的导数
改进Euler:
先由当前点用欧拉法求出下一点wi+1’的值,再用当前点梯度和预报点梯度的平均 作为 区间平均变化率 求解真正wi+1点的值。
在这里插入图片描述
龙格-库塔方法比Euler有更高的精度。
rk2:
先用欧拉法估计h/2处的梯度,再用这个值计算wi+1。

rk4:
wi+1由wi和四个梯度的加权平均确定,步长 h。
k 1 是这一步开始处使用欧拉方法的导数;
k 2 是 h/2 处的导数,在 k 1基础上;
k 3 依旧是 h/2 处的导数,在k2基础上;
k 4 是在k3基础上终点h 处的导数。
几种数值解法和真实解的对比,RK方法的准确率比较高。

一般的反向传播算法 要保存前向计算过程中的activation激活图。而ODE使用adjoint method (伴随方法),不需要保存激活图也能计算梯度。
因为伴随方法 把反向过程 看作一个新的ODE初值求解问题 (IVP),直接用ODE Solver计算得到梯度值。这样减少内存占用。

应用:

最近的研究发现梯度下降算法的迭代过程(GDA) 可以看作是常微分方程 (ODE) 的欧拉离散化。
在这里插入图片描述
设计一个网络来估计我们要求的参数的梯度,这里是原型p。
有了估计的梯度后,使用odesolver求解p在指定时刻的值。这个指定时刻M由训练阶段使损失收敛的超参决定。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于提供的引用内容,我可以解释一下神经网络常微分方程(Node Neural Ordinary Differential Equations)的概念。 神经网络常微分方程是一种新型的神经网络模型,它将神经网络视为一个常微分方程ODE)系统,并使用ODE求解器来训练神经网络。与传统的神经网络不同,Node神经网络不需要离散的时间步骤,而是将神经网络的状态视为连续的时间流。这种方法可以更好地处理时间序列数据,并且可以更好地处理长期依赖性。 Node神经网络的基本思想是将神经网络的隐藏层视为ODE系统的状态,并使用ODE求解器来求解该系统的状态。在这种方法中,每个隐藏层都被视为ODE系统的一个状态变量,而神经网络的输出则是ODE系统的解。通过使用ODE求解器,可以在不需要离散时间步骤的情况下训练神经网络,并且可以更好地处理时间序列数据。 下面是一个使用Node神经网络进行时间序列预测的例子: ```python import torch from torchdiffeq import odeint # 定义ODE系统 class ODEFunc(torch.nn.Module): def __init__(self): super(ODEFunc, self).__init__() self.fc1 = torch.nn.Linear(1, 50) self.fc2 = torch.nn.Linear(50, 1) self.relu = torch.nn.ReLU() def forward(self, t, y): out = self.relu(self.fc1(y)) out = self.fc2(out) return out # 定义Node神经网络 class ODEBlock(torch.nn.Module): def __init__(self): super(ODEBlock, self).__init__() self.odefunc = ODEFunc() def forward(self, x): out = odeint(self.odefunc, x, torch.Tensor([0, 1])) return out[1] # 训练Node神经网络 model = torch.nn.Sequential(ODEBlock(), torch.nn.Linear(1, 1)) criterion = torch.nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.01) for i in range(1000): x = torch.randn(100, 1) y = torch.sin(x) y_pred = model(x) loss = criterion(y_pred, y) optimizer.zero_grad() loss.backward() optimizer.step() # 预测 x_test = torch.linspace(-5, 5, 100).reshape(-1, 1) y_test = torch.sin(x_test) y_pred = model(x_test) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值