Normalization
正規化によってモデルのトレーニングと精度が向上する仕組みを解説します。Ultralytics YOLO26のプロジェクトにおける役割と、Min-Maxスケーリング、Zスコア標準化について紹介します。
正規化は、数値属性を標準的な範囲に再スケーリングするデータの前処理における基本的な手法です。機械学習(ML)では、年齢の範囲(0~100)と所得水準(0~100,000)のように、データセットにスケールの異なる特徴量が含まれることがよくあります。こうした差を処理しないと、最適化アルゴリズムが大きな値に偏り、収束が遅くなったり、性能が最適でなくなったりする可能性があります。データを正規化することで、各特徴量が最終結果に比例して寄与し、ニューラルネットワークがより効率的に学習できるようになります。
一般的な正規化手法#
データを変換する標準的な手法はいくつかあり、それぞれ異なる分布やアルゴリズムの要件に適しています。
- 最小最大スケーリング: これは最も直感的な正規化手法です。データを通常 [0, 1] のような固定範囲に再スケーリングします。最小値を引き、範囲(最大値から最小値を引いた値)で割ることで変換します。ピクセル強度が0~255の範囲に収まる画像処理で広く使用されています。
- Zスコア標準化: 正規化と同じ意味で使われることもありますが、標準化ではデータの平均を0、標準偏差を1に変換します。データがガウス分布に従う場合に特に有効で、正規分布のデータを前提とするサポートベクターマシン(SVM)などのアルゴリズムに不可欠です。
- 対数スケーリング: 極端な外れ値を含むデータや、べき乗則に従うデータでは、対数変換によって値の範囲を圧縮できます。これにより、推論エンジンが極端に大きな値の急増に左右されず、分布をより適切に解釈できるようになります。
実際のアプリケーション#
正規化は、さまざまな業界における高性能AIシステムのパイプラインで標準的に行われる処理です。
-
コンピュータービジョン(CV): 物体検出や画像分類などのタスクでは、デジタル画像は0~255のピクセル値で構成されています。こうした大きな整数をそのままネットワークに入力すると、勾配降下法が遅くなる可能性があります。一般的な前処理では、ピクセル値を255.0で割り、[0, 1]の範囲に正規化します。この処理により入力の一貫性が確保され、YOLO26のような高度なモデルの学習が安定し、Ultralytics Platformでの学習品質が向上します。
-
医用画像解析: 医療分野のAIで使われる医療画像などは、強度スケールが異なるさまざまな装置で撮影されることがよくあります。正規化によって、MRIやCTのピクセル強度を異なる患者や装置間で比較可能にします。この一貫性は正確な腫瘍検出に不可欠であり、モデルが明るさの違いではなく構造上の異常に注目できるようになります。
関連概念との違い#
深層学習で使われる正規化と、類似する前処理やアーキテクチャの用語を区別することが重要です。
- バッチ正規化との違い: データ正規化は、未加工の入力データセットがネットワークに入る前に適用する前処理です。一方、バッチ正規化はモデルの学習中に、ネットワーク内の各レイヤー間で内部的に実行されます。直前の活性化レイヤーの出力を正規化し、学習プロセスを安定させます。
- 画像拡張との違い: 正規化はピクセル値のスケールを変えるのに対し、画像拡張は画像の内容や幾何学的な特徴(反転、回転、色の変更など)を変えてデータセットの多様性を高めます。拡張にはAlbumentationsなどのツールを使用しますが、正規化は数学的なスケーリング処理です。
実装例#
コンピュータービジョンでは、正規化は多くの場合パイプラインの最初のステップです。次のPythonの例では、学習中にUltralytics YOLO26のデータローダー内で自動的に実行される処理を、NumPyライブラリを使って画像データを手動で正規化する方法とともに示します。
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()}")









