Предпочтительный способ снизить скорость обучения для оптимизатора Adam в PyTorch - PullRequest
0 голосов
/ 29 мая 2020

Я видел код , который использует оптимизатор Adam. И то, как они уменьшают скорость обучения, выглядит следующим образом:


    optimizer = torch.optim.Adam(net.parameters(),lr=0.01)
    (training...
    optimizer.step()...)

    if iteration >= some_threshold:
        for param_group in optimizer.param_groups:
            param_group['lr'] = 0.001

Я думал, что у нас одинаковая скорость обучения для всех параметров. Итак, зачем тогда перебирать param_groups и индивидуально устанавливать скорость обучения для каждого параметра?

Разве следующее не будет быстрее и не даст идентичный эффект?


    optimizer = torch.optim.Adam(net.parameters(),lr=0.01)
    scheduler = MultiStepLR(optimizer, milestones=[some_threshold], gamma=0.1)
    (training...
    optimizer.step()
    scheduler.step())

Спасибо

1 Ответ

2 голосов
/ 29 мая 2020

Вам нужно перебрать param_groups, потому что, если вы не укажете несколько групп параметров в оптимизаторе, у вас автоматически будет одна группа. Это не означает, что вы устанавливаете скорость обучения для каждого параметра, а скорее для каждой группы параметров.

Фактически планировщики скорости обучения от PyTorch делают то же самое. From _LRScheduler (базовый класс планировщиков скорости обучения) :

with _enable_get_lr_call(self):
    if epoch is None:
        self.last_epoch += 1
        values = self.get_lr()
    else:
        warnings.warn(EPOCH_DEPRECATION_WARNING, UserWarning)
        self.last_epoch = epoch
        if hasattr(self, "_get_closed_form_lr"):
            values = self._get_closed_form_lr()
        else:
            values = self.get_lr()

for param_group, lr in zip(self.optimizer.param_groups, values):
    param_group['lr'] = lr

Да, в этом случае он имеет такой же эффект, но не будет быстрее.

...