このブログでは、初心者の方でも理解できるように、これら2つの「標準化」について、それぞれの意味と役割を解説していきます。
1. データの前処理としての「標準化」
ディープラーニングモデルを学習させる前には、入力するデータ(特徴量)を整える「前処理」という工程が欠かせません。その代表的な手法が「標準化(Standardization)」です。
なぜデータの前処理が必要なのか?
例えば、「年齢」と「年収」という2つの特徴量を使って何かを予測するモデルを考えてみましょう。「年齢」は通常20〜80程度の範囲ですが、「年収」は数百万円から数千万円という大きな範囲の値を取ります。このように特徴量ごとのスケール(単位や範囲)が大きく異なると、モデルは値が大きい「年収」の方をより重要な特徴だと誤って解釈してしまい、学習がうまく進まないことがあります。
このような問題を防ぎ、各特徴量が平等に扱われるようにするために、スケールを揃える前処理が必要になります。特にディープラーニングでは、勾配を用いて学習を行うため、特徴量のスケールが異なると学習が不安定になったり、収束が遅くなったりする原因となります。
標準化(Standardization)とは
標準化は、データセット全体の各特徴量が平均0、標準偏差1になるように変換する手法です。 これにより、元のデータの分布の形を保ちつつ、スケールを揃えることができます。
標準化は以下の式で計算されます。
(個々のデータ – 平均) / 標準偏差
正規化(Normalization)との違い
標準化とよく似た言葉に「正規化(Normalization)」があります。これらは混同されやすいですが、異なる処理です。正規化は、データの値を0から1(または-1から1)の範囲に収まるように変換する手法です。
一般的に、外れ値(他の値から極端に離れた値)があるデータセットの場合、正規化を行うと多くのデータが狭い範囲に押し込められてしまうため、外れ値の影響を受けにくい標準化の方がよく使われる傾向にあります。
項目 | 標準化 (Standardization) | 正規化 (Normalization) |
---|---|---|
目的 | データの平均を0、標準偏差を1に揃える。 | データの範囲を0〜1などに揃える。 |
変換後の範囲 | 特に定まった範囲はない(多くは-3〜3の間に収まる)。 | 0〜1、または-1〜1。 |
外れ値への耐性 | 比較的影響を受けにくい。 | 影響を受けやすい。 |
主な用途 | SVM、ロジスティック回帰、ニューラルネットワークなど。 | 画像処理(ピクセル値を0-1に変換)、一部のニューラルネットワーク。 |
Pythonのライブラリscikit-learn
を使うと、簡単に標準化を実装できます。
import numpy as np
from sklearn.preprocessing import StandardScaler
# サンプルデータ(身長、体重、年齢など)
data = np.array([, , ])
# 標準化のインスタンスを作成
scaler = StandardScaler()
# 標準化を実行
standardized_data = scaler.fit_transform(data)
print("--- 元のデータ ---")
print(data)
print("\n--- 標準化後のデータ ---")
print(standardized_data)
print(f"\n平均: {standardized_data.mean(axis=0)}")
print(f"標準偏差: {standardized_data.std(axis=0)}")
2. モデルの層における「標準化(正規化層)」
もう一つの「標準化」は、ディープラーニングモデルの内部、つまり層(レイヤー)の間で行われる処理です。こちらは一般的に「正規化層」と呼ばれ、代表的な手法にバッチ正規化 (Batch Normalization) などがあります。
なぜ層の標準化が必要なのか?
ディープラーニングは、多くの層を積み重ねたネットワークです。学習が進むにつれて、各層のパラメータ(重み)が更新されていきます。すると、ある層の出力データの分布が、学習の過程でどんどん変化してしまう現象が起こります。これを「内部共変量シフト (Internal Covariate Shift)」と呼びます。
各層は、前の層からの出力を入力として受け取ります。その入力データの分布が学習のたびに大きく変わってしまうと、層は毎回新しい分布に適応し直さなければならず、学習が不安定になったり、非常に遅くなったりします。 この問題を解決するために、層ごとに入力データを標準化(正規化)する「正規化層」が考案されました。
代表的な正規化層の手法
正規化層にはいくつか種類がありますが、ここでは特に有名な2つの手法を紹介します。
バッチ正規化 (Batch Normalization)
2015年にGoogleから発表された手法で、多くのモデルで採用されています。 名前の通り、データをいくつかまとめた「ミニバッチ」単位で、その平均と分散を計算し標準化を行います。
- 利点: 学習を高速化・安定化させる効果が非常に高いです。正則化(過学習を抑制する)の効果もあり、ドロップアウトなどの他の正則化手法が不要になる場合もあります。
- 注意点: ミニバッチの統計量を使うため、バッチサイズが小さいと平均・分散が不安定になり、性能が低下することがあります。
層正規化 (Layer Normalization)
バッチ正規化の課題点を解決するために考案された手法です。バッチ全体ではなく、1つ1つのデータサンプル内で正規化を行います。
- 利点: バッチサイズに依存しないため、小さなバッチサイズでも安定して動作します。 再帰型ニューラルネットワーク(RNN)やTransformerなど、系列データを扱うモデルで特に有効です。
- 注意点: 画像認識タスクなどでは、バッチ正規化の方が高い性能を示す場合もあります。
手法 | 正規化の単位 | 長所 | 主な用途 |
---|---|---|---|
バッチ正規化 | ミニバッチごと | 学習の高速化・安定化、正則化効果が高い。 | 画像認識 (CNN) など。 |
層正規化 | データサンプルごと | バッチサイズに依存しない、系列データに強い。 | 自然言語処理 (RNN, Transformer) など。 |
※その他にも、インスタンス正規化(Instance Normalization)やグループ正規化(Group Normalization)といった手法も存在します。
まとめ
このブログでは、ディープラーニングにおける2種類の「標準化」について解説しました。
- データの前処理としての標準化: モデルに入力するデータのスケールを揃え、学習の土台を整える。
- モデルの層における標準化(正規化層): モデル内部のデータの分布を安定させ、学習を高速かつ効率的に進める。
どちらの標準化も、ディープラーニングモデルの性能を最大限に引き出すためには欠かせない重要な技術です。これらの違いを理解することで、モデルの構築やトラブルシューティングに役立てることができるでしょう。