@MarcoGorelli, yup- below 
k = np.array([1,1,1,1,1,
1,1,1,1,0,
1,1,1,0,0,
1,1,0,0,0]).reshape(4,5)
students = 5
questions = 4
with pm.Model() as model:
z_student = pm.Normal("z_student", mu=0, sigma=1, shape=(1,students))
z_question = pm.Normal("z_question",mu=0, sigma=1, shape=(questions,1))
# Transformed parameter
theta = pm.Deterministic("theta", pm.math.sigmoid(z_student - z_question))
# Likelihood
kij = pm.Bernoulli("kij", p=theta, observed=k)
trace = pm.sample(chains=4)
az.plot_trace(trace, var_names=["z_student", "z_question", "theta"], compact=False);