Re Reference AI

技術

過学習とは

Overfitting

モデルが学習データの細部やノイズまで過剰に適合し、未知のデータに対する予測性能が低下する現象

機械学習汎化

ひとことで言うと

AIが練習問題を丸暗記しすぎて、初めて見る問題にはうまく答えられなくなってしまう状態。

概要

過学習(オーバーフィッティング)は、モデルが訓練データに含まれる本質的なパターンだけでなくノイズや偶然の特徴まで学習してしまい、訓練データへの当てはまりは良い一方で未知のテストデータへの予測性能(汎化性能)が低下してしまう現象。 モデルの表現力(パラメータ数)が学習データの量や多様性を上回るほど大きい場合や、学習を必要以上長く続けた場合に起こりやすい。 訓練データでの損失は下がり続けるのに、検証データでの損失がある時点から悪化し始めるという挙動で観測されることが多い。 対策として、ドロップアウトや正則化によるモデルの表現力の抑制、データ拡張による学習データの多様化、早期終了(Early Stopping)による学習の打ち切りなどが広く使われる。

背景

モデルの表現力を上げるほど訓練データへの当てはまりは向上するが、それが本当に汎用的なパターンなのか、単なる訓練データ固有のノイズなのかを見分けることは難しい。 過学習は、この汎化性能とモデル複雑度のトレードオフの一端として理解される。

歴史

統計学における「バイアスと分散のトレードオフ」の議論を起源とし、機械学習全般で古くから知られる基本的な課題。 2012年のAlexNet以降、深層学習でも意図的に過学習に注意しつつモデルを大規模化する流れが加速し、ドロップアウトなど深層学習向けの正則化手法が発展した。

コード例

scikit-learnで過学習を再現(高次多項式回帰)

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import mean_squared_error

rng = np.random.RandomState(0)
X = np.sort(rng.rand(20, 1) * 10, axis=0)
y = np.sin(X).ravel() + rng.normal(0, 0.1, X.shape[0])
X_train, y_train = X[:15], y[:15]
X_test, y_test = X[15:], y[15:]

poly = PolynomialFeatures(degree=15)
model = LinearRegression().fit(poly.fit_transform(X_train), y_train)

train_err = mean_squared_error(y_train, model.predict(poly.transform(X_train)))
test_err = mean_squared_error(y_test, model.predict(poly.transform(X_test)))
print(train_err, test_err)  # 訓練誤差は小さいがテスト誤差が大きくなる(過学習)

欠点

  • 訓練データでの評価指標だけを見ていると、実運用での性能低下に気づきにくい
  • モデルが小さなノイズにも反応するようになり、入力のわずかな変化で出力が不安定になることがある
  • 対策(正則化やデータ拡張)の調整には試行錯誤とハイパーパラメータ探索の手間がかかる

比較

  • ドロップアウトドロップアウトは過学習を抑えるための代表的な正則化手法の1つ
  • 転移学習学習データが少ない場合の過学習対策として、事前学習済みモデルを転移学習で活用することがある
  • アンサンブル学習アンサンブル学習は複数モデルの予測を平均することで、個々のモデルの過学習の影響を緩和できる

関連用語

ドロップアウト機械学習深層学習転移学習破滅的忘却

よくある質問

過学習が起きているかはどう判断する?

訓練データでの損失・精度は改善し続けるのに、検証データでの損失がある時点から悪化し始める場合、過学習が起きているサインとされる。

過学習を防ぐ代表的な方法は?

ドロップアウトやL2正則化などでモデルの表現力を抑える、データ拡張で学習データを増やす、検証データの性能が悪化し始めた時点で学習を止める早期終了などが代表的。

関連Zenn記事