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); } } }
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; }