Skip to content

Commit ce3bfd9

Browse files
aseyboldttwiecki
authored andcommitted
Fix convergence detection bug in advi
1 parent ff7a1a2 commit ce3bfd9

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

pymc3/variational/advi.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,8 @@ def advi(vars=None, start=None, model=None, n=5000, accurate_elbo=False,
147147
# Optimization loop
148148
elbos = np.empty(n)
149149
divergence_flag = False
150+
progress = trange(n)
150151
try:
151-
progress = trange(n)
152152
uw_i, elbo_current = f()
153153
if np.isnan(elbo_current):
154154
raise FloatingPointError('NaN occurred in ADVI optimization.')
@@ -171,12 +171,12 @@ def advi(vars=None, start=None, model=None, n=5000, accurate_elbo=False,
171171
avg_delta = np.mean(circ_buff)
172172
med_delta = np.median(circ_buff)
173173

174-
if avg_delta < tol_obj:
174+
if i > 0 and avg_delta < tol_obj:
175175
pm._log.info('Mean ELBO converged.')
176176
converged = True
177177
elbos = elbos[:(i + 1)]
178178
break
179-
elif med_delta < tol_obj:
179+
elif i > 0 and med_delta < tol_obj:
180180
pm._log.info('Median ELBO converged.')
181181
converged = True
182182
elbos = elbos[:(i + 1)]
@@ -186,7 +186,7 @@ def advi(vars=None, start=None, model=None, n=5000, accurate_elbo=False,
186186
divergence_flag = True
187187
else:
188188
divergence_flag = False
189-
189+
190190
except KeyboardInterrupt:
191191
elbos = elbos[:i]
192192
if n < 10:
@@ -202,10 +202,12 @@ def advi(vars=None, start=None, model=None, n=5000, accurate_elbo=False,
202202
else:
203203
avg_elbo = elbos[-n // 10:].mean()
204204
pm._log.info('Finished [100%]: Average ELBO = {:,.5g}'.format(avg_elbo))
205-
205+
finally:
206+
progress.close()
207+
206208
if divergence_flag:
207209
pm._log.info('Evidence of divergence detected, inspect ELBO.')
208-
210+
209211
# Estimated parameters
210212
l = int(uw_i.size / 2)
211213
u = bij.rmap(uw_i[:l])

0 commit comments

Comments
 (0)