step method

  1. @override
void step()
override

Implementation

@override
void step() {
  _t = _t + 1;
  for (int p = 0; p < parameters.length; p = p + 1) {
    Tensor<dynamic> param = parameters[p];
    List<double> mList = _m[param.id]!;
    List<double> vList = _v[param.id]!;
    List<double> vHatList = _vHat[param.id]!;

    for (int i = 0; i < param.data.length; i = i + 1) {
      double grad = param.grad[i];

      mList[i] = beta1 * mList[i] + (1.0 - beta1) * grad;
      vList[i] = beta2 * vList[i] + (1.0 - beta2) * (grad * grad);

      // Use the maximum of past squared gradients
      if (vList[i] > vHatList[i]) {
        vHatList[i] = vList[i];
      }

      double mHat = mList[i] / (1.0 - pow(beta1, _t));
      param.data[i] = param.data[i] - learningRate * mHat / (sqrt(vHatList[i]) + epsilon);
    }
  }
}