マルチ出力モデルの評価と損失の重み付け

PyTorchによる中級ディープラーニング

Michal Oleszak

Machine Learning Engineer

モデルの評価

acc_alpha = Accuracy(
    task="multiclass", num_classes=30
)
acc_char = Accuracy(
    task="multiclass", num_classes=964
)


net.eval() with torch.no_grad(): for images, labels_alpha, labels_char \ in dataloader_test: out_alpha, out_char = net(images)
_, pred_alpha = torch.max(out_alpha, 1) _, pred_char = torch.max(out_char, 1)
acc_alpha(pred_alpha, labels_alpha) acc_char(pred_char, labels_char)
  • 各出力のメトリクスを設定
  • テストローダーを反復して出力を取得
  • 各出力の予測を計算
  • 精度メトリクスを更新
  • 最終精度スコアを計算
print(f"Alphabet: {acc_alpha.compute()}")
print(f"Character: {acc_char.compute()}")
Alphabet: 0.3166305720806122
Character: 0.24064336717128754
PyTorchによる中級ディープラーニング

マルチ出力の学習ループ再考

for epoch in range(10):
    for images, labels_alpha, labels_char \
    in dataloader_train:
        optimizer.zero_grad()
        outputs_alpha, outputs_char = net(images)
        loss_alpha = criterion(
          outputs_alpha, labels_alpha
        )
        loss_char = criterion(
          outputs_char, labels_char
        )
        loss = loss_alpha + loss_char
        loss.backward()
        optimizer.step()
  • アルファベットと文字の2つの損失
  • 最終損失はアルファベット損失と文字損失の和:loss = loss_alpha + loss_char
  • 両分類タスクは同等の重要度とみなす
PyTorchによる中級ディープラーニング

タスクの重要度の調整

文字分類はアルファベット分類の2倍重要

  • アプローチ1:重要な損失を2倍にスケーリング

    loss = loss_alpha + loss_char * 2
    
  • アプローチ2:合計が1になる重みを割り当て

    loss = 0.33 * loss_alpha + 0.67 * loss_char
    
PyTorchによる中級ディープラーニング

注意:スケールが異なる損失

  • 重み付けと加算の前に、損失を同じスケールに揃える必要がある
  • タスク例:

    • 住宅価格を予測 → MSE損失
    • 品質(低・中・高)を予測 → CrossEntropy損失
  • CrossEntropyは通常1桁台

  • MSE損失は数万に達することがある
  • モデルが品質予測タスクを無視してしまう
  • 解決策:重み付けと加算の前に両損失を正規化
    loss_price = loss_price / torch.max(loss_price)
    loss_quality = loss_quality / torch.max(loss_quality)
    loss = 0.7 * loss_price + 0.3 * loss_quality
    
PyTorchによる中級ディープラーニング

練習しましょう!

PyTorchによる中級ディープラーニング

Preparing Video For Download...