Hi all,
I am new to Turing.jl and bayesian inference in general. I have specified the following model:
@model function switch_model(r, m, n)
hm ~ Uniform(1, 10)
am ~ Uniform(0, 10)
κm ~ Uniform(0, 1)
Δm ~ Uniform(0, 1)
z = tzeros(Int, n)
for i in 1:n
z[i] ~ Bernoulli(κm)
if z[i] == 1
Pm = f(r[i],hm,am)
m[i] ~ Bernoulli(Pm)
else
m[i] ~ Bernoulli(Δm)
end
end
end;
The length of r
is approx 250k observations. It contains values from 1-8 i.e. r = rand(1:8,250000)
. The function f
is a kind of sigmoid which takes values between zero and one (interpretated as a probability Pm
). The observations m
is a vector of booleans. I am not normalising values in r
and would prefer not to unless necessary so I can use the inferred parameters as they come out of the inference process.
I am aware that this is a large number of observations but I would expect Turing to be quite quick given that it is a simple model with a low number of parameters. In general I am unsure what solver to use - I have tried NUTs using
model = switch_model(r, m, n);
chn = sample(model, NUTS(), 1000)
This is very slow - in fact I think it breaks my kernel most of the time. I thought this was likely because of the intermediate z[i]
in the logic which is been tracked by the solver. I therefore tried to rewrite the model:
@model function switch_experiment_mm(r, m, n)
hm ~ Uniform(1, 10)
am ~ Uniform(0, 10)
κm ~ Uniform(0, 1)
Δm ~ Uniform(0, 1)
for i in 1:n
Pm = f(r[i],hm,am)
m[i] ~ MixtureModel(Bernoulli[
Bernoulli(Pm),
Bernoulli(Δm)], [κm, 1-κm])
end
end;
As I think my logic is equivalent to some sort of mixture model. However this also doesn’t work and seems to break the kernel again.
Am I doing something fundamentally wrong or is this just a case of large number of observations = slow?