def METHOD_NAME(self):
    preview_entries = []
    for i in range(5):
        idx = random.randrange(len(self.dataset.entries))
        preview_entries.append(self.dataset.entries[idx])
    best_eval_loss = 10000
    for i in range(self.epochs):
        loss = self._train_epoch()
        eval_loss = self._eval()
        lr = self.scheduler.get_last_lr()[0]
        print('epoch: {} - lr: {:.2e} - loss: {:.4f} - eval_loss: {:.4f}'
              .format(i, lr, loss, eval_loss))
        if math.isnan(loss) or math.isnan(eval_loss):
            break
        if lr > self.min_lr:
            self.scheduler.step()
        if best_eval_loss > eval_loss:
            best_eval_loss = eval_loss
            print('saving new best at epoch {}'.format(i))
            self._save_state_dic('best')
        if (i + 1) % 20 == 0:
            self._save_state_dic('{:03d}'.format(i + 1))
        for entry in preview_entries:
            self._preview(entry)