I am trying to build a couple of models in PyMC3 which use functions that are not readily available in pymc3.math or in theano.tensor. One simple example here is arctan . Following this thread I have built a ArcTan class which implements the function (from numpy) and the gradient, which in this case is very simple.
Here is my code:
import theano import theano.tensor as tt import theano.tests.unittest_tools class ArcTan(tt.Op): itypes = [tt.dscalar] otypes = [tt.dscalar] def perform(self, node, inputs, outputs): x, = inputs y = np.arctan(x) outputs = np.array(y) def grad(self, inputs, g): x, = inputs return [1 / (1 + x ** 2) ]
This looks simple enough, however when I check the gradient I get the following error:
theano.tests.unittest_tools.verify_grad(ArcTan(), [np.array(0.2)]) GradientError: GradientError: numeric gradient and analytic gradient exceed tolerance: At position 0 of argument 0 with shape (), val1 = 0.961538 , val2 = 1.154266 abs. error = 0.192728, abs. tolerance = 0.000100 rel. error = 0.091090, rel. tolerance = 0.000100 Exception args: The error happened with the following inputs:, [array(0.2)], The value of eps is:, None, The out_type is:, None
The correct value (both analytical and from numerical gradient in numpy) is the first one, 0.96. Can anyone tell me what is wrong here?