docs: def step(self, loss, optimizer, scheduler, update=True):
          """
          Performs one step of the optimizer.
  
          :param loss: value of loss function
          :param optimizer: optimizer
          :param update: if True executes weight update
          """
          loss.backward()
          if update:
              if self.grad_clip != float('inf'):
                  clip_grad_norm_(self.model.parameters(), self.grad_clip)
              scheduler.step()
              optimizer.step()
              self.model.zero_grad()