PR

【PyTorch完全版】機械学習のタスクと対応する損失関数一覧

この記事は約17分で読めます。
スポンサーリンク

以下は、機械学習における代表的なタスクと、それに対応する深層学習モデルの損失関数、およびそれを実装するためのPyTorchのメソッドの一覧です。
PyTorchによる実装の参考になれば幸いです。

回帰タスク


スポンサーリンク

1. 平均二乗誤差 (Mean Squared Error, MSE)¶

概要:¶

予測値と真値の差を二乗し、その平均をとる。大きな誤差に対してペナルティが大きい。

最適化する内容:¶

予測値を真値にできるだけ近づけ、大きな誤差を最小化する。

実装例:¶

import torch
import torch.nn as nn

loss_fn = nn.MSELoss()
y_pred = torch.tensor([2.5, 3.0, 3.5])
y_true = torch.tensor([3.0, 2.8, 3.7])
loss = loss_fn(y_pred, y_true)
print(loss.item())

使用例:¶

  • タスク: 回帰 (例: 住宅価格予測)
  • 最適化: 平均的な予測誤差(大きな誤差を抑える)。

スポンサーリンク

2. 平均絶対誤差 (Mean Absolute Error, MAE)¶

概要:¶

予測値と真値の絶対差の平均をとる。外れ値に対してMSEよりロバスト。

最適化する内容:¶

予測値を真値に近づけ、全体の絶対誤差を最小化する。

実装例:¶

loss_fn = nn.L1Loss()
y_pred = torch.tensor([2.5, 3.0, 3.5])
y_true = torch.tensor([3.0, 2.8, 3.7])
loss = loss_fn(y_pred, y_true)
print(loss.item())

使用例:¶

  • タスク: 回帰 (例: 売上予測)
  • 最適化: 外れ値の影響を抑えた平均誤差。

スポンサーリンク

3. Huber損失 (Huber Loss)¶

概要:¶

小さな誤差では二乗、外れ値では絶対値を使う。MSEとMAEの中間。

最適化する内容:¶

外れ値の影響を抑えつつ、小さな誤差を効果的に最小化。

実装例:¶

class HuberLoss(nn.Module):
    def __init__(self, delta=1.0):
        super().__init__()
        self.delta = delta

    def forward(self, y_pred, y_true):
        error = y_true - y_pred
        is_small_error = torch.abs(error) <= self.delta
        squared_loss = 0.5 * error**2
        linear_loss = self.delta * (torch.abs(error) - 0.5 * self.delta)
        return torch.where(is_small_error, squared_loss, linear_loss).mean()

loss_fn = HuberLoss(delta=1.0)
y_pred = torch.tensor([2.5, 3.0, 3.5])
y_true = torch.tensor([3.0, 2.8, 3.7])
loss = loss_fn(y_pred, y_true)
print(loss.item())

使用例:¶

  • タスク: 回帰 (例: 時間予測)
  • 最適化: 外れ値を抑えた全体的な誤差。

スポンサーリンク

4. Log-Cosh損失¶

概要:¶

誤差の対数双曲線を利用する。外れ値の影響を抑えつつMSEの特性を維持。

最適化する内容:¶

小さな誤差ではMSEに近い動作をし、大きな誤差の影響を緩和。

実装例:¶

class LogCoshLoss(nn.Module):
    def forward(self, y_pred, y_true):
        error = y_true - y_pred
        return torch.mean(torch.log(torch.cosh(error)))

loss_fn = LogCoshLoss()
y_pred = torch.tensor([2.5, 3.0, 3.5])
y_true = torch.tensor([3.0, 2.8, 3.7])
loss = loss_fn(y_pred, y_true)
print(loss.item())

使用例:¶

  • タスク: 回帰 (例: ストック予測)
  • 最適化: 滑らかに外れ値を抑制。

スポンサーリンク

5. Quantile Loss (分位損失)¶

概要:¶

予測の分位を調整し、特定の分布の傾向に合わせる。

最適化する内容:¶

指定分位(例: 中央値、上位25%)に最適化。

実装例:¶

