class_docstr: Learning rate schedule: lr * (1 - t / total_steps)
  Step grows until it reaches decay_steps then remains constant.
  
  This is the schedule used by Devlin et al. in the BERT paper
  (https://arxiv.org/pdf/1810.04805.pdf).
  
  :param optimizer: Optimizer.
  :param base_lr: Base learning rate.
  :param total_steps: Number of total training updates.  The learning rate
                      linearly decays to zero over this period.
  :param warmup: Number of initial updates during which the learning rate
                 linearly increases.
class_docstr_tok: ["Learning","rate","schedule",":","lr","*","(","1","-","t","\/","total_steps",")","Step","grows","until","it","reaches","decay_steps","then","remains","constant",".","This","is","the","schedule","used","by","Devlin","et","al",".","in","the","BERT","paper","(","https",":","\/\/arxiv.org\/pdf\/1810.04805.pdf",")",".",":","param","optimizer",":","Optimizer",".",":","param","base_lr",":","Base","learning","rate",".",":","param","total_steps",":","Number","of","total","training","updates",".","The","learning","rate","linearly","decays","to","zero","over","this","period",".",":","param","warmup",":","Number","of","initial","updates","during","which","the","learning","rate","linearly","increases","."]
code: def get_lr(self) -> List[float]:
      # Warmup
      warm_lr = self._warmup(self._t)
      # Linear decay
      bounded_t = min(max(self._t, 1), self.total_steps)
      lr = warm_lr * (1 - bounded_t / self.total_steps)
      return [lr for _ in self.optimizer.param_groups]
  
imports: import logging
  from math import sqrt
  from typing import Any, Dict, List, Optional, Tuple, Type
  import torch
  import sockeye.constants
  from sockeye.utils import check_condition
label_desc: Use image node_id 2 for calling the LearningRateSchedulerLinearDecay obj's underlying member method code with example usage: obj.get_lr() and returns: unknown