如何在 Julia 中调整贝叶斯 ODE 拟合的超参数?

问题描述

我一直在尝试使用不同的 ODE 方程来复制 https://diffeqflux.sciml.ai/dev/examples/BayesianNODE_NUTS/,但是我收到了没有不确定性量化的结果,是不是因为我做的初始值 u0 更高:

enter image description here

你能告诉我出了什么问题吗?

   using DiffEqFlux,OrdinaryDiffEq,Flux,Optim,Plots,AdvancedHMC,MCMCChains
using JLD,StatsPlots

function Arps!(du,u,p,t)
    y= u[1]
    #x,y = u
   # Di,b,n,tau = p
    n,tau = p
    #du[1]=dx=-(x * Di * x^b)
    du[1]=dy=-(n *((t^n)/tau) * y/t)
end
tspan=(1.0,50.0)
tsteps = 1:1:50
u0 = [16382.9]
p=[0.48,15.92]
prob_trueode = ODEProblem(Arps!,u0,tspan,p)
ode_data = Array(solve(prob_trueode,Tsit5(),saveat = tsteps))
ode_data =ode_data[1,:]

dudt= FastChain(FastDense(1,30,tanh),FastDense(30,1))

prob_neuralode = NeuralODE(dudt,saveat = tsteps)

function predict_neuralode(p)
    Array(prob_neuralode(u0,p))
end

function loss_neuralode(p)
    pred = predict_neuralode(p)
    loss = sum(abs2,ode_data .- pred)
    return loss,pred
end

l(θ) = -sum(abs2,ode_data .- predict_neuralode(θ)) - sum(θ .* θ)


function dldθ(θ)
    x,lambda = Flux.Zygote.pullback(l,θ)
    grad = first(lambda(1))
    return x,grad
end

metric  = DiagEuclideanMetric(length(prob_neuralode.p))

h = Hamiltonian(metric,l,dldθ)


integrator = Leapfrog(find_good_stepsize(h,Float64.(prob_neuralode.p)))


prop = AdvancedHMC.NUTS{MultinomialTS,GeneralisednoUTurn}(integrator)

adaptor = StanHMCAdaptor(MassMatrixAdaptor(metric),StepSizeAdaptor(0.45,prop.integrator))

samples,stats = sample(h,prop,Float64.(prob_neuralode.p),500,adaptor,500; progress=true)
losses = map(x-> x[1],[loss_neuralode(samples[i]) for i in 1:length(samples)])

################### RETRODICTED PLOTS: TIME SERIES #################
pl = scatter(tsteps,ode_data,color = :red,label = "Data: Var1",xlabel = "t",title = "Spiral Neural ODE")
for k in 1:300
    resol = predict_neuralode(samples[100:end][rand(1:400)])
    plot!(tsteps,resol[1,:],alpha=0.04,label = "")
end

idx = findmin(losses)[2]
prediction = predict_neuralode(samples[idx])
plot!(tsteps,prediction[1,color = :black,w = 2,label = "")

解决方法

最可能的原因是后验样本的损失函数幅度过高,因此后验样本结果超出范围并且在您的绘图中不可见。

这可能可以通过 (a) 在神经 ODE 输出中添加缩放因子并确保损失函数不会从非常高的幅度开始或 (b) 增加神经网络架构中的层数来解决/改变激活函数。

,

通过在 Neural ODE 中添加缩放因子,我得到了如下图所示的良好结果:

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...