【问题标题】:How to guarantee convergence when training a neural differential equation?训练神经微分方程时如何保证收敛?
【发布时间】:2021-05-19 15:11:05
【问题描述】:

我目前正在完成 Julia 语言 (https://tutorials.sciml.ai/html/exercises/01-workshop_exercises.html) 的 SciML 教程研讨会练习。具体来说,我坚持练习 6 第 3 部分,其中涉及训练神经网络以逼近方程组

function lotka_volterra(du,u,p,t)
  x, y = u
  α, β, δ, γ = p
  du[1] = dx = α*x - β*x*y
  du[2] = dy = -δ*y + γ*x*y
end

目标是用神经网络替换 du[2] 的方程:du[2] = NN(u, p) 其中 NN 是一个神经网络,参数为p,输入为u

我有一组网络应该尝试匹配的样本数据。损失函数是网络模型输出与样本数据的平方差。

我定义了我的网络 NN = Chain(Dense(2,30), Dense(30, 1))。我可以让Flux.train! 运行,但问题是有时神经网络的初始参数会导致 10^20 量级的损失,因此训练永远不会收敛。我的最佳尝试是使用 ADAM 优化器在大约 1000 次迭代中将损失从最初的大约 2000 降低到大约 20,但我似乎无法做得更好。

如何确保我的网络始终可训练,有没有办法更好地收敛?

【问题讨论】:

    标签: neural-network differentialequations.jl flux-machine-learning


    【解决方案1】:

    如何确保我的网络始终可训练,有没有办法更好地收敛?

    See the FAQ page on techniques for improving convergence。简而言之,大多数 ML 论文的单次拍摄方法非常不稳定,不适用于大多数实际问题,但有一连串的技术可以提供帮助。最好的之一是multiple shooting, which optimizes only short bursts (in parallel) along the time series

    但是在小区间进行训练并增加区间是可行的,使用更稳定的优化器 (BFGS) 也可以。您还可以权衡损失函数,以便更早的时间意味着更多。最后,您可以以类似于多次拍摄的方式进行小批量处理,即从一个数据点开始,只求解下一个(事实上,如果您实际查看原始的神经 ODE 论文 NumPy 代码,他们并没有按照解释的那样执行算法而是使用这种形式的采样来稳定螺旋 ODE 训练)。

    【讨论】:

      猜你喜欢
      • 2017-10-12
      • 2012-08-16
      • 2015-08-03
      • 1970-01-01
      • 2019-01-10
      • 2014-03-06
      • 2019-03-06
      • 2015-06-11
      相关资源
      最近更新 更多