class_docstr: Multinomial Variational Autoencoders (Multi-VAE) for Collaborative Filtering implementation
  
  :Citation:
  
      Liang, Dawen, et al. "Variational autoencoders for collaborative filtering."
      Proceedings of the 2018 World Wide Web Conference. 2018.
      https://arxiv.org/pdf/1802.05814.pdf
docstr: Calculate negative ELBO (NELBO).
code: def _get_vae_loss(self, x, x_bar):
      """Calculate negative ELBO (NELBO)."""
      log_softmax_var = tf.nn.log_softmax(x_bar)
      self.neg_ll = -tf.reduce_mean(
          input_tensor=tf.reduce_sum(
              input_tensor=log_softmax_var * x, axis=-1
          )
      )
      a = tf.keras.backend.print_tensor(self.neg_ll)  # noqa: F841
      # calculate positive Kullback–Leibler divergence  divergence term
      kl_loss = K.mean(
          0.5
          * K.sum(
              -1
              - self.z_log_var
              + K.square(self.z_mean)
              + K.exp(self.z_log_var),
              axis=-1,
          )
      )
  
      # obtain negative ELBO
      neg_ELBO = self.neg_ll + self.beta * kl_loss
  
      return neg_ELBO
  
imports: import numpy
  import matplotlib.pyplot
  import seaborn
  from recommenders.evaluation.python_evaluation import ndcg_at_k
  import tensorflow
  from tensorflow.keras.layers import *
  from tensorflow.keras.models import Model
  from tensorflow.keras import backend
  from tensorflow.keras.callbacks import ReduceLROnPlateau, Callback
label_desc: Use image node_id 3 for calling the Mult_VAE obj's underlying member method code with example usage: obj._get_vae_loss(x, x_bar) and returns: neg_ELBO