はじめに:誤差関数とは?
ディープラーニングや機械学習を学び始めると、必ず出会うのが「誤差関数(ごさかんすう)」という言葉です。誤差関数は、一言でいうと「AIモデルの予測精度を測る『ものさし』」のようなものです。モデルが算出した予測値と、実際の正解値がどれだけ「ズレている」か(=誤差)を計算するための関数です。
この誤差の値が小さければ小さいほど、そのモデルは「精度が高い」と評価できます。ディープラーニングの学習プロセスは、この誤差を最小化することを目標に進められます。つまり、誤差関数はモデルが賢くなるための道しるべとなる、非常に重要な役割を担っているのです。
「誤差関数」が持つ2つの意味
実は「誤差関数」という言葉は、文脈によって少し違う意味で使われることがあります。混乱しないように、2つの意味を理解しておきましょう。
1. ディープラーニングにおける「損失関数(Loss Function)」
ディープラーニングの分野で「誤差関数」という場合、ほとんどは「損失関数(Loss Function)」や「コスト関数(Cost Function)」と同じ意味で使われます。予測の「間違い」や「ズレ」は、モデルにとっての「損失」や「コスト」と捉えられるため、このような名前で呼ばれています。本記事では、主にこちらの意味で解説を進めます。
機械学習やディープラーニングの文脈では、「誤差関数」と「損失関数」はほぼ同義語として扱われるのが一般的です。モデルの学習においては、この関数の値を最小化することが目的となります。
2. 数学的な「ガウスの誤差関数(erf)」
数学の世界には、そのものズバリ「誤差関数 (Error Function, erf)」という名前の関数が存在します。これは正規分布(ガウス分布)に関連する特殊関数で、確率や統計の分野で利用されます。ディープラーニングの理論の背景には数学がありますが、モデルの学習で直接このerfを損失関数として使用することは稀です。
したがって、「ディープラーニングの誤差関数」と聞いたときは、まず「損失関数」のことだと考えてよいでしょう。
なぜ誤差関数が必要なのか?
ディープラーニングのモデルは、はじめはランダムなパラメータ(重みやバイアス)を持っているため、全く見当違いな予測をします。そこで、学習データを使って「正解」を教え、モデルの予測と正解のズレ(=誤差)を誤差関数で計算します。
そして、その誤差が小さくなるように、パラメータを少しずつ調整していくのです。この調整プロセスを「最適化(Optimization)」と呼び、代表的な手法に「勾配降下法(こうばいこうかほう)」があります。誤差関数を微分することで、誤差が最も小さくなる方向(勾配)を求め、その方向にパラメータを更新します。この一連の作業を繰り返すことで、モデルは徐々に賢くなり、精度の高い予測ができるようになります。
代表的な誤差関数の種類
誤差関数には様々な種類があり、解きたい問題の種類(タスク)によって使い分けられます。ここでは、代表的な「回帰問題」と「分類問題」で使われる誤差関数を紹介します。
1. 回帰問題で使われる誤差関数
回帰問題は、株価や気温、不動産価格など、連続する数値を予測するタスクです。
平均二乗誤差 (Mean Squared Error, MSE)
最も代表的な誤差関数の一つです。各データにおける「予測値と正解値の差」を二乗し、その平均を求めます。差を二乗するため、誤差が大きいほど、関数の値はより急激に大きくなるという特徴があります。これにより、大きな誤差に対してより強いペナルティを与えることができます。
import numpy as np
# y_pred: モデルの予測値, y_true: 正解値
def mean_squared_error(y_pred, y_true): return np.mean((y_pred - y_true)**2)
# 例
y_pred = np.array([2.5, 5.0, 4.0, 8.0])
y_true = np.array([3.0, 5.0, 2.5, 7.0])
mse = mean_squared_error(y_pred, y_true)
print(f"平均二乗誤差: {mse}") # ( (2.5-3.0)^2 + (5.0-5.0)^2 + (4.0-2.5)^2 + (8.0-7.0)^2 ) / 4 = 0.875
平均絶対誤差 (Mean Absolute Error, MAE)
「予測値と正解値の差」の絶対値をとり、その平均を求めます。MSEと異なり、誤差を二乗しないため、外れ値(極端に大きい、または小さい値)の影響を受けにくいという特徴があります。
import numpy as np
# y_pred: モデルの予測値, y_true: 正解値
def mean_absolute_error(y_pred, y_true): return np.mean(np.abs(y_pred - y_true))
# 例
y_pred = np.array([2.5, 5.0, 4.0, 8.0])
y_true = np.array([3.0, 5.0, 2.5, 7.0])
mae = mean_absolute_error(y_pred, y_true)
print(f"平均絶対誤差: {mae}") # ( |2.5-3.0| + |5.0-5.0| + |4.0-2.5| + |8.0-7.0| ) / 4 = 0.75
2. 分類問題で使われる誤差関数
分類問題は、画像が「犬」か「猫」か、メールが「スパム」か「通常」かなど、データがどのカテゴリに属するかを予測するタスクです。
交差エントロピー誤差 (Cross-Entropy Error)
分類問題で最も広く使われる誤差関数です。モデルが出力した「各カテゴリに属する確率」と、「正解のカテゴリ」を比較して誤差を計算します。予測した確率分布が、正解の分布にどれだけ近いかを測る指標で、予測が大きく外れているほど値が大きくなります。
特に、2つのクラスに分類する「二値分類」ではバイナリ交差エントロピーが、3つ以上のクラスに分類する「多クラス分類」ではカテゴリカル交差エントロピーが用いられます。
import numpy as np
# y_pred: モデルの予測確率, y_true: 正解ラベル (one-hot表現)
def cross_entropy_error(y_pred, y_true): delta = 1e-7 # log(0) になるのを防ぐための微小な値 return -np.sum(y_true * np.log(y_pred + delta))
# 例:多クラス分類 (カテゴリ0, 1, 2)
# 正解はカテゴリ2 (one-hot表現で)
y_true = np.array()
# 予測確率:カテゴリ2の確率が最も高い (良い予測)
y_pred1 = np.array([0.1, 0.2, 0.7])
error1 = cross_entropy_error(y_pred1, y_true)
print(f"良い予測の場合の誤差: {error1:.4f}") # - (0*log(0.1) + 0*log(0.2) + 1*log(0.7)) = 0.3567
# 予測確率:カテゴリ0の確率が最も高い (悪い予測)
y_pred2 = np.array([0.8, 0.1, 0.1])
error2 = cross_entropy_error(y_pred2, y_true)
print(f"悪い予測の場合の誤差: {error2:.4f}") # - (0*log(0.8) + 0*log(0.1) + 1*log(0.1)) = 2.3026
誤差関数の比較と選び方
どの誤差関数を選ぶかは、モデルの性能に直接影響します。以下に代表的な関数の特徴をまとめます。
誤差関数 | 主な用途 | 長所 | 短所 |
---|---|---|---|
平均二乗誤差 (MSE) | 回帰問題 | ・数学的に扱いやすく、微分が容易 ・大きな誤差に対して敏感に反応する | ・外れ値の影響を非常に受けやすい |
平均絶対誤差 (MAE) | 回帰問題 | ・外れ値に対して頑健(ロバスト) ・誤差の大きさを直感的に理解しやすい | ・勾配が常に一定のため、最適解の近くで学習が進みにくいことがある |
交差エントロピー誤差 | 分類問題 | ・モデルの出力(確率)を最大化するように学習を進めることができる ・分類問題の評価指標として理論的に優れている | ・回帰問題には直接適用できない |
基本的には、回帰問題なら平均二乗誤差、分類問題なら交差エントロピー誤差を選択するのが定石です。ただし、データに外れ値が多いと分かっている場合は、平均絶対誤差を試すなど、状況に応じた選択が求められます。
まとめ
この記事では、ディープラーニングにおける「誤差関数(損失関数)」について、その役割から代表的な種類までを解説しました。
誤差関数は、モデルが何を基準に「良く」なったり「悪く」なったりするのかを定義する、ディープラーニングの学習における根幹的な要素です。この概念を理解することで、モデルの学習がどのように進んでいるのかをより深く把握できるようになるでしょう。