class QuantileLoss(nn.Module):
    def __init__(self, quantile=0.5):
        super().__init__()
        self.quantile = quantile

    def forward(self, y_pred, y_true):
        error = y_true - y_pred
        return torch.mean(torch.max(self.quantile * error, (self.quantile - 1) * error))

loss_fn = QuantileLoss(quantile=0.5)  # 中央値
y_pred = torch.tensor([2.5, 3.0, 3.5])
y_true = torch.tensor([3.0, 2.8, 3.7])
loss = loss_fn(y_pred, y_true)
print(loss.item())

使用例:¶

  • タスク: 回帰 (例: 需要予測)
  • 最適化: 特定分位での誤差を最小化。


分類タスク


スポンサーリンク

6. クロスエントロピー損失 (Cross-Entropy Loss)¶

概要:¶

予測された確率分布と真の分布(ワンホットベクトル)の間のクロスエントロピーを最小化する。

最適化する内容:¶

クラス分類タスクで、予測確率を真のクラスに近づける。

実装例:¶

loss_fn = nn.CrossEntropyLoss()
y_pred = torch.tensor([[2.0, 1.0, 0.1], [0.1, 2.0, 1.0]])
y_true = torch.tensor([0, 1])  # 正解ラベル
loss = loss_fn(y_pred, y_true)
print(loss.item())

使用例:¶

  • タスク: 多クラス分類 (例: 手書き文字認識)
  • 最適化: 正しいクラスの確率を最大化。

スポンサーリンク

7. バイナリクロスエントロピー損失 (Binary Cross-Entropy Loss)¶

概要:¶

2値分類の損失関数。予測確率と真値(0または1)の間のクロスエントロピーを計算。

最適化する内容:¶

正しいクラス(0または1)の確率を最大化。

実装例:¶

loss_fn = nn.BCELoss()
y_pred = torch.tensor([0.8, 0.4, 0.6])
y_true = torch.tensor([1.0, 0.0, 1.0])
loss = loss_fn(y_pred, y_true)
print(loss.item())

使用例:¶

  • タスク: 2値分類 (例: スパムメール分類)
  • 最適化: 正しいクラスの確率を最大化。

スポンサーリンク

8. Hinge Loss¶

概要:¶

サポートベクターマシン(SVM)で使われる損失関数。誤分類マージンを最小化。

最適化する内容:¶

データポイントが正しいマージンを満たすようにする。

実装例:¶

class HingeLoss(nn.Module):
    def forward(self, y_pred, y_true):
        y_true = 2 * y_true - 1  # 0/1を-1/1に変換
        return torch.mean(torch.clamp(1 - y_pred * y_true, min=0))

loss_fn = HingeLoss()
y_pred = torch.tensor([1.2, -0.5, 0.8])
y_true = torch.tensor([1, 0, 1])  # 0/1ラベル
loss = loss_fn(y_pred, y_true)
print(loss.item())

使用例:¶

  • タスク: 分類 (例: 顔認識)
  • 最適化: クラス間のマージンを最大化。

スポンサーリンク

9. KLダイバージェンス損失 (Kullback-Leibler Divergence Loss)¶

概要:¶

2つの確率分布(予測と真の分布)の間の差を測定。

最適化する内容:¶

予測分布を真の分布に近づける。

実装例:¶

loss_fn = nn.KLDivLoss(reduction='batchmean')
y_pred = torch.log_softmax(torch.tensor([[0.4, 0.6], [0.5, 0.5]]), dim=1)
y_true = torch.tensor([[0.0, 1.0], [0.5, 0.5]])  # 真の分布
loss = loss_fn(y_pred, y_true)
print(loss.item())

使用例:¶

  • タスク: 確率分布の最適化 (例: 言語モデルの調整)
  • 最適化: 予測分布をターゲット分布に一致させる。


ランク学習


スポンサーリンク

10. Pairwise Log Loss (LambdaRank)¶

概要:¶

ランキングタスクでペアワイズの誤差を最小化。優先順位が高い項目が正しく上位に来るように学習。

最適化する内容:¶

関連性の高いアイテムが低いアイテムよりもスコアが高くなるようにする。

