# 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]]