РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
568 of 769 menu

Функция 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,
    которая вычисляет среднеквадратичную ошибку
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить