| |
| |
|
|
| import numpy as np |
|
|
|
|
| class IterExponential: |
| def __init__(self, total_iter_length, final_ratio, warmup_steps=0) -> None: |
| """ |
| Customized iteration-wise exponential scheduler. |
| Re-calculate for every step, to reduce error accumulation |
| |
| Args: |
| total_iter_length (int): Expected total iteration number |
| final_ratio (float): Expected LR ratio at n_iter = total_iter_length |
| """ |
| self.total_length = total_iter_length |
| self.effective_length = total_iter_length - warmup_steps |
| self.final_ratio = final_ratio |
| self.warmup_steps = warmup_steps |
|
|
| def __call__(self, n_iter) -> float: |
| if n_iter < self.warmup_steps: |
| alpha = 1.0 * n_iter / self.warmup_steps |
| elif n_iter >= self.total_length: |
| alpha = self.final_ratio |
| else: |
| actual_iter = n_iter - self.warmup_steps |
| alpha = np.exp( |
| actual_iter / self.effective_length * np.log(self.final_ratio) |
| ) |
| return alpha |
|
|
|
|
| if "__main__" == __name__: |
| lr_scheduler = IterExponential( |
| total_iter_length=50000, final_ratio=0.01, warmup_steps=200 |
| ) |
| lr_scheduler = IterExponential( |
| total_iter_length=50000, final_ratio=0.01, warmup_steps=0 |
| ) |
|
|
| x = np.arange(100000) |
| alphas = [lr_scheduler(i) for i in x] |
| import matplotlib.pyplot as plt |
|
|
| plt.plot(alphas) |
| plt.savefig("lr_scheduler.png") |
|
|