0

我目前正在完成 Julia 语言的 SciML 教程研讨会练习 ( https://tutorials.sciml.ai/html/exercises/01-workshop_exercises.html )。具体来说,我坚持练习 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,但我似乎无法做得更好。

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

4

1 回答 1

0

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

请参阅有关提高收敛性的技术的常见问题解答页面。简而言之,大多数 ML 论文的单次拍摄方法非常不稳定,不适用于大多数实际问题,但有一系列技术可以提供帮助。最好的方法之一是多重拍摄,它仅优化沿时间序列的短连拍(并行)

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

于 2021-05-21T12:17:41.493 回答