Функция torch.nn.MSELoss в PyTorch
Справочное руководство PyTorch torch.nn
torch.nn.MSELossЭто функция потерь среднеквадратичной ошибки в PyTorch.
Она вычисляет среднее квадратов разностей между предсказанными значениями и целевыми значениями, обычно используется в задачах регрессии.
Определение функции
torch.nn.MSELoss(reduction='mean')
Описание параметров:
reduction(str): метод агрегации потерь. Необязательно.'mean'、'sum'、'none'. По умолчанию —'mean'。
Математический принцип
Формула потерь MSE:
MSE = (1/n) * Σ(y_pred - y_true)²
Примеры использования
Пример 1: Базовое использование
Вычислить потерю регрессии:
Пример
import torch
import torch.nn as nn
# Создать потерю MSE
criterion = nn.MSELoss()
# Предсказанные значения и истинные значения
predictions = torch.tensor([3.0, 4.0, 5.0])
targets = torch.tensor([2.8, 4.2, 4.9])
# Вычислите потери
loss = criterion(predictions, targets)
print("Предсказанные значения:", predictions.tolist())
print("Целевые значения:", targets.tolist())
print("Потеря MSE:", loss.item())
# Ручная проверка
manual_mse = ((predictions - targets) ** 2).mean()
print("Ручное вычисление:", manual_mse.item())
import torch.nn as nn
# Создать потерю MSE
criterion = nn.MSELoss()
# Предсказанные значения и истинные значения
predictions = torch.tensor([3.0, 4.0, 5.0])
targets = torch.tensor([2.8, 4.2, 4.9])
# Вычислите потери
loss = criterion(predictions, targets)
print("Предсказанные значения:", predictions.tolist())
print("Целевые значения:", targets.tolist())
print("Потеря MSE:", loss.item())
# Ручная проверка
manual_mse = ((predictions - targets) ** 2).mean()
print("Ручное вычисление:", manual_mse.item())
Пример 2: Полное обучение регрессии
Процесс обучения для задачи регрессии:
Пример
import torch
import torch.nn as nn
import torch.optim as optim
# Простая модель регрессии
class RegressionNet(nn.Module):
def __init__(self):
super(RegressionNet, self).__init__()
self.fc = nn.Linear(10, 1)
def forward(self, x):
return self.fc(x)
model = RegressionNet()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)
# Данные для обучения
X = torch.randn(100, 10)
y = torch.randn(100, 1)
# Шаги обучения
model.train()
optimizer.zero_grad()
predictions = model(X)
loss = criterion(predictions, y)
loss.backward()
optimizer.step()
print("Потеря при обучении:", loss.item())
import torch.nn as nn
import torch.optim as optim
# Простая модель регрессии
class RegressionNet(nn.Module):
def __init__(self):
super(RegressionNet, self).__init__()
self.fc = nn.Linear(10, 1)
def forward(self, x):
return self.fc(x)
model = RegressionNet()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)
# Данные для обучения
X = torch.randn(100, 10)
y = torch.randn(100, 1)
# Шаги обучения
model.train()
optimizer.zero_grad()
predictions = model(X)
loss = criterion(predictions, y)
loss.backward()
optimizer.step()
print("Потеря при обучении:", loss.item())
Пример 3: Параметр reduction
Различные методы агрегации:
Пример
import torch
import torch.nn as nn
pred = torch.tensor([3.0, 4.0, 5.0, 6.0])
target = torch.tensor([3.5, 3.8, 5.2, 5.5])
# mean: средняя потеря
loss_mean = nn.MSELoss(reduction='mean')(pred, target)
# sum: суммарная потеря
loss_sum = nn.MSELoss(reduction='sum')(pred, target)
# none: без агрегации
loss_none = nn.MSELoss(reduction='none')(pred, target)
print("Среднее:", loss_mean.item())
print("Сумма:", loss_sum.item())
print("Нет:", loss_none.tolist())
import torch.nn as nn
pred = torch.tensor([3.0, 4.0, 5.0, 6.0])
target = torch.tensor([3.5, 3.8, 5.2, 5.5])
# mean: средняя потеря
loss_mean = nn.MSELoss(reduction='mean')(pred, target)
# sum: суммарная потеря
loss_sum = nn.MSELoss(reduction='sum')(pred, target)
# none: без агрегации
loss_none = nn.MSELoss(reduction='none')(pred, target)
print("Среднее:", loss_mean.item())
print("Сумма:", loss_sum.item())
print("Нет:", loss_none.tolist())
Пример 4: Обработка многомерного вывода
Многомерная регрессия:
Пример
import torch
import torch.nn as nn
# Многомерный выход
pred = torch.randn(4, 3) # batch=4, 3 выходных значения
target = torch.randn(4, 3)
criterion = nn.MSELoss()
loss = criterion(pred, target)
print("Форма предсказания:", pred.shape)
print("Форма цели:", target.shape)
print("Потеря MSE:", loss.item())
import torch.nn as nn
# Многомерный выход
pred = torch.randn(4, 3) # batch=4, 3 выходных значения
target = torch.randn(4, 3)
criterion = nn.MSELoss()
loss = criterion(pred, target)
print("Форма предсказания:", pred.shape)
print("Форма цели:", target.shape)
print("Потеря MSE:", loss.item())
ЧАВО
Вопрос 1: Что лучше, MSE или MAE?
- MSE: чувствительна к выбросам, стабильные градиенты
- MAE (L1): устойчива к выбросам, нестабильные градиенты
Вопрос 2: Можно ли использовать MSE, если выходные значения отрицательны?
Да, MSE не ограничивает диапазон выходных значений.
Вопрос 3: Какая функция потерь используется для задач классификации?
Используйте CrossEntropyLoss для задач классификации.
Сценарии использования
nn.MSELossОсновные сценарии применения включают:
- Задачи регрессии: Прогнозирование цены дома, численная оценка
- Прогнозирование непрерывных значений: Отслеживание цели
- Генеративные модели: Определённые функции потерь для VAE, GAN
Другие расширения