# QK-Norm ## 定義 QK-Norm は Multi-Head Attention(または GQA)内部でクエリ(Q)とキー(K)に対して RoPE 適用**前**に RMSNorm を適用するテクニック。訓練の安定性向上が主目的。 初出: 2023 年の「Scaling Vision Transformers to 22 Billion Parameters」論文。 ```python # QK-Norm を適用する GQA の前向き計算例(疑似コード) queries = self.W_query(x) keys = self.W_key(x) values = self.W_value(x) # QK-Norm (RoPE より前) if self.q_norm: queries = self.q_norm(queries) # RMSNorm if self.k_norm: keys = self.k_norm(keys) # RMSNorm # RoPE queries = apply_rope(queries, cos, sin) keys = apply_rope(keys, cos, sin) ``` ## 採用モデル | モデル | QK-Norm の実装 | 備考 | |--------|----------------|------| | OLMo 2 | 標準 QK-Norm | Post-Norm と組み合わせで訓練安定化 | | Gemma 2/3/4 | 標準 QK-Norm | Pre+Post-Norm とも組み合わせ | | Qwen3 | 標準 QK-Norm | Dense/MoE 両方 | | Arcee AI Trinity Large | 標準 QK-Norm | NoPE とも組み合わせ | | MiniMax-M2 | Per-layer QK-Norm | 各ヘッドごとに独立スケールパラメータ | ## MiniMax-M2 の「Per-layer QK-Norm」 通常の QK-Norm は RMSNorm スケールパラメータがヘッド間で共有されるが、MiniMax-M2 では各ヘッドが独自のスケールパラメータを持つ。具体的には: ```python # 通常 QK-Norm: head_dim 次元のスケールベクトル(全ヘッド共有) self.q_norm = RMSNorm(head_dim) # Per-layer QK-Norm: num_heads * head_dim 次元のスケールベクトル self.q_norm = RMSNorm(num_heads * head_dim) # 各ヘッドに固有のスケール ``` ## 正規化配置の全体像 QK-Norm は様々な正規化配置パターンの一つ: | パターン | 代表モデル | 配置 | |----------|------------|------| | Pre-Norm | GPT-2、Llama 3 | アテンション/FFN の前 | | Post-Norm | OLMo 2 | アテンション/FFN の後(残差接続の内側) | | Pre+Post-Norm | Gemma 3/4 | 前後両方 | | QK-Norm | OLMo 2、Gemma 3、Qwen3 等 | アテンション内部 Q/K | | サンドイッチノーム | Arcee AI Trinity Large | 深さスケール付きで 4 層配置 | ## 横断的知見 - **QK-Norm はほぼコストゼロ**: RMSNorm 自体が軽量なため、QK-Norm の追加計算コストは全体の推論時間に対して無視できる。OLMo 2 の実験でも QK-Norm + Post-Norm の組み合わせで訓練安定性が改善。 - **正規化の多様化**: 2025 年の主要モデルでは Pre-Norm、Post-Norm、Pre+Post-Norm、QK-Norm が各々根拠を持って採用されており、「唯一の正解」は存在しない。モデル規模・訓練設定に依存する。 ## 関連 - 概念: [[Grouped-Query Attention]] / [[Transformer]] / [[Multi-Head Latent Attention]] - ソース: [[The Big LLM Architecture Comparison]]