以下の内容はhttps://pydocument.hatenablog.com/entry/2023/10/11/235301より取得しました。


レイヤー正規化 (Layer Normalization) を具体例で理解する: AIの最適化手法

この記事では、AI・深層学習の学習を効率化する「レイヤー正規化」について、基本的な仕組み、バッチ正規化との違い、そしてどのような場合に有効かを、具体例を交えながら解説します。レイヤー正規化を理解することで、深層学習モデルがどのように学習しているのか、その一端を知ることができます。

レイヤー正規化とは(現実世界に例えると)

レイヤー正規化 (Layer Normalization)とは 深層学習モデルの各層において、個々の入力サンプルごとに正規化を行う手法です。言葉ではピンとこないと思いますので、現実の世界(工場の生産ライン)で例えます。

複数の工程からなる工場の生産ライン(AIモデル)が製品(タスク)を製造する場面を想像してください。

  • 工程へのインプット(入力データ): 各工程には、前の工程から様々な材料や部品が供給されます。これらの品質(データのばらつき)が一定でないと、最終製品の品質が安定しません。
  • 工程(層): 各工程は、それぞれ異なる作業(特徴の抽出)を行います。
  • 品質検査(正規化): 各工程の出口で、品質検査を行い、材料や部品の特性(平均や分散)を一定の基準に調整します。これにより、次の工程での作業がスムーズに進み、最終製品の品質が向上します。

レイヤー正規化は、各工程の「品質検査と調整」に相当します。各層への入力を、平均が0、分散が1になるように調整(正規化)することで、AIモデルの学習が安定し、高速化します。

バッチ正規化との違い

「調整」の方法には、「バッチ正規化」というもう一つの主要な手法があります。深層学習では、データを「ミニバッチ」と呼ばれる小さなグループに分けて学習を進めます。これにより計算効率と学習の安定性が向上します。バッチ正規化はこのミニバッチの単位でデータの平均や分散を計算し、正規化を行います。

バッチ正規化とレイヤー正規化の違いも現実世界に落とし込むと、下記のように考えることができます。

  • レイヤー正規化: 各製品の各工程ごとに品質検査・調整を行う (各サンプル内で正規化)。
  • バッチ正規化:定量の製品をまとめて品質検査・調整を行う (ミニバッチ内で正規化)。

どちらの方法が良いかは、製品の種類(AIモデルのタイプ)や、生産量(バッチサイズ)によって異なります。

特徴 レイヤー正規化 バッチ正規化
正規化の単位 各サンプル、各層 ミニバッチ、各層
バッチサイズへの依存性 低い 高い (小さいバッチサイズでは性能が低下する可能性がある)
計算量 バッチ正規化より少ない レイヤー正規化より多い
適用可能なモデル RNN, Transformer など CNN など。ただし、Transformer でもバッチ正規化は使われることがある (例: BERT)
その他 学習が安定しやすい、高速に学習できる 学習が安定しやすい、高速に学習できる、過学習を抑えやすい

レイヤー正規化が特に有効なケース

  • 文章の生成 (RNN): 文章の長さは毎回異なるため、バッチ正規化は使いにくいですが、レイヤー正規化なら問題ありません。
  • 機械翻訳 (Transformer): 非常に複雑なモデルですが、レイヤー正規化によって学習が安定します。

レイヤー正規化の仕組み:数式を使わない説明

レイヤー正規化は、以下の3つのステップで構成されます。

  1. 平均と分散を計算: 各層への入力データについて、「平均的な値」と「値のばらつき具合」を計算します。
  2. 正規化: 各データを「平均的な値」から引き、「ばらつき具合」で割ります。これにより、データのスケールが揃います。
  3. スケーリングとシフト: 正規化されたデータに、微調整を加えます。これは、正規化によって失われた個性を少しだけ取り戻すための操作です。(学習可能なパラメータを使用)

レイヤー正規化の仕組み (数式あり)

ここまでの説明を踏まえ、レイヤー正規化の計算手順を、数式と具体例(工場の生産ライン)を対応させながら詳しく見ていきます。

前提

  • 状況: ある工程(層)に、3つの部品(特徴量)が流れてくる
  • 入力: 各部品の品質は、x = (x_1, x_2, x_3) = (2, 4, 6)
  • 記号:
    • x: 各工程への元の入力(例:各部品の品質)
    • μ: 入力の平均値(例:品質の平均)
    • σ^2: 入力の分散(例:品質のばらつき具合)
    • ε: 計算を安定させるための小さな値 (例: 0.01)
    • x': 正規化された入力
    • γ: 各特徴量にかける重み(スケーリング)
    • β: 各特徴量に加えるバイアス(シフト)
    • y: レイヤー正規化の最終的な出力

ステップ1. 平均 (μ) と分散 (σ2) の計算

数式

μ = (1/H) * Σ(x_i)
σ^2 = (1/H) * Σ(x_i - μ)^2

ここで、H は特徴量の次元数(この例では3)、Σ は i=1 から H までの総和を表します。

具体例

μ = (1/3) * (2 + 4 + 6) = 4
σ2 = (1/3) * [(2-4)2 + (4-4)2 + (6-4)2] = (1/3) * (4 + 0 + 4) = 8/3 ≈ 2.67

部品の品質の平均値(μ)は4、ばらつき具合(σ2)は約2.67と計算されました。

ステップ2. 正規化 (Normalization)

x_i^' = (x_i - μ) / √(σ^2 + ε)

各入力x_iを、平均を引き、標準偏差(分散の平方根)で割ることで正規化します。ε はゼロ除算を防ぐための小さな値です。

具体例 (ε = 0.01)

x_1^' = (2 - 4) / √(2.67 + 0.01) ≈ -1.22
x_2^' = (4 - 4) / √(2.67 + 0.01) ≈ 0
x_3^' = (6 - 4) / √(2.67 + 0.01) ≈ 1.22

各部品の品質が、平均0、標準偏差1(分散1)のデータに変換されました。 これで、品質のスケールが揃います。

ステップ3. スケーリング (γ) とシフト (β)

y_i = γ * x_i^' + β

正規化で各特徴量のスケールを揃えましたがモデルによってはスケールや平均値に意味がある可能性があります。 正規化された値x_i^'に対して、学習可能なパラメータ γ (スケール) と β (シフト) を用いて、最終的な出力 y_i を計算します。

具体例 (γ = (1.5, 1.0, 0.5), β = (0.1, 0.2, 0.3))

y_1 = 1.5 * (-1.22) + 0.1 = -1.73
y_2 = 1.0 * 0 + 0.2 = 0.2
y_3 = 0.5 * 1.22 + 0.3 = 0.91

各部品に異なるスケーリングとシフトが適用され、最終的な出力 y = (-1.73, 0.2, 0.91) が得られました。この工程での重要度や特性に合わせて、品質を調整しています。

この計算を各層で行うことで、深層学習モデル全体の学習が効率的に進むようになります。

まとめ

レイヤー正規化は、AIモデルの学習を効率化する、生成AIの技術にも利用されている不可欠な技術です。バッチ正規化と適切に使い分けることで、より高性能なAIモデルを開発することができます。主要な深層学習フレームワーク(TensorFlow, PyTorchなど)で簡単に利用できます。

pydocument.hatenablog.com




以上の内容はhttps://pydocument.hatenablog.com/entry/2023/10/11/235301より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14