class_docstr: M = b1 * M + (1-b1) * G
  V = b2 * V + (1-b2) * G^2
  V_hat = max(V_hat, V)
  W = W - r * M / sqrt(V_hat)
  
  Reference: https://paperswithcode.com/method/amsgrad
code: def compile(self, weights):
      for W in weights:
          self.Vs[id(W)] = [
              tfe.define_private_variable(
                  np.zeros(list(map(int, W[i].shape.as_list()))),
                  apply_scaling=True,
                  share_type=W[i].share_type,
                  factory=W[i].backing_dtype,
              )
              for i in range(len(W))
          ]
          self.Ms[id(W)] = [
              tfe.define_private_variable(
                  np.zeros(list(map(int, W[i].shape.as_list()))),
                  apply_scaling=True,
                  share_type=W[i].share_type,
                  factory=W[i].backing_dtype,
              )
              for i in range(len(W))
          ]
          self.Vhats[id(W)] = [
              tfe.define_private_variable(
                  np.zeros(list(map(int, W[i].shape.as_list()))),
                  apply_scaling=True,
                  share_type=W[i].share_type,
                  factory=W[i].backing_dtype,
              )
              for i in range(len(W))
          ]
  
file_path: tf-encrypted/tf_encrypted/keras/optimizers.py
imports: import numpy
  import tensorflow
  import tf_encrypted
label_desc: Use image node_id 2 for calling the AMSgrad obj's underlying member method code with example usage: obj.compile(weights) without return types