機械学習を学び始めると、「特徴量」「損失関数」「勾配降下法」「過学習」など、たくさんの用語が出てきます。
それぞれの意味を調べても、モデルを作る流れのどこで使う言葉なのかが分からないと、知識がつながりにくくなります。
この記事では、教師あり学習の小さな例を使って、データの準備から学習・評価・予測までを一通り整理します。まず全体の流れをつかみ、その中に基礎用語を置いていきます。
この記事の対象とゴール
対象は、機械学習の学習を始めた方や、サンプルコードの各処理が何をしているのか整理したい方です。
読み終えたときに、次の3点を説明できることを目指します。
- モデルは、何をもとに、何を調整しているのか
- なぜ学習用とは別のデータで評価するのか
- 学習と推論は、何が違うのか
主に扱うのは、入力と正解を組み合わせて学ぶ教師あり学習です。すべてのAIが、この記事と同じ方法で学習するわけではありません。本文はコードを実行しなくても読めます。末尾に、パラメータを1回更新する短いPythonコードを載せています。
1. 「モデルが学習する」とは何か
例えば、「荷物の重さから送料を予測する」という架空の課題を考えます。
荷物の重さ x(kg) |
送料 y(百円) |
|---|---|
| 1 | 3 |
| 2 | 5 |
| 3 | 7 |
これは説明用に作ったデータです。実際の配送サービスの料金体系や測定結果ではありません。
ここでは、入力から予測値を出すモデルを、次の一次式にします。
予測する送料 = w × 荷物の重さ + b
数式では、次のように書けます。
\hat{y} = wx + b
| 記号・用語 | この例での意味 |
|---|---|
x:特徴量 |
予測の手掛かりとして入力する、荷物の重さ |
y:目的変数 |
予測したい対象である送料。訓練時には観測した値を正解として使う |
ŷ:予測値 |
現在のモデルが計算した送料 |
w, b:パラメータ |
学習によって調整する、重さへの係数と切片 |
学習とは、この例では、データに合うように w と b を調整することです。
人が最初から w = 2、b = 1 と決めて固定する代わりに、入力と正解から、それらの値を求めます。ただし、何を入力にするか、どの形のモデルを使うか、どう評価するかまで、自動で適切に決まるとは限りません。
送料のような数値を予測する課題を回帰といいます。「迷惑メールか、そうでないか」のようなカテゴリを予測する課題は分類です。どちらも教師あり学習の代表的な課題です。
2. データの準備から予測までの全体像
モデルの開発は、大まかに次の順序で進めます。
この図には、開発者がモデルを比較・改善する繰り返しが含まれています。後で説明する「学習中にパラメータを何度も更新する繰り返し」とは、ひとつ外側の話です。
また、テスト結果が良くなければ、そのまま利用する必要はありません。ただし、テスト結果を見ながら何度も調整すると、そのデータを最終評価用として独立に扱えなくなります。開発をやり直す際には、評価方法も見直します。
目的と評価方法を先に決める
送料を予測したいなら、「どの程度の誤差まで許容するか」を考えます。
例えば、平均絶対誤差(MAE) は、予測と正解の差の絶対値を平均したものです。送料の単位が百円なら、MAEが 0.5 であることは、平均で50円のずれがあることを表します。[5]
単に「精度を上げる」ではなく、何を予測し、どの指標で、どの程度なら役に立つかを決めると、その後の作業の目的が明確になります。
3. データを分けるのは、未知のデータで確かめるため
学習に使ったデータで良い結果が出ても、まだ見ていないデータで同じように予測できるとは限りません。
そこで、データに役割を持たせます。
| データ | 役割 | 主に何に使うか |
|---|---|---|
| 訓練データ | モデルに学習させる | パラメータの調整 |
| 検証データ | 開発途中の候補を比較する | モデルや設定の選択 |
| テストデータ | 選んだモデルを最後に確かめる | 未知のデータへの性能の見積もり |
未知のデータに対しても適切に予測できる性質を汎化といい、その性能を汎化性能といいます。
学習したデータを覚えることと、未知のデータへ対応できることは別です。この区別が、検証やテストを設ける理由です。[1]
いつもランダムに分ければよいわけではない
分割方法は、実際にどう使うかに合わせます。
- 将来の売上を予測するなら、時間の前後関係を考慮する
- 同じ人の記録が何件もあるなら、人の単位で分ける必要がないか考える
学習側と評価側に極めて似たデータが入ると、実際より簡単な条件で評価してしまうことがあります。データが少ない場合などには、分割を入れ替えて評価する交差検証も使われます。ここでは、まず3つの役割の違いを押さえれば十分です。
4. 前処理で、モデルに渡せる形へ整える
データには、値の欠損、単位のばらつき、文字のカテゴリなどが含まれます。これらをモデルが扱える形に整える処理を前処理と呼びます。
例えば、数値の大きさをそろえる標準化では、平均や標準偏差を使います。このようなデータから求める値は、訓練データで計算し、その値を検証・テストデータにも適用します。[2]
訓練データ → 平均・標準偏差を計算 → その値で変換
検証データ → 訓練データで求めた値を使って変換
テストデータ → 訓練データで求めた値を使って変換
評価用データまで含めて平均を計算するなど、本来は利用できない情報がモデル作りに入ることをデータリークといいます。テスト時だけ成績が良く見える原因になるため、分割と前処理はセットで考えます。
なお、すべてのモデル・データに同じ前処理が必要なわけではありません。最初の送料の表と後述の数値例は、学習の仕組みに集中するため、欠損や標準化を扱わないよう単純化しています。
5. 学習の中では「予測 → 損失 → 更新」を繰り返す
ここからは、一次式のパラメータを勾配降下法で調整する例を見ます。
損失関数:予測のずれを数値にする
まず、1件のデータ x = 2、y = 5 だけを使います。初期値を w = 1、b = 0 とすると、予測値は 2 です。
この例では、予測と正解の差を二乗した値を損失にします。
L = (\hat{y} - y)^2
その値を計算するルールが損失関数です。初期状態の損失は (2 - 5)² = 9 になります。
複数件の二乗誤差を平均したものが 平均二乗誤差(MSE) です。ここでは1件なので、二乗誤差とMSEの値は同じです。
勾配:どの方向へ変えると損失が増えるか
勾配は、各パラメータを少し変えたときに、損失がどちらへ、どの程度変化するかを表します。
今回の式を微分すると、次のようになります。今は導出を覚えるより、「パラメータごとに、損失の変わり方を求める」と読めれば十分です。
\frac{\partial L}{\partial w} = 2(\hat{y}-y)x,
\qquad
\frac{\partial L}{\partial b} = 2(\hat{y}-y)
x = 2、ŷ = 2、y = 5 を入れると、w の勾配は -12、b の勾配は -6 です。
勾配降下法:勾配と反対の方向へ少し動かす
勾配降下法では、損失を下げることを目指して、勾配と反対の方向にパラメータを更新します。
新しいパラメータ = 現在のパラメータ − 学習率 × 勾配
更新幅を調整する係数が学習率です。今回は 0.1 とします。
| 項目 | 更新前 | 1回の更新後 |
|---|---|---|
w |
1 | 1 − 0.1 × (−12) = 2.2 |
b |
0 | 0 − 0.1 × (−6) = 0.6 |
x = 2 の予測値 |
2 | 2.2 × 2 + 0.6 = 5 |
| この1件の損失 | 9 | 0 |
このように、予測のずれからパラメータを変えていきます。学習率が大きすぎると、損失が下がらず不安定になることもあります。[3]
この例で損失が0になったのは、選んだ1件と学習率での計算結果です。一般に1回で学習が終わるわけではありません。
実際、更新後のモデルで x = 1 を予測すると 2.8、x = 3 なら 7.2 です。表の正解 3、7 とはまだずれています。1件に合っただけでは、ほかのデータにも合うとは言えません。
ここで出てくる関連用語
| 用語 | 学習の流れの中での意味 |
|---|---|
| エポック | 訓練データ全体を1巡する単位 |
| ミニバッチ | 1回の更新に使う、訓練データの小さなまとまり |
| バッチサイズ | そのまとまりに含めるデータ件数 |
| ハイパーパラメータ | 学習率など、通常は開発者側が設定・選択する値 |
w や b は訓練で調整するパラメータです。一方、学習率などは候補を変えて検証しながら選びます。この2つを区別すると、「モデルが学ぶもの」と「開発者が調整する設定」が整理できます。
ニューラルネットワークでは、勾配を効率よく計算する方法として 誤差逆伝播法(バックプロパゲーション) が使われます。勾配を求める処理と、その勾配でパラメータを更新する処理は分けて考えます。
また、決定木など、勾配降下法とは異なる方法で学習するモデルもあります。「学習=必ずこの更新式」とは限りません。[6]
6. 検証して選び、テストで最終評価する
学習の結果を判断するときは、訓練データの損失だけを見ません。
例えば、訓練データでは誤差が小さくなっているのに、検証データでは改善しないことがあります。訓練データに適合しすぎて未知のデータでうまく予測できない状態は、過学習として知られています。
ただし、検証結果が悪い原因が必ず過学習とは限りません。データの分布の違い、前処理の不一致、実装の誤りなども確認対象です。
開発中は検証データで候補を比較し、モデルの複雑さや学習率などを選びます。必要に応じて、モデルの複雑さなどに制約を加える正則化を検討します。
そして、選んだモデルをテストデータで評価します。テストデータを見ながら設定を選び続けると、テストにも間接的に合わせ込んでしまいます。[1]
損失関数と評価指標は同じでなくてもよい
損失関数は、学習で何を小さくするかを定めます。評価指標は、目的に対してどの程度役立つかを見るために使います。
例えば、送料のモデルをMSEで学習しつつ、「平均でいくらずれるか」をMAEで確認することもできます。同じ指標を両方に使う場合もありますが、役割は区別しておくと理解しやすくなります。
7. 学習と推論を分けて考える
モデルの準備ができたら、新しい入力に対して予測を行います。この処理を推論と呼びます。[4]
| 段階 | 入力するもの | 行うこと |
|---|---|---|
| 学習 | 訓練データの入力と正解 | パラメータを調整する |
| 推論 | 新しい入力 | 学習済みのパラメータを使って予測する |
この教師あり学習の例では、推論時に正解は必要ありません。通常の推論では、予測のたびにパラメータを学習し直すわけでもありません。
学習時に標準化などの前処理をした場合は、推論でも同じ変換を使います。モデルのパラメータだけでなく、前処理で求めた値も一緒に管理する必要があります。
また、公開後に入力データの傾向が変われば、性能が下がることもあります。運用では予測結果を確認し、必要に応じて再学習や評価の見直しを行います。
8. 用語を、学習の流れに戻してみる
| 工程 | 結び付く用語 | 自分に問いかけること |
|---|---|---|
| 目的を決める | 回帰・分類・評価指標 | 何を予測し、どう良し悪しを判断する? |
| データを用意する | 特徴量・目的変数 | 何を入力し、何を正解にする? |
| 分割・前処理する | 訓練・検証・テスト・データリーク | 未知のデータでの評価になっている? |
| 学習する | パラメータ・損失関数・勾配降下法 | 何を小さくするために、何を変える? |
| 比較・改善する | ハイパーパラメータ・汎化・過学習 | 学習に使わなかったデータでも役立つ? |
| 利用する | 推論 | 学習時と同じ条件で予測できる? |
まずは、「データを用意する → 学習する → 評価する → 新しい入力で予測する」 という流れを説明できれば、ひとつの土台になります。
そのうえで、「なぜデータを分けるのか」「損失は何を計算しているのか」「勾配でどう更新するのか」を個別に深掘りすると、用語が工程と結び付きます。
ほかの学習方法との位置関係
今回は教師あり学習を扱いました。正解ラベルなしでデータの構造などを学ぶ教師なし学習や、環境とのやり取りで得る報酬をもとに行動を学ぶ強化学習もあります。
また、生成AIは文章・画像などを生成するモデルやシステムを指す言葉で、教師あり・教師なし・強化学習と同じ軸の分類ではありません。例えば、文章の一部から続きを予測する学習では、データ自身から学習用の正解を作る自己教師あり学習が使われます。[7]
これらを一度に覚えるより、まずは今回の流れを基準にして、「何を入力し、何を手掛かりに学び、どう確かめるのか」を比較していくと整理しやすくなります。
補足:1回の更新をPythonで確かめる
第5節の計算を、そのままコードにしたものです。Python 3.12.14で実行確認しています。外部ライブラリは不要です。
x, y = 2.0, 5.0
w, b = 1.0, 0.0
learning_rate = 0.1
# 現在のパラメータで予測する
prediction = w * x + b
error = prediction - y
loss_before = error ** 2
# 更新前の同じパラメータから、両方の勾配を計算する
grad_w = 2 * error * x
grad_b = 2 * error
# 勾配と反対の方向へ更新する
w -= learning_rate * grad_w
b -= learning_rate * grad_b
prediction_after = w * x + b
loss_after = (prediction_after - y) ** 2
print(f"w={w:.1f}, b={b:.1f}")
print(f"prediction: {prediction:.1f} -> {prediction_after:.1f}")
print(f"loss: {loss_before:.1f} -> {loss_after:.1f}")
出力:
w=2.2, b=0.6
prediction: 2.0 -> 5.0
loss: 9.0 -> 0.0
このコードは更新の仕組みだけを取り出した例で、データ分割や検証・テストを含む学習パイプラインではありません。モデル全体の性能を評価した結果でもありません。
参考資料
- scikit-learn:Cross-validation — evaluating estimator performance
- scikit-learn:Common pitfalls and recommended practices
- PyTorch:Optimizing Model Parameters
- scikit-learn:Getting Started
- scikit-learn:mean_absolute_error
- scikit-learn:Decision Trees
- Meta AI:Self-supervised learning — The dark matter of intelligence
図を動かして確かめたい方へ
重み・学習率・正則化を変えながら、予測の線と訓練・検証の誤差を比べられるブラウザ教材を作りました。学習したモデルに任意の重さを入力して、送料を予測する実験もできます。