Source code for domainlab.algos.trainers.hyper_scheduler
"""
update hyper-parameters during training
"""
import numpy as np
[docs]
class HyperSchedulerWarmupLinear:
"""
HyperSchedulerWarmupLinear
"""
def __init__(self, trainer, **kwargs):
"""
kwargs is a dictionary with key the hyper-parameter name and its value
"""
self.trainer = trainer
self.dict_par_setpoint = kwargs
self.total_steps = None
[docs]
def set_steps(self, total_steps):
"""
set number of total_steps to gradually change optimization parameter
"""
self.total_steps = total_steps
[docs]
def warmup(self, par_setpoint, epoch):
"""warmup.
start from a small value of par to ramp up the steady state value using
# total_steps
:param epoch:
"""
ratio = ((epoch + 1) * 1.0) / self.total_steps
list_par = [par_setpoint, par_setpoint * ratio]
par = min(list_par)
return par
def __call__(self, epoch):
dict_rst = {}
for key, val_setpoint in self.dict_par_setpoint.items():
dict_rst[key] = self.warmup(val_setpoint, epoch)
return dict_rst
[docs]
class HyperSchedulerWarmupExponential(HyperSchedulerWarmupLinear):
"""
HyperScheduler Exponential
"""
[docs]
def warmup(self, par_setpoint, epoch):
"""
start from a small value of par to ramp up the steady state value using
number of total_steps
:param epoch:
"""
percent_steps = ((epoch + 1) * 1.0) / self.total_steps
denominator = 1.0 + np.exp(-10 * percent_steps)
ratio = 2.0 / denominator - 1
# percent_steps is 0, denom is 2, 2/denom is 1, ratio is 0
# percent_steps is 1, denom is 1+exp(-10), 2/denom is 2/(1+exp(-10))=2, ratio is 1
# exp(-10)=4.5e-5 is approximately 0
# slowly increase the regularization weight from 0 to 1*alpha as epochs goes on
parval = float(ratio * par_setpoint)
return parval