SGD
-
class torch.optim.SGD(params, lr=0.001, momentum=0, dampening=0, weight_decay=0, nesterov=False, *, maximize=False, foreach=None, differentiable=False, fused=None)[исходный код] -
Реализует стохастический градиентный спуск (при необходимости с импульсом).
Импульс Нестерова основан на формуле из статьи О важности инициализации и импульса в глубоком обучении.
- Параметры:
-
- params (iterable) – итерируемый объект с параметрами или named_parameters для оптимизации либо итерируемый объект словарей, определяющих группы параметров. При использовании named_parameters все параметры во всех группах должны иметь имена
- lr (float, Tensor, необязательно) – скорость обучения (по умолчанию: 1e-3)
- momentum (float, необязательно) – коэффициент импульса (по умолчанию: 0)
- dampening (float, необязательно) – коэффициент ослабления импульса (по умолчанию: 0)
- weight_decay (float, необязательно) – затухание весов (штраф L2) (по умолчанию: 0)
- nesterov (bool, необязательно) – включает импульс Нестерова. Применимо только при ненулевом значении momentum. (по умолчанию: False)
- maximize (bool, необязательно) – максимизировать целевую функцию относительно params вместо минимизации (по умолчанию: False)
- foreach (bool, необязательно) – использовать ли реализацию оптимизатора foreach. Если пользователь не указал значение (то есть foreach равен None), мы попытаемся использовать foreach вместо реализации с циклом for на CUDA, поскольку обычно она значительно производительнее. Обратите внимание, что реализация foreach использует примерно на sizeof(params) больше пиковой памяти, чем версия с циклом for, поскольку промежуточные данные представлены списком тензоров, а не одним тензором. Если памяти недостаточно, обрабатывайте оптимизатором меньше параметров за один раз или задайте для этого флага значение False (по умолчанию: None)
- differentiable (bool, необязательно) – выполнять ли autograd через шаг оптимизатора во время обучения. В противном случае функция step() выполняется в контексте torch.no_grad(). Значение True может снизить производительность, поэтому оставьте False, если не собираетесь запускать autograd через этот экземпляр (по умолчанию: False)
-
fused (bool, необязательно) – использовать ли объединённую реализацию. В настоящее время поддерживаются
torch.float64,torch.float32,torch.float16иtorch.bfloat16. (по умолчанию: None)
Примечание
Реализации foreach и fused обычно быстрее реализации с циклом for и одним тензором; теоретически самая быстрая — fused, поскольку она объединяет операции по вертикали и горизонтали. Поэтому, если пользователь не указал ни один из флагов (то есть foreach = fused = None), мы попытаемся использовать реализацию foreach по умолчанию, если все тензоры находятся на CUDA. Почему не fused? Поскольку реализация fused появилась сравнительно недавно, мы хотим дать ей достаточно времени для стабилизации. Чтобы указать fused, передайте для fused значение True. Чтобы принудительно использовать реализацию с циклом for, передайте False для foreach или fused.
Пример
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9) >>> optimizer.zero_grad() >>> loss_fn(model(input), target).backward() >>> optimizer.step()
Примечание
Реализация SGD с Momentum/Nesterov немного отличается от варианта Sutskever et al. и реализаций в некоторых других фреймворках.
Рассмотрим частный случай с Momentum: обновление можно записать следующим образом:
где , , и обозначают соответственно параметры, градиент, скорость и импульс.
Это отличается от подхода Sutskever et al. и других фреймворков, где используется обновление вида:
Вариант Nesterov изменяется аналогичным образом.
Кроме того, начальное значение буфера импульса устанавливается равным значению градиента на первом шаге. Это отличается от некоторых других фреймворков, в которых буфер инициализируется нулями. Одно из заметных последствий такого решения — первое значение импульса не масштабируется коэффициентом ослабления. Ослабление применяется начиная со второго шага.
-
add_param_group(param_group)[исходный код] -
Добавляет группу параметров в
param_groupsOptimizer.Это может быть полезно при тонкой настройке предварительно обученной сети: замороженные слои можно сделать обучаемыми и добавлять в
Optimizerпо мере обучения.- Параметры:
-
param_group (dict) – определяет, какие тензоры следует оптимизировать, а также параметры оптимизации, специфичные для группы.
-
load_state_dict(state_dict)[исходный код] -
Загружает состояние оптимизатора.
- Параметры:
-
state_dict (dict) – состояние оптимизатора. Должно быть объектом, возвращённым вызовом
state_dict().
Предупреждение
Вызывайте этот метод после инициализации
torch.optim.lr_scheduler.LRScheduler, поскольку его вызов до этого перезапишет загруженные скорости обучения.Примечание
Имена параметров (если они указаны под ключом «param_names» в каждой группе параметров в
state_dict()) не влияют на процесс загрузки. Чтобы использовать имена параметров в особых случаях (например, когда параметры в загруженном словаре состояния отличаются от инициализированных в оптимизаторе), следует реализовать пользовательскийregister_load_state_dict_pre_hookдля соответствующей адаптации загруженного словаря. Еслиparam_namesприсутствуют в загруженном словаре состоянияparam_groups, они будут сохранены и при наличии заменят текущие имена в состоянии оптимизатора. Если их нет в загруженном словаре состояния,param_namesоптимизатора останется без изменений.Пример
>>> optimizer = ... # initialized optimizer matching the saved state >>> scheduler1 = torch.optim.lr_scheduler.LinearLR( ... optimizer, ... start_factor=0.1, ... end_factor=1, ... total_iters=20, ... ) >>> scheduler2 = torch.optim.lr_scheduler.CosineAnnealingLR( ... optimizer, ... T_max=80, ... eta_min=3e-5, ... ) >>> lr = torch.optim.lr_scheduler.SequentialLR( ... optimizer, ... schedulers=[scheduler1, scheduler2], ... milestones=[20], ... ) >>> lr.load_state_dict(torch.load("./save_seq.pt")) >>> # now load the optimizer checkpoint after loading the LRScheduler >>> optimizer.load_state_dict(torch.load("./save_optim.pt"))
-
register_load_state_dict_post_hook(hook, prepend=False)[исходный код] -
Регистрирует постхук load_state_dict, который будет вызван после вызова
load_state_dict(). Он должен иметь следующую сигнатуру:hook(optimizer) -> None
Аргумент
optimizer— это используемый экземпляр оптимизатора.Хук будет вызван с аргументом
selfпосле вызоваload_state_dictдляself. Зарегистрированный хук можно использовать для постобработки после того, какload_state_dictзагрузилstate_dict.- Параметры:
-
- hook (Callable) – пользовательский хук для регистрации.
-
prepend (bool) – если True, указанный постхук
hookбудет вызван перед всеми уже зарегистрированными постхуками дляload_state_dict. В противном случае указанныйhookбудет вызван после всех уже зарегистрированных постхуков. (по умолчанию: False)
- Возвращает:
-
дескриптор, с помощью которого можно удалить добавленный хук, вызвав
handle.remove() - Тип возвращаемого значения:
-
torch.utils.hooks.RemovableHandle
-
register_load_state_dict_pre_hook(hook, prepend=False)[исходный код] -
Регистрирует предхук load_state_dict, который будет вызван перед вызовом
load_state_dict(). Он должен иметь следующую сигнатуру:hook(optimizer, state_dict) -> state_dict or None
Аргумент
optimizer— это используемый экземпляр оптимизатора, а аргументstate_dict— поверхностная копияstate_dict, переданного пользователем вload_state_dict. Хук может изменить state_dict на месте или, при необходимости, вернуть новый. Если возвращён state_dict, он будет загружен в оптимизатор.Хук будет вызван с аргументами
selfиstate_dictперед вызовомload_state_dictдляself. Зарегистрированный хук можно использовать для предварительной обработки перед вызовомload_state_dict.- Параметры:
-
- hook (Callable) – пользовательский хук для регистрации.
-
prepend (bool) – если True, указанный предхук
hookбудет вызван перед всеми уже зарегистрированными предхуками дляload_state_dict. В противном случае указанныйhookбудет вызван после всех уже зарегистрированных предхуков. (по умолчанию: False)
- Возвращает:
-
дескриптор, с помощью которого можно удалить добавленный хук, вызвав
handle.remove() - Тип возвращаемого значения:
-
torch.utils.hooks.RemovableHandle
-
register_state_dict_post_hook(hook, prepend=False)[исходный код] -
Регистрирует постхук словаря состояния, который будет вызван после вызова
state_dict().Он должен иметь следующую сигнатуру:
hook(optimizer, state_dict) -> state_dict or None
Хук будет вызван с аргументами
selfиstate_dictпосле созданияstate_dictдляself. Хук может изменить state_dict на месте или, при необходимости, вернуть новый. Зарегистрированный хук можно использовать для постобработкиstate_dictперед его возвратом.- Параметры:
-
- hook (Callable) – пользовательский хук для регистрации.
-
prepend (bool) – если True, указанный постхук
hookбудет вызван перед всеми уже зарегистрированными постхуками дляstate_dict. В противном случае указанныйhookбудет вызван после всех уже зарегистрированных постхуков. (по умолчанию: False)
- Возвращает:
-
дескриптор, с помощью которого можно удалить добавленный хук, вызвав
handle.remove() - Тип возвращаемого значения:
-
torch.utils.hooks.RemovableHandle
-
register_state_dict_pre_hook(hook, prepend=False)[исходный код] -
Регистрирует предхук словаря состояния, который будет вызван перед вызовом
state_dict().Он должен иметь следующую сигнатуру:
hook(optimizer) -> None
Аргумент
optimizer— это используемый экземпляр оптимизатора. Хук будет вызван с аргументомselfперед вызовомstate_dictдляself. Зарегистрированный хук можно использовать для предварительной обработки перед вызовомstate_dict.- Параметры:
-
- hook (Callable) – пользовательский хук для регистрации.
-
prepend (bool) – если True, указанный предхук
hookбудет вызван перед всеми уже зарегистрированными предхуками дляstate_dict. В противном случае указанныйhookбудет вызван после всех уже зарегистрированных предхуков. (по умолчанию: False)
- Возвращает:
-
дескриптор, с помощью которого можно удалить добавленный хук, вызвав
handle.remove() - Тип возвращаемого значения:
-
torch.utils.hooks.RemovableHandle
-
register_step_post_hook(hook)[исходный код] -
Регистрирует постхук шага оптимизатора, который будет вызван после шага оптимизатора.
Он должен иметь следующую сигнатуру:
hook(optimizer, args, kwargs) -> None
Аргумент
optimizer— это используемый экземпляр оптимизатора.- Параметры:
-
hook (Callable) – пользовательский хук для регистрации.
- Возвращает:
-
дескриптор, с помощью которого можно удалить добавленный хук, вызвав
handle.remove() - Тип возвращаемого значения:
-
torch.utils.hooks.RemovableHandle
-
register_step_pre_hook(hook)[исходный код] -
Регистрирует предхук шага оптимизатора, который будет вызван перед шагом оптимизатора.
Он должен иметь следующую сигнатуру:
hook(optimizer, args, kwargs) -> None or modified args and kwargs
Аргумент
optimizer— это используемый экземпляр оптимизатора. Если предхук изменит args и kwargs, преобразованные значения будут возвращены в виде кортежа, содержащего new_args и new_kwargs.- Параметры:
-
hook (Callable) – пользовательский хук для регистрации.
- Возвращает:
-
дескриптор, с помощью которого можно удалить добавленный хук, вызвав
handle.remove() - Тип возвращаемого значения:
-
torch.utils.hooks.RemovableHandle
-
state_dict()[исходный код] -
Возвращает состояние оптимизатора в виде
dict.Оно содержит две записи:
-
-
state: a Dict holding current optimization state. Its content -
различается в зависимости от класса оптимизатора, однако некоторые общие характеристики сохраняются. Например, состояние сохраняется для каждого параметра, а сам параметр НЕ сохраняется.
state— это словарь, сопоставляющий идентификаторы параметров со словарём состояния, соответствующего каждому параметру.
-
-
-
param_groups: a List containing all parameter groups where each -
группа параметров — это словарь. Каждая группа параметров содержит метаданные, относящиеся к оптимизатору, например скорость обучения и затухание весов, а также список идентификаторов параметров, входящих в группу. Если группа параметров была инициализирована с помощью
named_parameters(), в словаре состояния также будут сохранены имена.
-
ПРИМЕЧАНИЕ: Идентификаторы параметров могут выглядеть как индексы, но это всего лишь идентификаторы, связывающие состояние с группой параметров. При загрузке из state_dict оптимизатор сопоставляет
paramsгруппы параметров (целочисленные идентификаторы) иparam_groupsоптимизатора (фактическиеnn.Parameters), чтобы сопоставить состояния БЕЗ дополнительной проверки.Возвращаемый словарь состояния может выглядеть примерно так:
{ 'state': { 0: {'momentum_buffer': tensor(...), ...}, 1: {'momentum_buffer': tensor(...), ...}, 2: {'momentum_buffer': tensor(...), ...}, 3: {'momentum_buffer': tensor(...), ...} }, 'param_groups': [ { 'lr': 0.01, 'weight_decay': 0, ... 'params': [0] 'param_names' ['param0'] (optional) }, { 'lr': 0.001, 'weight_decay': 0.5, ... 'params': [1, 2, 3] 'param_names': ['param1', 'layer.weight', 'layer.bias'] (optional) } ] } -
-
step(closure=None)[исходный код] -
Выполняет один шаг оптимизации.
- Параметры:
-
closure (Callable, optional) – Замыкание, которое повторно оценивает модель и возвращает значение функции потерь.
-
zero_grad(set_to_none=True)[исходный код] -
Сбрасывает градиенты всех оптимизируемых
torch.Tensors.- Параметры:
-
set_to_none (bool, optional) –
Вместо обнуления установить градиенты в None. Значение по умолчанию:
TrueКак правило, это уменьшает использование памяти и может несколько повысить производительность. Однако при этом меняется поведение в некоторых случаях. Например:
- Когда пользователь пытается получить доступ к градиенту и выполнить над ним операции вручную, атрибут None и тензор, заполненный нулями, ведут себя по-разному.
- Если пользователь запрашивает
zero_grad(set_to_none=True), а затем выполняет обратное распространение, для параметров, не получивших градиент,.grads гарантированно будут равны None. -
torch.optimоптимизаторы ведут себя по-разному, если градиент равен 0 или None (в одном случае выполняется шаг с градиентом 0, а в другом шаг полностью пропускается).
-
© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/generated/torch.optim.SGD.html