導入
「どれくらい外したか」を1つの数値にできなければ、AIは自分の良し悪しを判断できません。この「外れ具合」を表す数値が 損失(loss) です。まずは損失を自分で計算してみましょう。
説明
もっとも基本的な損失が 平均二乗誤差(MSE: Mean Squared Error) です。各データについて「予測 − 正解」を求め、2乗して、平均を取ります。
$$\text{MSE} = \frac{1}{n}\sum_{i=1}^{n}(\hat{y}_i - y_i)^2$$
2乗するのは、(1)プラスとマイナスの誤差が打ち消し合わないように、(2)大きく外したときのペナルティを強くするため、の2つの狙いがあります。
flowchart LR yhat["予測 ŷ"] --> diff["差 = ŷ − y"] y["正解 y"] --> diff diff --> sq["2乗"] sq --> mean["平均"] mean --> loss["損失(1つの数値)"]
やってみよう
下のエディタには、正解 y と、2つの予測(pred_a:まあまあ/pred_b:ひどい)に対する MSE を計算するコードが入っています。実行して、予測が悪いほど損失が大きくなることを確かめましょう。数値をいじって、どうすれば損失が 0 に近づくかも試してください。
import numpy as np
# 正解の値
y = np.array([3.0, 5.0, 7.0, 9.0])
# 2つの予測
pred_a = np.array([2.8, 5.2, 6.9, 9.3]) # まあまあ良い予測
pred_b = np.array([1.0, 8.0, 4.0, 2.0]) # ひどい予測
def mse(pred, target):
return np.mean((pred - target) ** 2)
print("予測Aの損失:", mse(pred_a, y))
print("予測Bの損失:", mse(pred_b, y))
print("完璧な予測の損失:", mse(y, y))
演習
pred_a の数値を書き換えて、損失を 0.01 より小さくしてみましょう。どの向きに動かせば損失が減るか、体で覚えるのが狙いです。
ヒント1を見る
損失を最小にする予測は「正解そのもの」です。各要素を y の値(3, 5, 7, 9)に近づけましょう。
ヒント2を見る
例えば pred_a = np.array([3.0, 5.0, 7.0, 9.0]) なら損失は 0 になります。少しずらすとどうなるかも見てみましょう。
まとめ
- 損失は「予測が正解からどれだけ外れたか」を表す1つの数値。
- 基本は MSE(平均二乗誤差):差を2乗して平均する。
- 学習のゴールは、この損失をできるだけ小さくすること。