SwiGLU は Swish 関数と GLU(Gated Linear Unit)を組み合わせた活性化関数であり、2020年に Noam Shazeer が提案し、LLaMA・Mistral・Qwen・DeepSeek 等の 2024-2026年主要 LLM で事実上のデファクトスタンダードとして採用されている。
SwiGLU(Swish-Gated Linear Unit)は、Noam Shazeer が 2020年の論文「GLU Variants Improve Transformer」で提案した活性化関数である。FFN(Feed-Forward Network)の中間層にゲート機構を導入し、入力を2つのパスに分割して一方を Swish 関数でゲーティングする。
SwiGLU の数学的定義は SwiGLU(x, W, V, b, c) = Swish(xW + b) ⊙ (xV + c) である。ここで Swish(x) = x · σ(x)(σ はシグモイド関数)、⊙ は要素ごとの積(Hadamard product)を表す。従来の FFN が f(x) = W₂ · σ(W₁x + b₁) + b₂ という単純な構造であるのに対し、SwiGLU は入力を2つの射影(W と V)に通し、一方をゲートとして使用する。この構造により、モデルが入力に応じて情報の流れを適応的に制御できる。
Meta の LLaMA(2023年, 7B/13B/33B/65B)で大規模に採用されて以降、LLaMA 2(2023年, 7B/13B/70B)、LLaMA 3(2024年, 8B/70B)、LLaMA 3.1(2024年, 8B/70B/405B)と全世代で継続使用される。Mistral 7B(2023年)、Mistral Large 2 123B(2024年)、Qwen 2.5 72B(2024年)、DeepSeek-V3 671B MoE(2025年)も SwiGLU を採用しており、2026年現在でデコーダ型 LLM の事実上の標準となった。
従来の Transformer FFN と SwiGLU FFN の構造比較:
| 構造 | 従来 FFN | SwiGLU FFN |
|---|---|---|
| 第1層 | W₁: d→4d | W: d→(8/3)d, V: d→(8/3)d |
| 活性化 | ReLU/GELU | Swish(xW) ⊙ (xV) |
| 第2層 | W₂: 4d→d | W₂: (8/3)d→d |
| パラメータ数 | 8d² | 約 8d²(同等) |
| 実効隠れ層 | 4d | (8/3)d ≈ 2.67d |
LLaMA 3 8B の場合: d=4096, 隠れ層=14336 で、SwiGLU の W と V がそれぞれ 4096×14336 の行列となる。パラメータ総数は 3×4096×14336 ≈ 176M/層であり、24層で約 4.2B パラメータが FFN に費やされる。
| モデル | d_model | FFN 隠れ層 | 隠れ層/d_model 比 | 層数 |
|---|---|---|---|---|
| LLaMA 3 8B | 4,096 | 14,336 | 3.50x | 32 |
| LLaMA 3 70B | 8,192 | 28,672 | 3.50x | 80 |
| LLaMA 3.1 405B | 16,384 | 53,248 | 3.25x | 126 |
| Mistral 7B | 4,096 | 14,336 | 3.50x | 32 |
| Mistral Large 2 | 12,288 | 40,960 | 3.33x | 88 |
| Qwen 2.5 72B | 8,192 | 29,568 | 3.61x | 80 |
import torch
import torch.nn as nn
import torch.nn.functional as F
class SwiGLU(nn.Module):
def __init__(self, dim, hidden_dim, bias=False):
super().__init__()
self.w1 = nn.Linear(dim, hidden_dim, bias=bias) # gate
self.w3 = nn.Linear(dim, hidden_dim, bias=bias) # up
self.w2 = nn.Linear(hidden_dim, dim, bias=bias) # down
def forward(self, x):
return self.w2(F.silu(self.w1(x)) * self.w3(x))
LLaMA の公式実装では bias=False(バイアスなし)が標準である。これにより各層のパラメータ数を約 3% 削減している。
Shazeer(2020年)の実験結果(同一計算予算での比較):
| 活性化関数 | C4 Perplexity(↓) | 相対改善率 |
|---|---|---|
| ReLU | 基準値 | - |
| GELU | -1.2% | 良好 |
| Swish | -1.5% | 良好 |
| GeGLU | -2.8% | 優秀 |
| SwiGLU | -3.1% | 最良 |
| ReGLU | -2.5% | 優秀 |
Q1: SwiGLU は GELU より常に優れているのか? A: デコーダ型 LLM(GPT系・LLaMA系)では SwiGLU が一貫して GELU を上回る。ただしエンコーダ型(BERT系)での優位性は限定的であり、BERT / RoBERTa の GELU を SwiGLU に置き換えても改善幅は小さい。
Q2: SwiGLU のデメリットは何か? A: FFN の射影行列が2つ(W と V)になるため、同じ隠れ層サイズでは通常の FFN よりパラメータ数が約 50% 増加する。これを補うため隠れ層を 8d/3 に縮小するのが慣例だが、メモリ帯域が律速となる推論時にはこの追加パラメータがレイテンシに影響する。
Q3: SwiGLU と GeGLU の違いは? A: ゲート関数が異なる。SwiGLU は Swish(x·σ(x))、GeGLU は GELU(x·Φ(x))をゲートに使用する。性能差は微小(perplexity で 0.1-0.3%)だが、SwiGLU がわずかに優位とされる。実装の容易さと既存エコシステムとの互換性から SwiGLU が主流。
| DeepSeek-V3 | 7,168 | 18,432 | 2.57x(MoE) | 61 |