class_docstr: A multivariate normal :obj:`~gpytorch.variational._VariationalDistribution`,
  parameterized by **natural** parameters.
  
  .. note::
     The :obj:`~gpytorch.variational.NaturalVariationalDistribution` can only
     be used with :obj:`gpytorch.optim.NGD`, or other optimizers
     that follow exactly the gradient direction. Failure to do so will cause
     the natural matrix :math:`\mathbf \Theta_\text{mat}` to stop being
     positive definite, and a :obj:`~RuntimeError` will be raised.
  
  .. seealso::
      The `natural gradient descent tutorial
      <examples/04_Variational_and_Approximate_GPs/Natural_Gradient_Descent.ipynb>`_
      for use instructions.
  
      The :obj:`~gpytorch.variational.TrilNaturalVariationalDistribution` for
      a more numerically stable parameterization, at the cost of needing more
      iterations to make variational regression converge.
  
  :param int num_inducing_points: Size of the variational distribution. This implies that the variational mean
      should be this size, and the variational covariance matrix should have this many rows and columns.
  :param batch_shape: Specifies an optional batch size
      for the variational parameters. This is useful for example when doing additive variational inference.
  :type batch_shape: :obj:`torch.Size`, optional
  :param float mean_init_std: (Default: 1e-3) Standard deviation of gaussian noise to add to the mean initialization.
code: def __init__(
      self,
      num_inducing_points,
      batch_shape=torch.Size([]),
      mean_init_std=1e-3,
      **kwargs,
  ):
      super().__init__(
          num_inducing_points=num_inducing_points,
          batch_shape=batch_shape,
          mean_init_std=mean_init_std,
      )
      scaled_mean_init = torch.zeros(num_inducing_points)
      neg_prec_init = torch.eye(
          num_inducing_points, num_inducing_points
      ).mul(-0.5)
      scaled_mean_init = scaled_mean_init.repeat(*batch_shape, 1)
      neg_prec_init = neg_prec_init.repeat(*batch_shape, 1, 1)
  
      # eta1 and eta2 parameterization of the variational distribution
      self.register_parameter(
          name="natural_vec",
          parameter=torch.nn.Parameter(scaled_mean_init),
      )
      self.register_parameter(
          name="natural_mat",
          parameter=torch.nn.Parameter(neg_prec_init),
      )
  
imports: import abc
  import torch
  from linear_operator.operators import CholLinearOperator, TriangularLinearOperator
  from linear_operator.utils.cholesky import psd_safe_cholesky
  from ..distributions import MultivariateNormal
  from ._variational_distribution import _VariationalDistribution
label_desc: Use image node_id 1 to create a new NaturalVariationalDistribution object from inherited base classes: _NaturalVariationalDistribution with example: obj = NaturalVariationalDistribution(num_inducing_points, batch_shape, mean_init_std)