code: def _update_impl(self, key, w, g):
      self.t[key] = min(self.t[key] + 1, np.iinfo(np.int32).max)
      t = self.t[key]
      weight_decay = self.weight_decay_rate
  
      m = self.v[key]["m"]
      v = self.v[key]["v"]
  
      m[...] = self.beta1 * m + (1 - self.beta1) * g
      v[...] = self.beta2 * v + (1 - self.beta2) * g * g
  
      corr1 = 1
      corr2 = 1
      if self.bias_correction:
          corr1 = 1 - self.beta1**t
          corr2 = 1 - self.beta2**t
  
      r = (m / corr1) / (np.sqrt(v / corr2) + self.eps)
      r = r + weight_decay * w
  
      v_norm = np.linalg.norm(w)
      v_norm = np.clip(v_norm, a_min=self.gamma_l, a_max=self.gamma_u)
      g_norm = np.linalg.norm(r)
      if g_norm > self.eps:
          local_lr = v_norm / g_norm
      else:
          local_lr = _f(1.0)
      w[...] -= self.eta * local_lr * r
  
file_path: nnabla/python/test/solver/test_lamb.py
imports: import pytest
  import nnabla
  import nnabla.solvers
  import numpy
  from solver_test_utils import solver_tester, RefSolver, MixinWeightDecayFused
  from nbla_test_utils import list_context
label_desc: Use image node_id 3 for calling the RefLamb obj's underlying member method code with example usage: obj._update_impl(key, w, g) without return types