re-execute blackbox numpy notebook by OriolAbril · Pull Request #496 · pymc-devs/pymc-examples (original) (raw)
@OriolAbril the difference is that the gradient was being requested wrt to the untransformed parameters, which is something that is no longer possible in V>4.0 (see related discussion here: pymc-devs/pymc#5443)
To obtain the values as was being done before you can run this snippet:
test the gradient that PyMC uses for the Normal log likelihood
with pm.Model() as test_model: m = pm.Uniform("m", lower=-10.0, upper=10.0, transform=None) c = pm.Uniform("c", lower=-10.0, upper=10.0, transform=None) pm.Normal("likelihood", mu=(m * x + c), sigma=sigma, observed=data)
gradfunc = test_model.compile_dlogp([m, c]) grad_vals_pymc = gradfunc({"m": mtrue, "c": ctrue}) print(f'Gradient returned by PyMC "Normal" distribution: {grad_vals_pymc}')
Gradient returned by PyMC "Normal" distribution: [8.32628482 2.02949635]
However I think for teaching purposes would be better to compare the model using the custom Op with the comparison one directly like this:
ip = pymodel.initial_point() print(f"Evaluating dlogp of model at point {ip}") grad_vals_custom = pymodel.compile_dlogp()(ip)
Compare withe the gradient that PyMC uses for the Normal log likelihood
with pm.Model() as test_model: m = pm.Uniform("m", lower=-10.0, upper=10.0) c = pm.Uniform("c", lower=-10.0, upper=10.0) pm.Normal("likelihood", mu=(m * x + c), sigma=sigma, observed=data) grad_vals_pymc = test_model.compile_dlogp()(ip)
print(f'Gradient of model using a custom "LogLikeWithGrad": {grad_vals_custom}') print(f'Gradient of model using a PyMC "Normal" distribution: {grad_vals_pymc}')
Evaluating dlogp of model at point {'m_interval__': array(0.), 'c_interval__': array(0.)}
Gradient of model using a custom "LogLikeWithGrad": [1286.63142412 250.14748176]
Gradient of model using a PyMC "Normal" distribution: [1286.63142412 250.14748176]