RNNの学習と評価

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

Michal Oleszak

Machine Learning Engineer

平均二乗誤差損失

  • 誤差:

    $$prediction - target$$

  • 二乗誤差:

    $$(prediction - target)^2$$

  • 平均二乗誤差:

    $$avg[(prediction - target)^2]$$

誤差を二乗する意味:

  • 正負の誤差が相殺されない
  • 大きな誤差をより強く罰する
  • PyTorchでの実装:
      criterion = nn.MSELoss()
    
PyTorchによる中級ディープラーニング

テンソルの次元拡張

  • 再帰層の入力形状は (batch_size, seq_length, num_features)
  • 現在の形状は (batch_size, seq_length)
  • 末尾に次元を1つ追加する必要がある
for seqs, labels in dataloader_train:
    print(seqs.shape)
torch.Size([32, 96])
seqs = seqs.view(32, 96, 1)
print(seqs.shape)
torch.Size([32, 96, 1])
PyTorchによる中級ディープラーニング

テンソルのスクイーズ

  • 評価ループでは、学習ループの形状変換を元に戻す必要がある
  • ラベルの形状は (batch_size)

    for seqs, labels in test_loader:
      print(labels.shape)
    
    torch.Size([32])
    
  • モデル出力の形状は (batch_size, 1)

    out = net(seqs)
    
    torch.Size([32, 1])
    
  • 損失関数のためにモデル出力とラベルの形状を一致させる必要がある
  • モデル出力の最後の次元を削除できる

    out = net(seqs).squeeze()
    
    torch.Size([32])
    
PyTorchによる中級ディープラーニング

学習ループ

net = Net()
criterion = nn.MSELoss()
optimizer = optim.Adam(
  net.parameters(), lr=0.001
)


for epoch in range(num_epochs): for seqs, labels in dataloader_train:
seqs = seqs.view(32, 96, 1)
outputs = net(seqs) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step()
  • モデル・損失・オプティマイザーのインスタンス化
  • エポックとデータバッチのイテレーション
  • 入力シーケンスの形状変換
  • その他:通常どおり
PyTorchによる中級ディープラーニング

評価ループ

mse = torchmetrics.MeanSquaredError()


net.eval() with torch.no_grad(): for seqs, labels in test_loader:
seqs = seqs.view(32, 96, 1)
outputs = net(seqs).squeeze()
mse(outputs, labels)
print(f"Test MSE: {mse.compute()}")
Test MSE: 0.13292162120342255
  • MSEメトリクスの設定
  • 勾配なしでテストデータをイテレーション
  • モデル入力の形状変換
  • モデル出力のスクイーズ
  • メトリクスの更新
  • 最終メトリクス値の計算
PyTorchによる中級ディープラーニング

LSTMとGRUの比較

  • LSTM:
Test MSE: 0.13292162120342255
  • GRU:
Test MSE: 0.12187089771032333
  • GRUが有利:同等以上の結果をより少ない計算コストで達成
PyTorchによる中級ディープラーニング

練習しましょう!

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

Preparing Video For Download...