実装例:¶

class PairwiseLogLoss(nn.Module):
    def forward(self, y_pred, y_true):
        pair_diff = y_pred[:, None] - y_pred[None, :]
        pair_labels = (y_true[:, None] - y_true[None, :]).sign()
        log_loss = torch.log(1 + torch.exp(-pair_labels * pair_diff))
        return torch.mean(log_loss)

loss_fn = PairwiseLogLoss()
y_pred = torch.tensor([2.5, 1.2, 3.0])
y_true = torch.tensor([1, 0, 1])  # 1=関連, 0=非関連
loss = loss_fn(y_pred, y_true)
print(loss.item())

使用例:¶

  • タスク: 検索ランキング、推奨システム
  • 最適化: 相対的な順位を正しくする。
スポンサーリンク

11. Mean Reciprocal Rank (MRR)¶

概要:¶

ランキングタスクで使われ、真の項目がランク付けされたリストの上位に現れるように最適化。1つのリストに対して最初に出現する正解アイテムの順位の逆数を評価。

最適化する内容:¶

真の項目をランキングの上位に配置。

実装例:¶

class MRRLoss(nn.Module):
    def forward(self, y_pred, y_true):
        sorted_indices = torch.argsort(y_pred, descending=True)
        true_indices = (y_true == 1).nonzero(as_tuple=True)[0]
        ranks = (sorted_indices == true_indices[:, None]).nonzero(as_tuple=True)[1] + 1
        return torch.mean(1.0 / ranks.float())

y_pred = torch.tensor([0.2, 0.9, 0.4, 0.6])
y_true = torch.tensor([0, 1, 0, 0])  # 1は関連アイテム
loss_fn = MRRLoss()
loss = loss_fn(y_pred, y_true)
print(loss.item())

使用例:¶

  • タスク: 情報検索、ランキング評価
  • 最適化: 真のアイテムが高ランクになるように学習。

スポンサーリンク

12. ListNet/ListMLE Loss¶

概要:¶

リスト全体を考慮したランキング損失。リストの確率分布を予測し、真の分布との距離を最小化。

最適化する内容:¶

ランキングリスト全体の順序を正しくする。

実装例 (ListMLE):¶

class ListMLELoss(nn.Module):
    def forward(self, y_pred, y_true):
        sorted_indices = torch.argsort(y_true, descending=True)
        sorted_preds = y_pred[sorted_indices]
        log_fact = torch.logsumexp(sorted_preds, dim=0, keepdim=True)
        log_probs = sorted_preds - torch.cumsum(log_fact, dim=0)
        return -torch.sum(log_probs)

y_pred = torch.tensor([0.3, 0.6, 0.1, 0.8])
y_true = torch.tensor([0, 1, 0, 1])  # 大きいほど重要
loss_fn = ListMLELoss()
loss = loss_fn(y_pred, y_true)
print(loss.item())

使用例:¶

  • タスク: 推奨システム、検索エンジン
  • 最適化: リスト全体の関連性を高める。

スポンサーリンク

13. NDCG Loss (Normalized Discounted Cumulative Gain)¶

概要:¶

ランキングの品質を測る指標NDCGに基づく損失。関連性の高いアイテムをリストの上位に配置。

最適化する内容:¶

リスト内の順位に基づいてスコアを最大化。

実装例:¶

class NDCGLoss(nn.Module):
    def forward(self, y_pred, y_true):
        sorted_indices = torch.argsort(y_pred, descending=True)
        sorted_true = y_true[sorted_indices]
        gains = 2**sorted_true - 1
        discounts = torch.log2(torch.arange(2, len(sorted_true) + 2).float())
        dcg = torch.sum(gains / discounts)
        ideal_sorted_true = torch.sort(y_true, descending=True)[0]
        ideal_gains = 2**ideal_sorted_true - 1
        ideal_dcg = torch.sum(ideal_gains / discounts)
        return -dcg / ideal_dcg

y_pred = torch.tensor([0.2, 0.8, 0.6, 0.4])
y_true = torch.tensor([0, 3, 2, 1])  # 大きいほど重要
loss_fn = NDCGLoss()
loss = loss_fn(y_pred, y_true)
print(loss.item())

