レイヤー正規化がトランスフォーマーを安定化させる方法
メニューを表示するにはスワイプしてください
現代のディープラーニングモデルは、効率的かつ正確に学習するために正規化手法に依存しています。自然言語処理(NLP)では、入力シーケンスの長さや構造が異なるため、正規化は学習プロセスを安定させるうえで特に重要です。一般的な正規化手法にはバッチ正規化とレイヤー正規化があり、それぞれ異なる目的に適しており、異なるデータタイプに向いています。
バッチ正規化は、入力バッチ全体にわたる各特徴量の平均と分散を計算します。この手法は、バッチ内の各画像が通常同じサイズと構造を持つコンピュータビジョンタスクで効果的に機能します。しかし、特に可変長シーケンスを扱うNLPタスクでは、バッチ正規化はバッチ内のサンプル間に不要な依存関係を導入する可能性があり、異なるシーケンス長をうまく処理できない場合があります。
レイヤー正規化は、一方で、各データポイント(例えば文中の各トークン埋め込み)ごとに、バッチ内の他のデータポイントとは独立して入力特徴量を正規化します。これにより、NLPやシーケンスモデリングに非常に適しています。ニューロンへの合計入力を標準化することで、レイヤー正規化は各トークンの表現を、位置やバッチの構成に関係なく同じスケールに保ちます。これにより、Transformerは安定して学習でき、特に長文や複雑な文を扱う際にテキストをより効果的に表現できます。
123456789101112131415161718192021import numpy as np def layer_norm(x, epsilon=1e-5): """ Applies layer normalization to a 2D numpy array x. Each row is normalized independently. """ mean = np.mean(x, axis=1, keepdims=True) variance = np.var(x, axis=1, keepdims=True) normalized = (x - mean) / np.sqrt(variance + epsilon) # Optional: learnable scale and bias (gamma and beta) gamma = np.ones_like(mean) beta = np.zeros_like(mean) return gamma * normalized + beta # Example: normalize a batch of 3 token embeddings (rows) embeddings = np.array([[2.0, 4.0, 6.0], [1.0, 3.0, 5.0], [0.0, 0.0, 0.0]]) normalized_embeddings = layer_norm(embeddings) print(normalized_embeddings)
入力の各行を、物語の登場人物のようにそれぞれ独自の特徴を持つトークン埋め込みとしてイメージしてください。layer_norm 関数は、すべてのトークンの値をゼロ付近に中心化し、同じスケールに調整することで、公平な状態に整えます。各行ごとに平均と分散を計算し、値を変換することで、どのトークンも極端に目立ったり埋もれたりしないようにします。この独立した正規化により、シーケンスの長さやバッチの構成に関係なく、すべてのトークンの特徴がバランスよく保たれ、モデルが解釈しやすくなります。この手法は、現実のNLPデータで見られる予測不可能な長さや構造に対しても、モデルの学習を安定かつ効率的に保ちます。
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください