Spec-Zone.ru › PyTorch 2.14

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) [исходный код]

Реализует стохастический градиентный спуск (при необходимости с импульсом).

input:γ (lr),θ0 (params),f(θ) (objective),λ (weight decay),μ (momentum),τ (dampening),nesterov,maximizefort=1to…doifmaximize:gt←−∇θft(θt−1)elsegt←∇θft(θt−1)ifλ≠0gt←gt+λθt−1ifμ≠0ift>1bt←μbt−1+(1−τ)gtelsebt←gtifnesterovgt←gt+μbtelsegt←btθt←θt−1−γgtreturnθt\begin{aligned} &\rule{110mm}{0.4pt} \\ &\textbf{input} : \gamma \text{ (lr)}, \: \theta_0 \text{ (params)}, \: f(\theta) \text{ (objective)}, \: \lambda \text{ (weight decay)}, \\ &\hspace{13mm} \:\mu \text{ (momentum)}, \:\tau \text{ (dampening)}, \:\textit{ nesterov,}\:\textit{ maximize} \\[-1.ex] &\rule{110mm}{0.4pt} \\ &\textbf{for} \: t=1 \: \textbf{to} \: \ldots \: \textbf{do} \\ &\hspace{5mm}\textbf{if} \: \textit{maximize}: \\ &\hspace{10mm}g_t \leftarrow -\nabla_{\theta} f_t (\theta_{t-1}) \\ &\hspace{5mm}\textbf{else} \\ &\hspace{10mm}g_t \leftarrow \nabla_{\theta} f_t (\theta_{t-1}) \\ &\hspace{5mm}\textbf{if} \: \lambda \neq 0 \\ &\hspace{10mm} g_t \leftarrow g_t + \lambda \theta_{t-1} \\ &\hspace{5mm}\textbf{if} \: \mu \neq 0 \\ &\hspace{10mm}\textbf{if} \: t > 1 \\ &\hspace{15mm} \textbf{b}_t \leftarrow \mu \textbf{b}_{t-1} + (1-\tau) g_t \\ &\hspace{10mm}\textbf{else} \\ &\hspace{15mm} \textbf{b}_t \leftarrow g_t \\ &\hspace{10mm}\textbf{if} \: \textit{nesterov} \\ &\hspace{15mm} g_t \leftarrow g_{t} + \mu \textbf{b}_t \\ &\hspace{10mm}\textbf{else} \\[-1.ex] &\hspace{15mm} g_t \leftarrow \textbf{b}_t \\ &\hspace{5mm}\theta_t \leftarrow \theta_{t-1} - \gamma g_t \\[-1.ex] &\rule{110mm}{0.4pt} \\[-1.ex] &\bf{return} \: \theta_t \\[-1.ex] &\rule{110mm}{0.4pt} \\[-1.ex] \end{aligned}

Импульс Нестерова основан на формуле из статьи О важности инициализации и импульса в глубоком обучении.

Параметры:
  • 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: обновление можно записать следующим образом:

vt+1=μ∗vt+gt+1,pt+1=pt−lr∗vt+1,\begin{aligned} v_{t+1} & = \mu * v_{t} + g_{t+1}, \\ p_{t+1} & = p_{t} - \text{lr} * v_{t+1}, \end{aligned}

где pp, gg, vv и μ\mu обозначают соответственно параметры, градиент, скорость и импульс.

Это отличается от подхода Sutskever et al. и других фреймворков, где используется обновление вида:

vt+1=μ∗vt+lr∗gt+1,pt+1=pt−vt+1.\begin{aligned} v_{t+1} & = \mu * v_{t} + \text{lr} * g_{t+1}, \\ p_{t+1} & = p_{t} - v_{t+1}. \end{aligned}

Вариант Nesterov изменяется аналогичным образом.

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

add_param_group(param_group) [исходный код]

Добавляет группу параметров в param_groups Optimizer.

Это может быть полезно при тонкой настройке предварительно обученной сети: замороженные слои можно сделать обучаемыми и добавлять в 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.Parameter s), чтобы сопоставить состояния БЕЗ дополнительной проверки.

Возвращаемый словарь состояния может выглядеть примерно так:

{
    '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)
        }
    ]
}
Тип возвращаемого значения:

dict[str, Any]

step(closure=None) [исходный код]

Выполняет один шаг оптимизации.

Параметры:

closure (Callable, optional) – Замыкание, которое повторно оценивает модель и возвращает значение функции потерь.

zero_grad(set_to_none=True) [исходный код]

Сбрасывает градиенты всех оптимизируемых torch.Tensor s.

Параметры:

set_to_none (bool, optional) –

Вместо обнуления установить градиенты в None. Значение по умолчанию: True

Как правило, это уменьшает использование памяти и может несколько повысить производительность. Однако при этом меняется поведение в некоторых случаях. Например:

  1. Когда пользователь пытается получить доступ к градиенту и выполнить над ним операции вручную, атрибут None и тензор, заполненный нулями, ведут себя по-разному.
  2. Если пользователь запрашивает zero_grad(set_to_none=True), а затем выполняет обратное распространение, для параметров, не получивших градиент, .grads гарантированно будут равны None.
  3. 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API