PyTorch torch.nn.MSELoss 関数
torch.nn.MSELossPyTorchの平均二乗誤差損失関数です。
予測値と目標値の差の二乗平均を計算し、回帰タスクでよく使われます。
関数定義
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("Mean:", loss_mean.item())
print("Sum:", loss_sum.item())
print("None:", 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("Mean:", loss_mean.item())
print("Sum:", loss_sum.item())
print("None:", 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())
よくある質問
Q1: MSEとMAEはどちらが良いですか?
- MSE: 外れ値に敏感で、勾配が安定
- MAE (L1): 外れ値にロバストで、勾配は不安定
Q2: 出力に負の値がある場合、MSEは使えますか?
はい、MSEは出力の範囲を制限しません。
Q3: 分類タスクではどの損失を使いますか?
分類タスクでは CrossEntropyLoss を使います。
使用シーン
nn.MSELoss主な適用シーンは次のとおりです:
- 回帰タスク: 住宅価格予測、数値推定
- 連続値の予測: ターゲット追跡
- 生成モデル: VAE、GANの一部の損失
その他の拡張