Training Data
学習データとは、モデルが重みを学習するために使うサンプルの集合です。検証データやテストデータとの違いと、ラベルの品質がデータ量に匹敵する重要性を持つ理由について解説します。
学習データとは、機械学習モデルが学習するための例の集合です。学習中、オプティマイザーがモデルの重みを繰り返し調整し、これらの例に対する誤差を減らします。そのため、モデルが学べる内容はこれらの例によって決まります。教師あり学習では、各例が入力と正解を組み合わせます。たとえば、道路の写真に写る各車や歩行者について、バウンディングボックスとクラス名を付けます。自己教師あり学習や教師なし学習では、ラベルのない生の入力を使って学習します。「訓練セット」も同義語です。多くのプロジェクトでは、利用可能なデータの最大の分割であり、全体の70~80%を占めることがよくあります。
モデルが学習データを使う仕組み#
モデルは学習データをバッチ単位で処理します。各バッチについて予測を行い、損失関数が予測とラベルの差を測定し、バックプロパゲーションが各重みの誤差への寄与を計算します。オプティマイザーは誤差が小さくなるよう重みを調整します。学習セットを一巡する処理をエポックと呼び、通常は数十から数百エポックにわたって学習します。
モデルはこれらの例を使って最適化されるため、その例に対するスコアは新しいデータでの性能を過大評価します。これを補正するために、学習に使わないデータを2つに分割します。検証データは開発中に評価し、ハイパーパラメーターやチェックポイントの選択に使います。テストデータは最後に1度だけ評価し、実世界での性能を推定します。学習スコアと検証スコアに大きな差がある場合は、モデルが汎化するパターンを学ばず、学習例を記憶する過学習の兆候です。両方のスコアが低い場合は未学習を示します。分割間で画像を共有してはいけません。同じ動画のほぼ重複するフレームや、同じ患者のスキャンが分割の両方に含まれると、データ漏洩が発生し、すべての評価スコアが水増しされます。
量、品質、網羅性#
学習セットの次の3つの特性が、モデルの汎化性能を左右します。
- 量: 例の数が多いほど役立ちますが、効果は次第に小さくなります。転移学習で事前学習済みモデルを使うと、新しいタスクに必要なラベル付きの例を減らせます。
- 品質: 誤り、欠落、一貫性のないラベルは、いずれもモデルに誤った情報を教えます。一貫したデータラベリングのガイドラインは、ラベルの数と同じくらい重要です。
- 網羅性:サンプルは、照明、天候、カメラアングル、背景、希少クラスなど、モデルが直面する条件を網羅する必要があります。昼間の画像だけでトレーニングした検出器は夜間に性能が落ちます。また、顔データセットに特定の肌の色がないなど、欠落が人口統計上の属性に沿う場合は、データセットバイアスにつながります。
以下のscikit-learnスクリプトは、同梱の手書き数字データセットを異なる学習セットで使って同じ分類器を学習し、固定した1つのテスト分割で各モデルを評価します。
import numpy as np
from sklearn.datasets import load_digits
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# 1,797 labeled 8x8 digit images; hold out 30% to score every model
X, y = load_digits(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, stratify=y)
# Reassign 30% of the training labels at random to simulate careless labeling
rng = np.random.default_rng(0)
y_noisy = y_train.copy()
flip = rng.random(len(y_train)) < 0.3
y_noisy[flip] = rng.integers(0, 10, flip.sum())
# Train the same model on three different training sets
for name, n, labels in [("50 clean", 50, y_train), ("1,257 clean", 1257, y_train), ("1,257 noisy", 1257, y_noisy)]:
model = LogisticRegression(max_iter=5000).fit(X_train[:n], labels[:n])
print(f"{name}: test accuracy {model.score(X_test, y_test):.3f}")クリーンな学習セットを50枚から1,257枚に増やすと、テスト精度は0.863から0.961に上がります。1,257個のラベルのうち315個(25%)が誤りになったノイズの多い実行では、スコアは0.861となり、クリーンな画像50枚で学習したモデルを上回りません。
学習セットの構築#
チームは公開データセット、自社のカメラやログ、そして利用が増えている合成データから学習データを集めます。公開ベンチマークは有用な出発点です。COCOデータセットには、物体検出、セグメンテーション、キャプション付けのラベルが付いた学習画像が118,287枚含まれています。次に、生データをデータクリーニングし、重複、破損ファイル、対象外の画像を取り除き、ラベリングとレビューを行います。データ拡張では、反転、クロップ、色調変更、モザイクなどを使って学習時の多様性を増やします。ただし、収集したデータを組み合わせ直すことしかできないため、欠けている条件の画像は撮影する必要があります。
Ultralytics YOLOは、データセットYAMLファイルの train パスから学習データを読み込み、各画像を .txt ラベルファイルと対応付けます。このファイルには物体ごとに1行があり、クラスインデックスに続けて、画像サイズで正規化されたボックスの中心、幅、高さが記録されています。すべての分割に同じYOLOデータセット形式を使うため、分割の再調整では画像とラベルファイルを一緒にフォルダー間で移動します。
from ultralytics import YOLO
# 事前学習済みYOLO26 nanoモデルを読み込みます
model = YOLO("yolo26n.pt")
# coco8.yamlには、学習画像 (train: images/train) と検証画像 (val: images/val) が記載されています
results = model.train(data="coco8.yaml", epochs=5)YOLO26モデルは、COCO8の学習画像4枚でファインチューニングを行います。COCO8は、学習パイプラインが最初から最後まで正常に動作するかを確認するための小規模なサンプルです。
学習データと関連用語#
- 検証データ: 学習をいつ止めるかなど、開発中の判断に使う、学習に使わないデータの分割です。モデルは検証データを使って重みを更新しません。
- テストデータ: 学習に使わないデータの分割で、最後に1度だけ評価します。その結果は、新しいデータに対する性能の偏りのない推定値になります。
- 正解データ: 例に付けられた正しい答えです。教師あり学習の学習データには正解データが含まれますが、スコアを計算するにはすべての分割に正解データが必要です。
- ゴールデンデータセット: 評価やアノテーターの品質チェックで信頼できる参照データとして使用する、専門家が確認した小規模なデータセットです。
- ベンチマークデータセット: モデルを比較するために、固定された分割で公開されているデータセットです。トレーニング用の分割は事前学習データとしても使われることが多く、ホールドアウトされた分割はスコアボードとなります。たとえば、多くの物体検出論文がmAPを報告する際に使用する、COCO val2017の5,000枚の画像の分割がこれにあたります。










