@@ -69,7 +69,15 @@ class TestApproximates:
69
69
class Base (SeededTest ):
70
70
inference = None
71
71
NITER = 12000
72
- optimizer = functools .partial (pm .adam , learning_rate = .01 )
72
+ optimizer = pm .adagrad_window (learning_rate = 0.01 )
73
+ conv_cb = property (lambda self : [
74
+ pm .callbacks .CheckParametersConvergence (
75
+ every = 500 ,
76
+ diff = 'relative' , tolerance = 0.001 ),
77
+ pm .callbacks .CheckParametersConvergence (
78
+ every = 500 ,
79
+ diff = 'absolute' , tolerance = 0.0001 )
80
+ ])
73
81
74
82
def test_vars_view (self ):
75
83
_ , model , _ = models .multidimensional_model ()
@@ -146,11 +154,10 @@ def test_optimizer_with_full_data(self):
146
154
inf .fit (10 )
147
155
approx = inf .fit (self .NITER ,
148
156
obj_optimizer = self .optimizer ,
149
- callbacks =
150
- [pm .callbacks .CheckParametersConvergence ()],)
157
+ callbacks = self .conv_cb ,)
151
158
trace = approx .sample (10000 )
152
- np .testing .assert_allclose (np .mean (trace ['mu' ]), mu_post , rtol = 0.1 )
153
- np .testing .assert_allclose (np .std (trace ['mu' ]), np .sqrt (1. / d ), rtol = 0.4 )
159
+ np .testing .assert_allclose (np .mean (trace ['mu' ]), mu_post , rtol = 0.05 )
160
+ np .testing .assert_allclose (np .std (trace ['mu' ]), np .sqrt (1. / d ), rtol = 0.1 )
154
161
155
162
def test_optimizer_minibatch_with_generator (self ):
156
163
n = 1000
@@ -175,11 +182,10 @@ def create_minibatch(data):
175
182
Normal ('x' , mu = mu_ , sd = sd , observed = minibatches , total_size = n )
176
183
inf = self .inference ()
177
184
approx = inf .fit (self .NITER * 3 , obj_optimizer = self .optimizer ,
178
- callbacks =
179
- [pm .callbacks .CheckParametersConvergence ()])
185
+ callbacks = self .conv_cb )
180
186
trace = approx .sample (10000 )
181
- np .testing .assert_allclose (np .mean (trace ['mu' ]), mu_post , rtol = 0.1 )
182
- np .testing .assert_allclose (np .std (trace ['mu' ]), np .sqrt (1. / d ), rtol = 0.4 )
187
+ np .testing .assert_allclose (np .mean (trace ['mu' ]), mu_post , rtol = 0.05 )
188
+ np .testing .assert_allclose (np .std (trace ['mu' ]), np .sqrt (1. / d ), rtol = 0.1 )
183
189
184
190
def test_optimizer_minibatch_with_callback (self ):
185
191
n = 1000
@@ -208,12 +214,20 @@ def cb(*_):
208
214
Normal ('x' , mu = mu_ , sd = sd , observed = data_t , total_size = n )
209
215
inf = self .inference (scale_cost_to_minibatch = True )
210
216
approx = inf .fit (
211
- self .NITER * 3 , callbacks = [
212
- cb , pm .callbacks .CheckParametersConvergence ()
213
- ], obj_n_mc = 10 , obj_optimizer = self .optimizer )
217
+ self .NITER * 3 , callbacks = [cb ] + self .conv_cb , obj_optimizer = self .optimizer )
214
218
trace = approx .sample (10000 )
215
- np .testing .assert_allclose (np .mean (trace ['mu' ]), mu_post , rtol = 0.4 )
216
- np .testing .assert_allclose (np .std (trace ['mu' ]), np .sqrt (1. / d ), rtol = 0.4 )
219
+ np .testing .assert_allclose (np .mean (trace ['mu' ]), mu_post , rtol = 0.05 )
220
+ np .testing .assert_allclose (np .std (trace ['mu' ]), np .sqrt (1. / d ), rtol = 0.1 )
221
+
222
+ def test_n_obj_mc (self ):
223
+ n_samples = 100
224
+ xs = np .random .binomial (n = 1 , p = 0.2 , size = n_samples )
225
+ with pm .Model ():
226
+ p = pm .Beta ('p' , alpha = 1 , beta = 1 )
227
+ pm .Binomial ('xs' , n = 1 , p = p , observed = xs )
228
+ inf = self .inference (scale_cost_to_minibatch = True )
229
+ # should just work
230
+ inf .fit (10 , obj_n_mc = 10 , obj_optimizer = self .optimizer )
217
231
218
232
def test_pickling (self ):
219
233
with models .multidimensional_model ()[1 ]:
@@ -277,15 +291,14 @@ def test_from_advi(self):
277
291
278
292
class TestSVGD (TestApproximates .Base ):
279
293
inference = functools .partial (SVGD , n_particles = 100 )
280
- NITER = 2500
281
- optimizer = functools .partial (pm .adam , learning_rate = .1 )
282
294
283
295
284
296
class TestASVGD (TestApproximates .Base ):
297
+ NITER = 15000
285
298
inference = ASVGD
286
- NITER = 4000
287
- optimizer = functools .partial (pm .adam , learning_rate = .05 )
288
299
test_aevb = _test_aevb
300
+ optimizer = pm .adagrad_window (learning_rate = 0.001 )
301
+ conv_cb = []
289
302
290
303
291
304
class TestEmpirical (SeededTest ):
0 commit comments