Функция clip_grad_value_
Функция clip_grad_value_ применяется к градиентам параметров модели и обрезает их значения так, чтобы они не превышали заданное максимальное абсолютное значение. Первым параметром функция принимает список параметров модели, вторым - максимальное абсолютное значение градиентов. Функция изменяет градиенты на месте, о чём говорит суффикс _.
Синтаксис
torch.nn.utils.clip_grad_value_(parameters, clip_value)
Параметры функции:
-
parameters- список или итератор параметров модели; -
clip_value- максимальное абсолютное значение для обрезки градиентов; - возвращаемое значение - функция возвращает максимальную норму градиентов до обрезки.
Пример с линейной моделью
Давайте обучим простую линейную модель и применим обрезку градиентов по значению:
import torch
import torch.nn as nn
torch.manual_seed(0)
model = nn.Linear(10, 1)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
criterion = nn.MSELoss()
x = torch.randn(5, 10)
y = torch.randn(5, 1)
optimizer.zero_grad()
output = model(x)
loss = criterion(output, y)
loss.backward()
clip_value = 0.5
torch.nn.utils.clip_grad_value_(model.parameters(), clip_value)
optimizer.step()
print("Обучение завершено с обрезкой градиентов")
Пример с проверкой значений градиентов
Посмотрим, как функция изменяет градиенты параметров модели:
import torch
import torch.nn as nn
torch.manual_seed(0)
model = nn.Linear(5, 1)
x = torch.randn(3, 5)
y = torch.randn(3, 1)
criterion = nn.MSELoss()
output = model(x)
loss = criterion(output, y)
loss.backward()
print("Градиенты до обрезки:")
for param in model.parameters():
if param.grad is not None:
print(param.grad)
clip_value = 0.2
torch.nn.utils.clip_grad_value_(model.parameters(), clip_value)
print("\nГрадиенты после обрезки:")
for param in model.parameters():
if param.grad is not None:
print(param.grad)
Пример с нейронной сетью
Используем обрезку градиентов при обучении многослойной сети:
import torch
import torch.nn as nn
torch.manual_seed(0)
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(10, 20)
self.fc2 = nn.Linear(20, 10)
self.fc3 = nn.Linear(10, 1)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
x = self.fc3(x)
return x
model = SimpleNN()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
criterion = nn.MSELoss()
x = torch.randn(8, 10)
y = torch.randn(8, 1)
for epoch in range(3):
optimizer.zero_grad()
output = model(x)
loss = criterion(output, y)
loss.backward()
max_norm = torch.nn.utils.clip_grad_value_(model.parameters(), 0.3)
optimizer.step()
print(f"Epoch {epoch + 1}, Loss: {loss.item():.4f}")
Смотрите также
-
функцию
clip_grad_norm_,
которая обрезает градиенты по норме -
функцию
clip_grad_norm,
которая обрезает градиенты по норме без изменения на месте -
оптимизатор
SGD,
который используется для обновления параметров модели -
функцию потерь
MSELoss,
которая вычисляет среднеквадратичную ошибку