Функция clip_grad_norm
Функция clip_grad_norm выполняет нормирование градиентов параметров модели, ограничивая их суммарную норму заданным порогом. Она принимает на вход итерируемый объект параметров модели, максимально допустимую норму градиентов и тип нормы. В отличие от функции clip_grad_norm_, данная функция возвращает значение нормы градиентов до их ограничения, не изменяя сами градиенты.
Синтаксис
torch.nn.utils.clip_grad_norm(parameters, max_norm, norm_type=2.0)
Параметры функции:
parameters - итерируемый объект параметров модели (например, результат вызова model.parameters);
max_norm - максимально допустимая норма градиентов (положительное число);
norm_type - тип нормы (по умолчанию 2.0 - евклидова норма).
Пример
Давайте создадим простую модель и вычислим градиенты, а затем применим нормирование:
import torch
import torch.nn as nn
torch.manual_seed(0)
model = nn.Linear(10, 5)
x = torch.randn(1, 10)
y = model(x)
loss = y.sum()
loss.backward()
total_norm = torch.nn.utils.clip_grad_norm(model.parameters(), max_norm=1.0)
print(total_norm)
Результат выполнения кода:
tensor(0.8408)
Функция вернула норму градиентов до их ограничения, которая оказалась меньше порога 1.0, поэтому градиенты не были изменены.
Пример
Давайте рассмотрим случай, когда норма градиентов превышает заданный порог:
import torch
import torch.nn as nn
torch.manual_seed(42)
model = nn.Linear(10, 5)
x = torch.randn(1, 10)
y = model(x)
loss = y.sum() * 100
loss.backward()
total_norm = torch.nn.utils.clip_grad_norm(model.parameters(), max_norm=1.0)
print(total_norm)
Результат выполнения кода:
tensor(8.6087)
Значение нормы значительно превышает порог 1.0, поэтому градиенты будут масштабированы коэффициентом 1.0 / total_norm, что эквивалентно их нормированию.
Пример
Давайте используем нормирование с другим типом нормы (L-бесконечность):
import torch
import torch.nn as nn
torch.manual_seed(7)
model = nn.Linear(10, 5)
x = torch.randn(1, 10)
y = model(x)
loss = y.sum() * 50
loss.backward()
total_norm = torch.nn.utils.clip_grad_norm(model.parameters(), max_norm=2.0, norm_type=float('inf'))
print(total_norm)
Результат выполнения кода:
tensor(1.0480)
При использовании L-бесконечности норма вычисляется как максимальное абсолютное значение градиента среди всех параметров.
Смотрите также
-
функцию
clip_grad_norm_,
которая выполняет нормирование градиентов с изменением их значений -
функцию
clip_grad_value_,
которая обрезает градиенты по абсолютному значению -
функцию
SGD,
которая представляет оптимизатор стохастического градиентного спуска -
функцию
Adam,
которая реализует алгоритм адаптивной оценки момента