損失の計算とパラメータの更新

PyTorchにおける損失の計算とパラメータの更新は、モデルの学習において最も重要なステップの一つです。このプロセスは、モデルの出力と正解ラベルとの誤差(損失)を計算し、その損失を元に勾配を計算し、パラメータ(重み)を更新するという一連の流れから構成されます。

以下に、その流れを段階ごとに詳しく説明します。


1. 損失関数(Loss Function)の定義

損失関数は、モデルの予測結果と実際の正解との誤差を数値で定量化する関数です。タスクの種類によって使う関数が異なります。

  • 回帰問題torch.nn.MSELoss(平均二乗誤差)

  • 2値分類torch.nn.BCELoss

  • 多クラス分類torch.nn.CrossEntropyLoss

python
import torch.nn as nn criterion = nn.CrossEntropyLoss() # 例えば多クラス分類の場合

2. 損失の計算

モデルに入力データを渡して出力(予測)を得た後、その出力と正解ラベルから損失を計算します。

python
outputs = model(inputs) # モデルによる予測 loss = criterion(outputs, labels) # 出力と正解ラベルから損失を計算

3. 勾配の初期化(ゼロクリア)

PyTorchでは、loss.backward() を呼ぶと、勾配は各パラメータの .grad 属性に蓄積されていく仕組みです。そのため、毎回勾配を初期化する必要があります。

python
optimizer.zero_grad()

4. 逆伝播による勾配計算

損失関数の出力から、各パラメータに対する勾配を自動で計算します。PyTorchのautograd機能がこれを担います。

python
loss.backward()

この段階で、モデルのすべてのパラメータ(requires_grad=Trueのもの)に対して .grad に勾配が格納されます。


5. パラメータの更新

勾配を用いてパラメータを更新します。これはオプティマイザ(SGDやAdamなど)を使って行います。

python
optimizer.step()

たとえば、SGDオプティマイザの定義は以下のようになります。

python
import torch.optim as optim optimizer = optim.SGD(model.parameters(), lr=0.01)

まとめ:一連の学習ステップの例

python
# 順伝播 outputs = model(inputs) # 損失の計算 loss = criterion(outputs, labels) # 勾配の初期化 optimizer.zero_grad() # 逆伝播による勾配計算 loss.backward() # パラメータの更新 optimizer.step()

この一連のステップを各エポック(epoch)ごとに繰り返すことで、モデルのパラメータが最適化され、学習が進行します。PyTorchでは柔軟性が高いため、これらのステップをカスタムトレーニングループに組み込むことが可能です。

生成日:2025/05/22