使用例:¶

  • タスク: 検索エンジン、推薦システム
  • 最適化: リスト全体のNDCGスコアを最大化。


物体検出


スポンサーリンク

14. IoU損失 (Intersection over Union Loss)¶

概要:¶

セグメンテーションタスクで使われる損失。予測された領域と真の領域のIoU(交差部分の割合)を最小化。

最適化する内容:¶

予測領域が真の領域と完全に重なるようにする。

実装例:¶

class IoULoss(nn.Module):
    def forward(self, y_pred, y_true):
        intersection = torch.sum(y_pred * y_true)
        union = torch.sum(y_pred + y_true) - intersection
        return 1 - intersection / (union + 1e-6)

y_pred = torch.tensor([[0, 1], [1, 1]], dtype=torch.float32)
y_true = torch.tensor([[1, 1], [0, 1]], dtype=torch.float32)
loss_fn = IoULoss()
loss = loss_fn(y_pred, y_true)
print(loss.item())

使用例:¶

  • タスク: セグメンテーション、物体検出
  • 最適化: 領域の一致を最大化。

スポンサーリンク

15. Focal Loss¶

概要:¶

クロスエントロピー損失を修正し、不均衡なデータセットで学習が困難な例を重視。

最適化する内容:¶

難しいサンプルを優先的に学習。

実装例:¶

class FocalLoss(nn.Module):
    def __init__(self, alpha=0.25, gamma=2):
        super().__init__()
        self.alpha = alpha
        self.gamma = gamma

    def forward(self, y_pred, y_true):
        bce_loss = nn.BCEWithLogitsLoss(reduction='none')(y_pred, y_true)
        prob = torch.sigmoid(y_pred)
        focal_weight = self.alpha * (1 - prob)**self.gamma * y_true + (1 - self.alpha) * prob**self.gamma * (1 - y_true)
        return torch.mean(focal_weight * bce_loss)

y_pred = torch.tensor([0.2, -0.8, 1.5])
y_true = torch.tensor([1.0, 0.0, 1.0])
loss_fn = FocalLoss()
loss = loss_fn(y_pred, y_true)
print(loss.item())

使用例:¶

  • タスク: 不均衡な分類タスク (例: 欠陥検出)
  • 最適化: 難しいクラスの予測を向上。

スポンサーリンク

16. Dice損失¶

概要:¶

セグメンテーションタスクで使われる損失。Diceスコア(領域の類似度)を最大化。

最適化する内容:¶

予測領域と真の領域の一致を最大化。

実装例:¶

class DiceLoss(nn.Module):
    def forward(self, y_pred, y_true):
        smooth = 1e-6
        intersection = 2 * torch.sum(y_pred * y_true)
        union = torch.sum(y_pred + y_true)
        return 1 - intersection / (union + smooth)

y_pred = torch.tensor([[0, 1], [1, 1]], dtype=torch.float32)
y_true = torch.tensor([[1, 1], [0, 1]], dtype=torch.float32)
loss_fn = DiceLoss()
loss = loss_fn(y_pred, y_true)
print(loss.item())

使用例:¶

  • タスク: セグメンテーション
  • 最適化: 領域の類似度を高める。


生成タスク


スポンサーリンク

17. Adversarial Loss (GANs)¶

概要:¶

生成モデル(GAN)の訓練に使用。生成器と識別器の競争を最適化。

最適化する内容:¶

生成器は識別器を騙すようなサンプルを生成。

実装例:¶

loss_fn = nn.BCEWithLogitsLoss()
real_preds = torch.tensor([0.8, 0.9])
fake_preds = torch.tensor([0.1, 0.3])
real_labels = torch.ones_like(real_preds)
fake_labels = torch.zeros_like(fake_preds)

d_loss = loss_fn(real_preds, real_labels) + loss_fn(fake_preds, fake_labels)
print(d_loss.item())

使用例:¶

  • タスク: 画像生成、データ拡張
  • 最適化: 本物と偽物を識別する能力。

コメント

タイトルとURLをコピーしました