Spec-Zone.ru › PyTorch 1

SGD

class torch.optim.SGD(params, lr=<required parameter>, momentum=0, dampening=0, weight_decay=0, nesterov=False, *, maximize=False, foreach=None, differentiable=False) [source]

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

вход:γ (lr),θ0 (params),f(θ) (objective),λ (weight decay),μ (momentum),τ (dampening),nesterov,maximizefort=1to…dogt←∇θft(θt−1)ifλ≠0gt←gt+λθt−1ifμ≠0ift>1bt←μbt−1+(1−τ)gtelsebt←gtifnesterovgt←gt+μbtelsegt←btifmaximizeθt←θt−1+γgtelseθt←θt−1−γgtвозвратθt\begin{aligned} &\rule{110mm}{0.4pt} \\ &\textbf{вход} : \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}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}\textbf{if} \: \textit{maximize} \\ &\hspace{10mm}\theta_t \leftarrow \theta_{t-1} + \gamma g_t \\[-1.ex] &\hspace{5mm}\textbf{else} \\[-1.ex] &\hspace{10mm}\theta_t \leftarrow \theta_{t-1} - \gamma g_t \\[-1.ex] &\rule{110mm}{0.4pt} \\[-1.ex] &\bf{возврат} \: \theta_t \\[-1.ex] &\rule{110mm}{0.4pt} \\[-1.ex] \end{aligned}

Момент Нестерова основан на формуле из On the importance of initialization and momentum in deep learning.

Параметры:
  • params (iterable) – перебираемая группа параметров для оптимизации или словари, определяющие группы параметров
  • lr (float) – скорость обучения
  • momentum (float, optional) – фактор импульса (по умолчанию: 0)
  • weight_decay (float, optional) – спад веса (штраф L2) (по умолчанию: 0)
  • dampening (float, optional) – затухание для импульса (по умолчанию: 0)
  • nesterov (bool, optional) – включение импульса Нестерова (по умолчанию: False)
  • maximize (bool, optional) – максимизировать параметры на основе целевой функции, а не минимизировать (по умолчанию: False)
  • foreach (bool, optional) – используется ли реализация оптимизатора foreach (по умолчанию: None)

Пример

>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> optimizer.zero_grad()
>>> loss_fn(model(input), target).backward()
>>> optimizer.step()

Примечание

Реализация SGD с моментом/Нестеровым моментом немного отличается от реализации Sutskever et. al. и реализаций в некоторых других фреймворках.

Рассматривая конкретный случай момента, обновление можно записать как

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}

Аналогично модифицируется версия Нестерова.

add_param_group(param_group)

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

Это может быть полезно при доработке предварительно обученной сети, так как замороженные слои можно сделать обучаемыми и добавить в Optimizer по мере обучения.

Параметры:

param_group (dict) – Указывает, какие тензоры следует оптимизировать вместе с группами специфических параметров оптимизации.

load_state_dict(state_dict)

Загружает состояние оптимизатора.

Параметры:

state_dict (dict) – состояние оптимизатора. Должно быть объектом, возвращаемым из вызова state_dict().

state_dict()

Возвращает состояние оптимизатора в виде dict.

Он содержит две записи:

  • state - словарь, содержащий текущее состояние оптимизации. Его содержимое

    отличается в зависимости от классов оптимизаторов.

  • param_groups - список, содержащий все группы параметров, где каждая

    группа параметров — это словарь.

zero_grad(set_to_none=False)

Устанавливает градиенты всех оптимизированных torch.Tensor s в ноль.

Параметры:

set_to_none (bool) – вместо установки в ноль, установить grads в None. Это, как правило, приведет к меньшему объему памяти и может незначительно улучшить производительность. Однако это меняет определенное поведение. Например: 1. Когда пользователь пытается получить доступ к градиенту и выполнить на нем ручные операции, атрибут None или тензор, заполненный нулями, будет вести себя по-разному. 2. Если пользователь запросит zero_grad(set_to_none=True) с последующим обратным проходом, .grad для параметров, которые не получили градиент, гарантированно будут None. 3. torch.optim оптимизаторы ведут себя по-разному, если градиент равен 0 или None (в одном случае он выполняет шаг с градиентом 0, а в другом — пропускает шаг целиком).

© 2024, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://pytorch.org/docs/1.13/generated/torch.optim.SGD.html

Spec-Zone.ru

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