[機械学習のはじめ方] Part33: 損失関数(MSE, CrossEntropyなど)

機械学習

機械学習モデルを訓練するとき、モデルがどれくらい「うまく」予測できているかを測る必要があります。その「うまくできているか」を数値で表すのが損失関数 (Loss Function) です。損失関数は、モデルの予測値と実際の値(正解データ)との間の「ずれ」や「誤差」を計算する関数です。

💡 ポイント: 損失関数の値が小さいほど、モデルの予測は正解に近く、性能が良いと判断できます。機械学習の目標は、この損失関数の値をできるだけ小さくするようにモデルのパラメータ(重みなど)を調整することです。

損失関数は、モデルが学習を進める上での「道しるべ」のような役割を果たします。どの方向に進めばより良い予測ができるようになるかを示してくれるのです。

損失関数には様々な種類があり、解きたい問題の種類(回帰問題か分類問題か)によって使い分けられます。ここでは、特によく使われる代表的な損失関数をいくつか見ていきましょう。

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

MSEは、主に回帰問題(連続値を予測する問題、例: 家賃予測、株価予測)で使われる最も一般的な損失関数の一つです。予測値と実際の値の差をそれぞれ二乗し、その平均値を計算します。

数式で表すと以下のようになります(nはデータ数、yiは実際の値、ŷiは予測値):
MSE = (1/n) * Σ(yi - ŷi)2

⚠️ 特徴: MSEは、誤差が大きいほど損失の値が急激に大きくなる(二乗されるため)という特徴があります。そのため、大きな外れ値(他のデータから極端に離れた値)があると、その影響を強く受けてしまう可能性があります。

Python (NumPy) での計算例:

import numpy as np

# 実際の値
y_true = np.array([100, 150, 200, 250])
# モデルの予測値
y_pred = np.array([110, 140, 220, 240])

# MSEの計算
mse = np.mean((y_true - y_pred)**2)

print(f"平均二乗誤差 (MSE): {mse}")
# 出力例: 平均二乗誤差 (MSE): 150.0

2. 交差エントロピー誤差 (Cross-Entropy Error)

交差エントロピー誤差は、主に分類問題(カテゴリを予測する問題、例: 画像が犬か猫か、スパムメールか否か)で使われます。モデルが出力した各クラスに属する「確率」と、実際のクラス(正解ラベル)との間の「距離」や「ずれ」を測る指標です。

特に、ニューラルネットワークの分類タスクでは標準的に用いられます。正解ラベルに対する予測確率が低いほど、損失の値は大きくなります。

🎯 ポイント: 交差エントロピー誤差には、主に2つのバリエーションがあります。
  • 二値交差エントロピー (Binary Cross-Entropy): 2つのクラス(例: 0か1、YesかNo)に分類する場合に使われます。「ログ損失 (Log Loss)」とも呼ばれます。
  • カテゴリカル交差エントロピー (Categorical Cross-Entropy): 3つ以上のクラスに分類する場合に使われます。

二値交差エントロピーの考え方(yは実際の値[0 or 1]、pはクラス1である予測確率):
Loss = - (y * log(p) + (1 - y) * log(1 - p))
(通常はデータ全体の平均を取ります)

カテゴリカル交差エントロピーの考え方(クラス数をC、yicはサンプルiがクラスcなら1、それ以外は0、picはサンプルiがクラスcである予測確率):
Loss = - (1/n) * ΣiΣc (yic * log(pic))

Python (NumPy) での計算例(二値交差エントロピー):

import numpy as np

# 実際のクラス (0: 陰性, 1: 陽性)
y_true = np.array([0, 1, 1, 0])
# モデルが陽性クラスと予測した確率
y_pred_prob = np.array([0.1, 0.8, 0.6, 0.3])

# 数値計算の安定性のため、微小な値を加える (log(0)を避ける)
epsilon = 1e-15
y_pred_prob = np.clip(y_pred_prob, epsilon, 1 - epsilon)

# 二値交差エントロピーの計算
bce = -np.mean(y_true * np.log(y_pred_prob) + (1 - y_true) * np.log(1 - y_pred_prob))

print(f"二値交差エントロピー: {bce}")
# 出力例: 二値交差エントロピー: 0.3043413657081038

※ 実際のフレームワーク (TensorFlow, PyTorch) では、より効率的で安定した実装が提供されています。

3. その他の損失関数

上記以外にも、特定の状況で役立つ損失関数があります。

  • 平均絶対誤差 (Mean Absolute Error: MAE): 予測値と実際の値の差の絶対値の平均を計算します。MSEと異なり、誤差を二乗しないため、外れ値の影響を受けにくいという特徴があります。回帰問題で使われます。
    MAE = (1/n) * Σ|yi - ŷi|
  • Huber損失 (Huber Loss): MSEとMAEを組み合わせたような損失関数です。誤差が小さいときはMSEのように、誤差が大きいときはMAEのように振る舞います。これにより、外れ値に対してMAEのように頑健でありながら、誤差が小さい領域ではMSEのようにスムーズに最適化できる利点があります。回帰問題で使われます。
  • Hinge損失 (Hinge Loss): 主にサポートベクターマシン (SVM) などの最大マージン分類器で用いられる損失関数です。正しく分類され、かつ十分なマージン(境界からの距離)がある場合は損失が0になります。

損失関数の選び方 🤔

どの損失関数を選ぶかは、解きたい問題の種類やデータの特性によって決まります。

問題の種類主な損失関数特徴・考慮点
回帰問題MSE, MAE, Huber損失
  • 外れ値に敏感で、大きな誤差を特に避けたい場合: MSE
  • 外れ値の影響を抑えたい場合: MAE
  • 両方の利点を組み合わせたい場合: Huber損失
二値分類問題二値交差エントロピー (Log Loss)確率を出力するモデル(ロジスティック回帰、ニューラルネットワークなど)に適しています。
多クラス分類問題カテゴリカル交差エントロピー各クラスへの所属確率を出力するモデル(Softmax関数を伴うニューラルネットワークなど)に適しています。
特殊なケースHinge損失などSVMのような特定のアルゴリズムや、不均衡データに対応した損失関数(例: Focal Loss)など、目的に応じて選択します。
まとめ: まずは、問題の種類(回帰か分類か)に合わせて、標準的な損失関数(MSEや交差エントロピー)を試してみるのが一般的です。その後、モデルの性能やデータの特性に応じて、他の損失関数を検討してみましょう。

まとめ

損失関数は、機械学習モデルの性能を測り、学習を導くための非常に重要な要素です。

  • 損失関数は、モデルの予測と実際の値の誤差を計算します。
  • モデルの学習目標は、この損失を最小化することです。
  • MSEは回帰問題の、交差エントロピー誤差は分類問題の代表的な損失関数です。
  • 問題の種類やデータの特性に応じて適切な損失関数を選ぶことが、モデルの精度向上につながります。

損失関数の役割と種類を理解することで、モデルがどのように学習していくのか、より深く理解できるようになります。次のステップでは、この損失を最小化するための「最適化手法」について学んでいきましょう! 💪

コメント

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