class_docstr: An approximate marginal log likelihood (typically a bound) for approximate GP models.
  We expect that model is a :obj:`gpytorch.models.ApproximateGP`.
  
  Args:
      likelihood (:obj:`gpytorch.likelihoods.Likelihood`):
          The likelihood for the model
      model (:obj:`gpytorch.models.ApproximateGP`):
          The approximate GP model
      num_data (int):
          The total number of training data points (necessary for SGD)
      beta (float - default 1.):
          A multiplicative factor for the KL divergence term.
          Setting it to 1 (default) recovers true variational inference
          (as derived in `Scalable Variational Gaussian Process Classification`_).
          Setting it to anything less than 1 reduces the regularization effect of the model
          (similarly to what was proposed in `the beta-VAE paper`_).
      combine_terms (bool):
          Whether or not to sum the expected NLL with the KL terms (default True)
docstr: Computes the Variational ELBO given :math:`q(\mathbf f)` and `\mathbf y`.
  Calling this function will call the likelihood's `expected_log_prob` function.
  
  Args:
      approximate_dist_f (:obj:`gpytorch.distributions.MultivariateNormal`):
          :math:`q(\mathbf f)` the outputs of the latent function (the :obj:`gpytorch.models.ApproximateGP`)
      target (`torch.Tensor`):
          :math:`\mathbf y` The target values
  
  Keyword Args:
      Additional arguments passed to the likelihood's `expected_log_prob` function.
code: def forward(self, approximate_dist_f, target, **kwargs):
      r"""
      Computes the Variational ELBO given :math:`q(\mathbf f)` and `\mathbf y`.
      Calling this function will call the likelihood's `expected_log_prob` function.
  
      Args:
          approximate_dist_f (:obj:`gpytorch.distributions.MultivariateNormal`):
              :math:`q(\mathbf f)` the outputs of the latent function (the :obj:`gpytorch.models.ApproximateGP`)
          target (`torch.Tensor`):
              :math:`\mathbf y` The target values
  
      Keyword Args:
          Additional arguments passed to the likelihood's `expected_log_prob` function.
      """
      # Get likelihood term and KL term
      num_batch = approximate_dist_f.event_shape[0]
      log_likelihood = self._log_likelihood_term(
          approximate_dist_f, target, **kwargs
      ).div(num_batch)
      kl_divergence = (
          self.model.variational_strategy.kl_divergence().div(
              self.num_data / self.beta
          )
      )
  
      # Add any additional registered loss terms
      added_loss = torch.zeros_like(log_likelihood)
      had_added_losses = False
      for added_loss_term in self.model.added_loss_terms():
          added_loss.add_(added_loss_term.loss())
          had_added_losses = True
  
      # Log prior term
      log_prior = torch.zeros_like(log_likelihood)
      for name, module, prior, closure, _ in self.named_priors():
          log_prior.add_(
              prior.log_prob(closure(module)).sum().div(self.num_data)
          )
  
      if self.combine_terms:
          return log_likelihood - kl_divergence + log_prior - added_loss
      else:
          if had_added_losses:
              return (
                  log_likelihood,
                  kl_divergence,
                  log_prior,
                  added_loss,
              )
          else:
              return log_likelihood, kl_divergence, log_prior
  
file_path: gpytorch/gpytorch/mlls/_approximate_mll.py
imports: from abc import ABC, abstractmethod
  import torch
  from .marginal_log_likelihood import MarginalLogLikelihood
label_desc: Use image node_id 3 for calling the _ApproximateMarginalLogLikelihood obj's underlying member method code with example usage: obj.forward(approximate_dist_f, target) and returns: unknown, log_likelihood,  kl_divergence,  log_prior,  added_loss, log_likelihood,  kl_divergence,  log_prior