LR не распадается для pytorch AdamW даже после сотен эпох

У меня есть следующий код, использующий оптимизатор 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 16.07.2024 08:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как уже намекнуло в комментарии @xdurch0, я думаю, что здесь вы попали в ловушку заблуждения. Снижение веса и снижение скорости обучения — это две разные вещи, по крайней мере, концептуально¹:

  • Снижение веса используется для регуляризации весов в вашей сети путем штрафования больших значений веса. Он используется как средство предотвращения переобучения и, таким образом, для облегчения обобщения.
  • Уменьшая скорость обучения, можно надеяться прийти к хорошему решению: это следует идее, что более высокая начальная скорость обучения помогает «исследовать ландшафт потерь», а ее уменьшение на более поздних этапах обучения помогает «нацелиться» на окончательное решение. .

Важно отметить, что изменение значения затухания веса не меняет значение скорости обучения!

Используйте планировщик скорости обучения

Чтобы добиться снижения скорости обучения в PyTorch, обычно используют планировщик скорости обучения, обычно следующим образом:

  1. Создается экземпляр планировщика, который получает в качестве одного из входных данных экземпляр оптимизатора.
  2. В конце каждой эпохи обучения вызывается 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.

Другие вопросы по теме