У меня есть следующий код, использующий оптимизатор AdamW
от Pytorch:
optimizer = AdamW(params=self.model.parameters(), lr=0.00005)
Я попытался войти в систему с помощью wandb следующим образом:
lrs = {f'lr_group_{i}': param_group['lr']
for i, param_group in enumerate(self.optimizer.param_groups)}
wandb.log({"train_loss": avg_train_loss, "val_loss": val_loss, **lrs})
Обратите внимание, что значение для параметра weight_decay
по умолчанию равно 0.01
для AdamW
.
Когда я проверил панель управления wandb, она показала тот же LR для AdamW даже через 200 эпох, и она вообще не затухала. Я попробовал это в нескольких прогонах.
Почему не происходит распад LR?
Кроме того, он показывал LR только для одной группы параметров. Почему это так? Кажется, я упускаю здесь что-то основное. Может кто-нибудь указать?
Как уже намекнуло в комментарии @xdurch0, я думаю, что здесь вы попали в ловушку заблуждения. Снижение веса и снижение скорости обучения — это две разные вещи, по крайней мере, концептуально¹:
Важно отметить, что изменение значения затухания веса не меняет значение скорости обучения!
Чтобы добиться снижения скорости обучения в PyTorch, обычно используют планировщик скорости обучения, обычно следующим образом:
step()
в планировщике (точно так же, как вызов step()
в оптимизаторе после обработки пакета обучения). Это заставит планировщик вычислить новое значение скорости обучения для следующей эпохи, которое он затем будет использовать для соответствующей настройки оптимизатора.Ниже приведен отрывок из документации PyTorch, демонстрирующий этот подход (добавленные мной комментарии):
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
# 1. Create scheduler, provide it with optimizer
scheduler = ExponentialLR(optimizer, gamma=0.9)
for epoch in range(20):
for input_, target in dataset:
optimizer.zero_grad()
output = model(input_)
loss = loss_fn(output, target)
loss.backward()
optimizer.step()
# 2. Trigger calculation and setting of next learning rate value
scheduler.step()
Здесь используется планировщик ExponentialLR , который затухает скорость обучения экспоненциально, по фиксированному графику (т.е. только в зависимости от его начальных параметров; в частности, коэффициента затухания, но независимо от текущей производительности сети). Существуют также адаптивные планировщики, которые регулируют скорость обучения в зависимости от фактической производительности сети; например, РедуцироватьLROnPlateau снижает скорость обучения на заданный коэффициент, как только обнаружено плато потерь заданной длины.
¹) Mathematically, for some optimizers, learning rate and weight decay are implicitly coupled, which is one of the reasons why AdamW was derived from the Adam optimizer in the first place. For more information, one might want to read the AdamW paper. But this is not the problem described in the question.
Снижение веса не является снижением скорости обучения.