如何解决如何在 Julia 中调整贝叶斯 ODE 拟合的超参数?
我一直在尝试使用不同的 ODE 方程来复制 https://diffeqflux.sciml.ai/dev/examples/BayesianNODE_NUTS/,但是我收到了没有不确定性量化的结果,是不是因为我做的初始值 u0 更高:
你能告诉我出了什么问题吗?
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 中添加缩放因子,我得到了如下图所示的良好结果:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。