はじめに: 損失関数がすべてを動かす
La 損失関数 (損失関数) とモデルが最適化する基準 トレーニング中。そして学習の「羅針盤」:「間違える」とはどういうことかを定義する そしていくら。間違った損失を選択すると、たとえ 完璧な建築。
何を学ぶか
- 回帰損失: MSE、MAE、Huber 損失
- 分類別の損失: バイナリおよびマルチクラスのクロスエントロピー
- 不均衡なデータセットの焦点損失
- SVM のヒンジ損失とマージン
- 埋め込み用のコントラスト損失と三重項損失
- カスタム損失関数を作成する方法
回帰による損失
平均二乗誤差 (MSE)
回帰に最もよく使用される損失。大きなエラーに二次的にペナルティを与える:
予測に関する導関数 \\ハット{y}_i:
プロ: どこでも微分可能、勾配は誤差に比例します。 に対して: に敏感です 外れ値 (単一の異常点は、 損失を支配します)。
平均絶対誤差 (MAE)
プロ: 外れ値に対して堅牢です (線形ペナルティ)。 に対して: 一定の勾配 (最小付近で加速しない)、ゼロ微分可能ではありません。
ヒューバーの損失: 妥協
La フーバー損失 MSE と MAE の長所を組み合わせたものです。エラーに対しては MSE のように動作します。 小さいエラーの場合は MAE として、大きなエラーの場合は次のようになります。
import numpy as np
def mse(y_true, y_pred):
return np.mean((y_true - y_pred)**2)
def mae(y_true, y_pred):
return np.mean(np.abs(y_true - y_pred))
def huber_loss(y_true, y_pred, delta=1.0):
error = np.abs(y_true - y_pred)
quadratic = np.minimum(error, delta)
linear = error - quadratic
return np.mean(0.5 * quadratic**2 + delta * linear)
# Dati normali
y_true = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
y_pred = np.array([1.1, 2.2, 2.8, 4.1, 4.9])
print("Senza outlier:")
print(f" MSE: {mse(y_true, y_pred):.4f}")
print(f" MAE: {mae(y_true, y_pred):.4f}")
print(f" Huber: {huber_loss(y_true, y_pred):.4f}")
# Aggiungi outlier
y_true_out = np.append(y_true, 6.0)
y_pred_out = np.append(y_pred, 20.0) # Outlier!
print("\nCon outlier:")
print(f" MSE: {mse(y_true_out, y_pred_out):.4f}")
print(f" MAE: {mae(y_true_out, y_pred_out):.4f}")
print(f" Huber: {huber_loss(y_true_out, y_pred_out):.4f}")
分類別損失
バイナリクロスエントロピー (BCE)
シグモイド出力による二値分類の場合 \\hat{y} = \\sigma(z) \\in (0, 1):
(エレガントにシンプルな) 派生関数:
カテゴリカルクロスエントロピー
ソフトマックス出力によるマルチクラス分類の場合:
ワンホットラベル付き(1枚のみ) y_c = 1)、次のようになります。 L = -\\log(\\hat{y}_c)、 どこ c そして正しいクラス。
焦点損失: 不均衡なデータセットの場合
La 焦点損失 簡単な例の重みを減らして、難しい例に焦点を当てます。
どこ p_t そして正しいクラスの確率、 \\ガンマ \\geq 0 および集束パラメータ (通常は 2)、e \\アルファ_t そしてバランス係数。モデルがすでにある場合 確かに(p_t 高)、用語 (1 - p_t)^\\ガンマ 損失への寄与を減らします。
import numpy as np
def softmax(z):
exp_z = np.exp(z - np.max(z, axis=-1, keepdims=True))
return exp_z / np.sum(exp_z, axis=-1, keepdims=True)
def cross_entropy_loss(y_true, logits):
"""Categorical cross-entropy con softmax."""
probs = softmax(logits)
n = y_true.shape[0]
log_probs = -np.log(probs[np.arange(n), y_true] + 1e-15)
return np.mean(log_probs)
def focal_loss(y_true, logits, gamma=2.0, alpha=1.0):
"""Focal loss per dataset sbilanciati."""
probs = softmax(logits)
n = y_true.shape[0]
pt = probs[np.arange(n), y_true]
focal_weight = alpha * (1 - pt) ** gamma
log_probs = -np.log(pt + 1e-15)
return np.mean(focal_weight * log_probs)
# Esempio: 3 classi
y_true = np.array([0, 1, 2, 1, 0])
logits = np.array([
[2.0, 0.5, -1.0], # Classe 0 facile
[0.1, 3.0, -0.5], # Classe 1 facile
[-1.0, 0.2, 1.5], # Classe 2 media
[0.5, 0.3, 0.2], # Classe 1 difficile
[0.1, 0.1, 0.1], # Classe 0 difficilissima
])
print(f"Cross-Entropy: {cross_entropy_loss(y_true, logits):.4f}")
print(f"Focal Loss (gamma=2): {focal_loss(y_true, logits, gamma=2):.4f}")
print(f"Focal Loss (gamma=0): {focal_loss(y_true, logits, gamma=0):.4f}") # = CE
類似性学習による損失
ヒンジの損失
で使用されます SVM (サポート ベクター マシン)、クラス間に最小限のマージンが必要です。
どこ y \\in \\{-1, +1\\}。モデルが次のように正しく分類された場合 十分なマージンがある場合、損失はゼロです。
コントラスト損失
ペアを埋め込む場合は、類似したアイテムを近づけ、異なるアイテムをさらに離します。
どこ d = \\|f(x_1) - f(x_2)\\|, y=0 似たようなカップルの場合、 y=1 さまざまなカップルの場合、e m そして余白。
トリプレット損失
トリプレット (アンカー、ポジティブ、ネガティブ) を使用して埋め込みを学習します。
アンカーは、マイナスよりもプラスに、ある程度の余裕を持って近づける必要があります。 m.
温度のスケーリングと校正
Il 温度スケーリング パラメータを追加するポストキャリブレーション手法 T > 0 ソフトマックスへ:
T > 1: 「よりソフトな」分布 (信頼度が低い)。 T < 1: 「より困難な」分布 (より自信があります)。 T = 1:標準ソフトマックス。
損失を選択するためのガイド
実践的なルール:
- 回帰: MSE (標準)、Huber (外れ値あり)、MAE (中央値と平均値)
- 二項分類: バイナリクロスエントロピー + シグモイド
- マルチクラス分類: クロスエントロピー + ソフトマックス
- 不均衡なデータセット: クラス重みを使用した焦点損失またはクロスエントロピー
- 類似性/埋め込み: 三重項損失または対比損失
- ランキング: ヒンジ損失またはマージンランキング損失
まとめ
覚えておくべき重要なポイント
- MSE: \\frac{1}{n}\\sum(y - \\hat{y})^2 - 回帰の標準、外れ値に敏感
- クロスエントロピー: -\\合計 y_k \\log \\hat{y}_k - 分類の基準
- 焦点損失: 追加 (1-p_t)^\\ガンマ クラスのバランスをとるために
- フーバー損失: しきい値による堅牢な MSE/MAE 妥協 \\デルタ
- トリプレット損失: 余裕を持った埋め込みを学習する
- 気温: T ソフトマックスの信頼度をスケールする
次の記事で: を探索してみます 推論統計 データサイエンティスト向け。信頼区間、t 検定、p 値、A/B テストとそれらの回避方法 最も一般的な統計トラップ。







