class_docstr: *** Adaptive Moment Estimation (ADAM) *** 
  
  Computes adaptive learning rates for each parameter. Has an EWMA of past gradients and squared gradients.
code: def update(self, gradient):
      self.f_gradient = (
          self.ewma_1 * self.f_gradient + (1 - self.ewma_1) * gradient
      )
      f_gradient_hat = self.f_gradient / (
          1 - np.power(self.ewma_1, self.t)
      )
      self.variance = self.ewma_2 * self.variance + (
          1 - self.ewma_2
      ) * np.power(gradient, 2)
      variance_hat = self.variance / (1 - np.power(self.ewma_2, self.t))
      if self.t > 5:
          self.parameters += (
              self.learning_rate
              + (self.learning_rate * 15.0 * (0.990**self.t))
          ) * (f_gradient_hat / (np.sqrt(variance_hat) + self.epsilon))
      self.t += 1
      return self.parameters
  
file_path: pyflux/pyflux/inference/stoch_optim.py
imports: import numpy
label_desc: Use image node_id 2 for calling the ADAM obj's underlying member method code with example usage: obj.update(gradient) and returns: self