正規化
正規化がモデルの学習と精度を向上させる仕組みを探る。最小値・最大値スケーリング、Zスコア標準化、Ultralytics におけるその役割について学ぶ。
正規化はデータ前処理における基本技術であり、数値属性を標準範囲に再スケーリングする手法である。機械学習(ML)の文脈では、データセットにはしばしば異なる尺度を持つ特徴量が含まれる——例えば年齢範囲(0~100)と所得水準(0~100,000)などである。 こうした不均衡を放置すると、
最適化アルゴリズムが大きな値に偏り、
収束が遅くなり、性能が低下する可能性があります。
データを正規化することで、エンジニアは
各特徴量が最終結果に比例して寄与することを保証し、
ニューラルネットワークがより効率的に学習できるようにします。
一般的な正規化テクニック
データを変換する標準的な方法はいくつかあり、それぞれが異なる分布やアルゴリズムの要件に適しています。
-
最小値-最大値スケーリング:
これは最も直感的な正規化手法である。データを固定範囲(通常[0, 1])に再スケーリングする。
この変換は、最小値を引いた値を範囲(最大値から最小値を引いた値)で除算することで実行される。
画像処理において広く用いられており、
ピクセル輝度が0から255の間に制限されていることが知られている。
-
Zスコア標準化:
標準化は正規化と混同されがちだが、
特にデータの平均を0、標準偏差を1に変換する手法である。
これはデータがガウス分布に従う場合に特に有用であり、
サポートベクターマシン(SVM)など
正規分布を前提とするアルゴリズムには不可欠である。
-
対数スケーリング:
極端な外れ値を含むデータやべき則に従うデータに対して対数変換を適用すると、
値の範囲を圧縮できます。これにより、分布がより扱いやすくなり、
推論エンジンが巨大な値の急上昇に歪められることなく
効果的に解釈できるようになります。
実際のアプリケーション
正規化は、様々な産業における高性能AIシステムのパイプラインにおける標準的なステップである。
-
コンピュータビジョン(CV): 物体検出や 画像分類などのタスクでは、デジタル画像は0から255までのピクセル値で構成される。これらの大きな整数を直接ネットワークに入力すると、勾配降下の速度が低下する可能性がある。 標準的な前処理ステップとして、
ピクセル値を255.0で除算し[0, 1]の範囲に正規化します。この手法により、
YOLO26などの高度なモデルへの入力が一貫性を保ち、
Ultralytics トレーニング安定性が向上します。
-
医療画像解析:医療用スキャン(医療分野におけるAIで使用されるものなど)は、
異なる装置で撮影され、輝度スケールが異なる場合が多い。
正規化処理により、MRIやCTスキャンのピクセル輝度が
異なる患者や装置間で比較可能となる。この一貫性は
腫瘍の正確な検出に不可欠であり、
モデルが輝度の変動ではなく構造的異常を認識できるようにする。
関連概念の区別
深層学習で見られる類似の前処理やアーキテクチャ用語と正規化を区別することが重要である。
-
バッチ正規化との比較:
データ正規化は、ネットワークに入る前の生の入力データセットに適用される前処理ステップである。
一方、バッチ正規化はモデル学習中にネットワーク全体で層間の内部処理として動作する。
学習プロセスを安定化させるため、前の活性化層の出力を正規化する。
-
画像拡張との比較:
正規化がピクセル値のスケールを変更するのに対し、拡張は画像の内容や形状(例:反転、回転、色変更)を変更してデータセットの多様性を高めます。拡張にはAlbumentationsなどのツールが使用され、
正規化は数学的なスケーリング操作です。
実施例
コンピュータビジョンでは、正規化はパイプラインの最初のステップとなることが多い。以下の
Python 例は、NumPy を用いて画像データを手動で正規化する方法を示しています。この処理は、Ultralytics データローダー内ではトレーニング時に自動的に行われます。
import numpy as np
# Simulate a 2x2 pixel image with values ranging from 0 to 255
raw_image = np.array([[0, 255], [127, 64]], dtype=np.float32)
# Apply Min-Max normalization to scale values to [0, 1]
# This standardizes the input for the neural network
normalized_image = raw_image / 255.0
print(f"Original Range: {raw_image.min()} - {raw_image.max()}")
print(f"Normalized Range: {normalized_image.min()} - {normalized_image.max()}")