Пример #1
0
  void UpdateWeights(MatType& weights,
                     const MatType& gradient,
                     const double /* unused */)
  {
    MatType derivs = gradient % prevDerivs;

    for (size_t i(0); i < derivs.n_cols; i++)
    {
      for (size_t j(0); j < derivs.n_rows; j++)
      {
        if (derivs(j, i) > 0)
        {
          updateValues(j, i) = std::min(updateValues(j, i) * etaPlus, maxDelta);
          prevWeightChange(j, i) = boost::math::sign(gradient(j, i)) * updateValues(j, i);
          prevDerivs(j, i) = gradient(j, i);
        }
        else if (derivs(j, i) < 0)
        {
          updateValues(j, i) = std::max(updateValues(j, i) * etaMin, minDelta);
          prevDerivs(j, i) = 0;
        }
        else
        {
          prevWeightChange(j, i) = boost::math::sign(gradient(j, i)) * updateValues(j, i);
          prevDerivs(j, i) = gradient(j, i);
        }

        weights(j, i) -= prevWeightChange(j, i);
      }
    }
  }
Пример #2
0
  void UpdateWeights(MatType& weights,
                     const MatType& gradient,
                     const double /* unused */)
  {
    MatType derivs = gradient % prevDerivs;

    for (size_t i(0); i < derivs.n_cols; i++)
    {
      for (size_t j(0); j < derivs.n_rows; j++)
      {
        if (derivs(j, i) >= 0)
        {
          prevDelta(j, i) = std::min(prevDelta(j, i) * etaPlus, maxDelta);
          prevDerivs(j, i) = gradient(j, i);
        }
        else
        {
          prevDelta(j, i) = std::max(prevDelta(j, i) * etaMin, minDelta);
          prevDerivs(j, i) = 0;
        }
      }
    }

    weights -= arma::sign(gradient) % prevDelta;
  }