AI・機械学習
上級

SwiGLU活性化関数(スウィグル カッセイカカンスウ)

SwiGLU は Swish 関数と GLU(Gated Linear Unit)を組み合わせた活性化関数であり、2020年に Noam Shazeer が提案し、LLaMA・Mistral・Qwen・DeepSeek 等の 2024-2026年主要 LLM で事実上のデファクトスタンダードとして採用されている。

0 回閲覧
0 いいね

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 の事実上の標準となった。

SwiGLU の FFN 構造

従来の Transformer FFN と SwiGLU FFN の構造比較:

構造従来 FFNSwiGLU FFN
第1層W₁: d→4dW: d→(8/3)d, V: d→(8/3)d
活性化ReLU/GELUSwish(xW) ⊙ (xV)
第2層W₂: 4d→dW₂: (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 に費やされる。

主要モデルの SwiGLU 実装パラメータ

モデルd_modelFFN 隠れ層隠れ層/d_model 比層数
LLaMA 3 8B4,09614,3363.50x32
LLaMA 3 70B8,19228,6723.50x80
LLaMA 3.1 405B16,38453,2483.25x126
Mistral 7B4,09614,3363.50x32
Mistral Large 212,28840,9603.33x88
Qwen 2.5 72B8,19229,5683.61x80
DeepSeek-V37,16818,4322.57x(MoE)61

PyTorch 実装

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%優秀

よくある質問(FAQ)

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 が主流。

まとめ

  • SwiGLU は Swish ゲーティングで FFN の表現力を向上させる活性化関数
  • 2023年の LLaMA 以降、デコーダ型 LLM のデファクトスタンダード
  • 同一計算予算で ReLU/GELU を一貫して上回る
  • FFN パラメータが増加するため隠れ層を 8d/3 に調整するのが慣例
  • 量子化(GPTQ/AWQ/GGUF)との相性も良好