'Create a lower bound in three parts, normalized reconstruction
cost, normalized KL divergence cost, and their sum.
E_q[ln p(z_i | z_{i+1}) / q(z_i | x)
\int q(z) ln p(z) dz = - 0.5 ln(2pi) - 0.5 \sum (ln(sigma_p^2) +           sigma_q^2 / sigma_p^2 + (mean_p - mean_q)^2 / sigma_p^2)
\int q(z) ln q(z) dz = - 0.5 ln(2pi) - 0.5 \sum (ln(sigma_q^2) + 1)
Args:
zs: posterior z ~ q(z|x)
prior_zs: prior zs'

def __init__(self, zs, prior_zs):

    kl_b = 0.0
    for (z, prior_z) in zip(zs, prior_zs):
        assert isinstance(z, Gaussian)
        assert isinstance(prior_z, Gaussian)
        kl_b += (0.5 * tf.reduce_sum(((((prior_z.logvar - z.logvar) + tf.exp((z.logvar - prior_z.logvar))) + tf.square(((z.mean - prior_z.mean) / tf.exp((0.5 * prior_z.logvar))))) - 1.0), [1]))
    self.kl_cost_b = kl_b
    self.kl_cost = tf.reduce_mean(kl_b)
