.. _program_listing_file_src_optimizers_exponential_smoothing.cpp: Program Listing for File exponential_smoothing.cpp ================================================== |exhale_lsh| :ref:`Return to documentation for file ` (``src/optimizers/exponential_smoothing.cpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #include "common/definitions.h" #include "functional/functional.h" #include "tensors/tensor_operators.h" #include "common/options.h" #include "optimizers/optimizers.h" #include "optimizers/exponential_smoothing.h" namespace marian { void ExponentialSmoothing::updateAvgParams(Tensor paramsAvg, Tensor params, size_t batches, size_t actualBatchTrgWords) { double beta = 1. - mvDecayBy_; // correction term if batch size is different from what mvDecayBy_ was specified for if (refBatchTrgWords_ > 0 && actualBatchTrgWords > refBatchTrgWords_) { LOG_ONCE(info, "Exponential smoothing gets automatically adjusted as if update size was {} target words", refBatchTrgWords_); beta = pow(beta, (double)actualBatchTrgWords / (double)refBatchTrgWords_); batches = (size_t)((double)batches * (double)actualBatchTrgWords / (double)refBatchTrgWords_); } // reduce effect of decay parameter in early training stages float decayBy = std::max(1.f - (float)beta, 1.f - (float)(batches + 1) / (float)(batches + 10)); using namespace functional; Element(_1 = ((1.f - decayBy) * _1) + (decayBy * _2), paramsAvg, params); } } // namespace marian