深層学習

MSEとMAE

二乗誤差と絶対誤差の性質を、外れ値・推定される代表値・勾配の違いから使い分ける。

  • B|標準
  • 深層学習

数式の記号で止まったら 記号の読み方 (∂・⊙・転置・上付き添字を、読み方から)

ひとことで言うと

MSE(平均二乗誤差)は予測誤差を二乗して平均し、MAE(平均絶対誤差)は絶対値を取って平均する回帰損失です。MSE は大きな誤差を急激に重く扱い、MAE は誤差の大きさに比例して扱います。

MSE は遅刻の罰金が遅刻時間の二乗で増える制度、MAE は遅刻時間に比例する制度です。1分の遅刻が増えたとき、前者はすでに大きく遅れた人をさらに強く追い立てます。

なぜ必要か

回帰では、正負の誤差をそのまま足すと相殺されます。そこで誤差を常に非負にする必要があり、二乗と絶対値が代表的な選択肢になります。選択は「どちらが正しいか」ではなく、外れ値をどの程度学習に反映したいかで決まります。

同じデータでも、損失を変えるとモデルが寄せる先が変わります。条件付き分布の中心を平均で表したいなら MSE、中央値で表したいなら MAE です。目的変数の単位を保ちたい場合は MAE の解釈が直接的ですが、MAE は誤差ゼロで傾きが切り替わるため、最適化の扱いも確認します。

損失誤差への重み外れ値の影響推定する中心
MSE二乗で増える大きい条件付き平均
MAE絶対値に比例比較的小さい条件付き中央値

仕組み

予測を y^\hat{y}、正解を yy、誤差を e=y^−ye=\hat{y}-y、要素数を NN とします。PyTorch の既定の mean は要素ごとの損失を平均し、sum なら合計、none なら要素ごとの値を残します。

LMSE=1N∑i=1Nei2,LMAE=1N∑i=1N∣ei∣L_{\mathrm{MSE}}=\frac{1}{N}\sum_{i=1}^{N}e_i^2,\qquad L_{\mathrm{MAE}}=\frac{1}{N}\sum_{i=1}^{N}|e_i|

MSE の勾配は ∂ei2/∂ei=2ei\partial e_i^2/\partial e_i=2e_i なので、誤差が10倍なら勾配の大きさも10倍です。一方、MAE の勾配は ei>0e_i>0 で 11、ei<0e_i<0 で −1-1 です。したがって MAE は大きな外れ値に勾配を占有されにくい反面、ei=0e_i=0 では微分できません。実装では原点の勾配を便宜的に0などと定めますが、そこが二乗誤差との明確な違いです。

一定値 aa を予測するとき、MSE の期待損失を E[(Y−a)2∣X=x]\mathbb{E}[(Y-a)^2\mid X=x] と書けます。aa で微分して0と置くと a=E[Y∣X=x]a=\mathbb{E}[Y\mid X=x]、つまり条件付き平均になります。MAE の期待損失 E[∣Y−a∣∣X=x]\mathbb{E}[|Y-a|\mid X=x] は、左右にある確率質量が釣り合う点で最小になり、条件付き中央値を選びます。

Huber 損失は、しきい値 δ>0\delta>0(外れ値とみなす境界)を使い、∣e∣≤δ|e|\leq\delta では二乗、∣e∣>δ|e|>\delta では絶対値に近い線形へ切り替えます。原点付近の滑らかさと、大きな誤差への頑健さを同時に欲しいときの折衷です。

Lδ(e)={12e2∣e∣≤δδ(∣e∣−12δ)∣e∣>δL_{\delta}(e)=\begin{cases}\frac{1}{2}e^2 & |e|\leq\delta\\ \delta\left(|e|-\frac{1}{2}\delta\right) & |e|>\delta\end{cases}

試験でどう問われるか

問われ方正解に寄る条件引っかけ
外れ値への反応MSE は二乗により強く反応、MAE は比例「MSE のほうが頑健」
最小化で得る代表値MSE は条件付き平均、MAE は条件付き中央値どちらも平均とする
微分の比較MAE は誤差0で微分不能、MSE は滑らかMAE の勾配も誤差に比例とする
Huber の位置づけ小誤差は二乗、大誤差は線形全域で二乗または全域で絶対値
API の出力mean は要素平均、sum は合計、none は未集約バッチ平均と要素平均を無条件に同一視

実装で確かめる

外れ値を追加したとき、MSE の増加が MAE より大きくなることを NumPy で確かめます。mean を明示し、テンソルの要素数で割る場所を曖昧にしないのが実装上の要点です。

import numpy as np

error = np.array([1.0, -1.0, 2.0])
outlier = np.append(error, 10.0)
mse = lambda e: np.mean(e ** 2)
mae = lambda e: np.mean(np.abs(e))
print(mse(error), mae(error))
print(mse(outlier), mae(outlier))
assert mse(outlier) - mse(error) > mae(outlier) - mae(error)

取り違えやすいもの

用語切り分け
RMSEMSE の平方根。目的変数と同じ単位になるが、最小化する代表値の性質は MSE と同じ
MAEL1 損失とも呼ばれる。外れ値の影響はMSEより小さいが、原点で滑らかでない
Huber二乗と絶対値を誤差の大きさで接続する損失。しきい値 δ\delta が挙動を決める
reduction='sum'損失の種類ではなく集約方法。バッチサイズや要素数で値と勾配の尺度が変わる

想起チェック

MSE と MAE は外れ値をどう扱うか

MSE は誤差を二乗するため大きな誤差を強く重く扱い、MAE は絶対値に比例して扱います。

一定値予測で MSE と MAE が推定する中心は何か

MSE は条件付き平均、MAE は条件付き中央値です。

MAE の原点で最適化上の注意点は何か

誤差ゼロでは絶対値が微分できません。実装では勾配を便宜的に選び、Huber のように原点近くを二乗で滑らかにする選択肢もあります。

出典