class_docstr: Optimizer that implements the RMSprop algorithm.
  
  The gist of RMSprop is to:
  
  - Maintain a moving (discounted) average of the square of gradients
  - Divide the gradient by the root of this average
  
  This implementation of RMSprop uses plain momentum, not Nesterov momentum.
  
  The centered version additionally maintains a moving average of the
  gradients, and uses that average to estimate the variance.
  
  Args:
      learning_rate: A float, a
          `keras.optimizers.schedules.LearningRateSchedule` instance, or
          a callable that takes no arguments and returns the actual value to
          use. The learning rate. Defaults to `0.001`.
      rho: float, defaults to 0.9. Discounting factor for the old gradients.
      momentum: float, defaults to 0.0. If not 0.0., the optimizer tracks the
          momentum value, with a decay rate equals to `1 - momentum`.
      epsilon: A small constant for numerical stability. This epsilon is
          "epsilon hat" in the Kingma and Ba paper (in the formula just before
          Section 2.1), not the epsilon in Algorithm 1 of the paper. Defaults
          to 1e-7.
      centered: Boolean. If `True`, gradients are normalized by the estimated
          variance of the gradient; if False, by the uncentered second moment.
          Setting this to `True` may help with training, but is slightly more
          expensive in terms of computation and memory. Defaults to `False`.
      {{base_optimizer_keyword_args}}
  
  Usage:
  
  >>> opt = keras.optimizers.RMSprop(learning_rate=0.1)
  >>> var1 = keras.backend.Variable(10.0)
  >>> loss = lambda: (var1 ** 2) / 2.0  # d(loss) / d(var1) = var1
  >>> opt.minimize(loss, [var1])
  >>> var1
  9.683772
  
  Reference:
  
  - [Hinton, 2012](
      http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf)
code: def build(self, var_list):
      if self.built:
          return
  
      super().build(var_list)
  
      self._velocities = []
      for var in var_list:
          self._velocities.append(
              self.add_variable_from_reference(var, "velocity")
          )
  
      self._momentums = []
      if self.momentum > 0:
          for var in var_list:
              self._momentums.append(
                  self.add_variable_from_reference(var, "momentum")
              )
  
      self._average_gradients = []
      if self.centered:
          for var in var_list:
              self._average_gradients.append(
                  self.add_variable_from_reference(
                      var, "average_gradient"
                  )
              )
  
file_path: keras/keras/optimizers/rmsprop.py
imports: from keras import ops
  from keras.api_export import keras_export
  from keras.optimizers import optimizer
label_desc: Use image node_id 2 for calling the RMSprop obj's underlying member method code with example usage: obj.build(var_list) without return types