РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
564 of 769 menu

Класс LambdaLR

Класс LambdaLR используется для изменения скорости обучения оптимизатора с помощью произвольной функции, задаваемой пользователем. Он принимает оптимизатор и лямбда-функцию, которая вычисляет множитель для текущей скорости обучения на каждой эпохе. Это позволяет реализовать любую стратегию изменения скорости обучения, не ограничиваясь встроенными расписаниями.

Синтаксис

torch.optim.lr_scheduler.LambdaLR( optimizer, lr_lambda, last_epoch=-1, verbose=False )

Параметры:

optimizer - оптимизатор, скорость обучения которого будет изменяться;

lr_lambda - функция или список функций, принимающих номер эпохи и возвращающих множитель для скорости обучения;

last_epoch - номер последней эпохи (по умолчанию -1);

verbose - если True, выводит сообщение при каждом изменении скорости обучения.

Пример

Давайте создадим простое расписание, которое линейно уменьшает скорость обучения:

import torch from torch.optim import SGD from torch.optim.lr_scheduler import LambdaLR # Создаём модель с одним параметром model = torch.nn.Linear(10, 1) optimizer = SGD(model.parameters(), lr=0.1) # Лямбда-функция: линейное уменьшение от 1 до 0 за 10 эпох scheduler = LambdaLR( optimizer, lr_lambda=lambda epoch: 1 - epoch / 10 ) # Симулируем обучение for epoch in range(5): optimizer.step() scheduler.step() current_lr = optimizer.param_groups[0]['lr'] print(f'Epoch {epoch + 1}: learning rate = {current_lr:.4f}')

Результат выполнения кода:

Epoch 1: learning rate = 0.0900 Epoch 2: learning rate = 0.0800 Epoch 3: learning rate = 0.0700 Epoch 4: learning rate = 0.0600 Epoch 5: learning rate = 0.0500

Пример

Давайте реализуем экспоненциальное затухание скорости обучения:

import torch from torch.optim import SGD from torch.optim.lr_scheduler import LambdaLR # Создаём модель с двумя параметрами model = torch.nn.Linear(10, 2) optimizer = SGD(model.parameters(), lr=0.1) # Лямбда-функция: экспоненциальное затухание scheduler = LambdaLR( optimizer, lr_lambda=lambda epoch: 0.9 ** epoch ) # Симулируем обучение for epoch in range(5): optimizer.step() scheduler.step() current_lr = optimizer.param_groups[0]['lr'] print(f'Epoch {epoch + 1}: learning rate = {current_lr:.4f}')

Результат выполнения кода:

Epoch 1: learning rate = 0.0900 Epoch 2: learning rate = 0.0810 Epoch 3: learning rate = 0.0729 Epoch 4: learning rate = 0.0656 Epoch 5: learning rate = 0.0590

Пример

Давайте создадим расписание с различными функциями для разных групп параметров:

import torch from torch.optim import SGD from torch.optim.lr_scheduler import LambdaLR # Создаём модель с двумя параметрами model = torch.nn.Linear(10, 2) # Разные скорости для разных групп параметров optimizer = SGD([ {'params': model.weight, 'lr': 0.1}, {'params': model.bias, 'lr': 0.01} ]) # Разные функции для каждой группы scheduler = LambdaLR( optimizer, lr_lambda=[ lambda epoch: 0.8 ** epoch, # для весов lambda epoch: 0.9 ** epoch # для смещений ] ) # Симулируем обучение for epoch in range(4): optimizer.step() scheduler.step() lr_weight = optimizer.param_groups[0]['lr'] lr_bias = optimizer.param_groups[1]['lr'] print(f'Epoch {epoch + 1}: weight LR = {lr_weight:.4f}, bias LR = {lr_bias:.4f}')

Результат выполнения кода:

Epoch 1: weight LR = 0.0800, bias LR = 0.0090 Epoch 2: weight LR = 0.0640, bias LR = 0.0081 Epoch 3: weight LR = 0.0512, bias LR = 0.0073 Epoch 4: weight LR = 0.0410, bias LR = 0.0066

Пример

Давайте реализуем расписание с "разогревом" и последующим затуханием:

import torch from torch.optim import SGD from torch.optim.lr_scheduler import LambdaLR model = torch.nn.Linear(10, 1) optimizer = SGD(model.parameters(), lr=0.1) # Функция: разогрев 5 эпох, затем линейное затухание def warmup_decay(epoch): if epoch < 5: return 0.2 + 0.8 * (epoch / 5) # разогрев от 0.2 до 1.0 else: return max(0.01, 1.0 - 0.1 * (epoch - 5)) # затухание scheduler = LambdaLR(optimizer, lr_lambda=warmup_decay) # Симулируем обучение for epoch in range(10): optimizer.step() scheduler.step() current_lr = optimizer.param_groups[0]['lr'] print(f'Epoch {epoch + 1}: learning rate = {current_lr:.4f}')

Результат выполнения кода:

Epoch 1: learning rate = 0.0400 Epoch 2: learning rate = 0.0600 Epoch 3: learning rate = 0.0800 Epoch 4: learning rate = 0.1000 Epoch 5: learning rate = 0.1200 Epoch 6: learning rate = 0.0900 Epoch 7: learning rate = 0.0600 Epoch 8: learning rate = 0.0300 Epoch 9: learning rate = 0.0100 Epoch 10: learning rate = 0.0100

Смотрите также

  • класс StepLR,
    который уменьшает скорость обучения с фиксированным шагом
  • класс ExponentialLR,
    который уменьшает скорость обучения экспоненциально
  • класс CosineAnnealingLR,
    который использует косинусоидальное расписание
  • класс MultiplicativeLR,
    который умножает скорость обучения на заданную функцию
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить