純粋Attention層のrank collapse — attentionだけを重ねると表現が二重指数で壊れる

伝言ゲームを想像してください。ただし普通の伝言ゲームと違い、各人は「全員の意見の重み付き平均」を自分の新しい意見にします。これを何巡も繰り返すと何が起きるでしょうか。重みの付け方が多少偏っていても、全員の意見はどんどん似ていき、最後は全員同じになります。

self-attention は、まさにこの「重み付き平均」の機械です。attention 重みは各行の和が1の非負の重みで、出力は value ベクトルたちの加重平均——つまり attention は本質的に平均化作用素です。ならば、attention だけを何層も重ねたら、トークンの表現は互いに似ていき、最後は全部同じベクトルに潰れてしまうのでは?

この疑問に正面から答えたのが Dong, Cordonnier, Loukas による “Attention is not all you need: pure attention loses rank doubly exponentially with depth”(ICML 2021)です。タイトルが結論そのもので、純粋な attention の積み重ねは、深さに対して二重指数的(doubly exponential)という猛烈な速さで rank-1 行列(=全トークンが同一)に収束します。これを rank collapse と呼びます。そして、この崩壊を止めている立役者が、普段は脇役扱いの残差接続なのです。

この現象を知っていると、次のような場面で視界が開けます。

  • アーキテクチャの必然性が分かる: Transformerブロックの「Attention + 残差 + FFN + LayerNorm」という構成のうち、どれが飾りでどれが生命維持装置なのかを、定量的な根拠つきで語れる
  • 深いモデルの不調の診断: 深層のViTやBERTで観測される「トークン表現が層を経るほど似てくる」over-smoothing 現象の理論的な源流が分かる

本記事の内容

  • attention はなぜ「平均化作用素」なのか — 行確率行列と凸包の幾何
  • 主定理: 純粋attentionの残差は深さに対して二重指数で消える(1層ごとに残差がおよそ3乗)
  • numpy実測 — 12層中わずか5層で残差がマシンゼロ($10^{-16}$)に到達
  • 何が崩壊を止めるか — 残差接続・FFN・LayerNormの比較実験(答え: 残差接続が本質)
  • パス分解 — 「残差接続=長さ0のパス」というアンサンブル解釈

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

純粋Attentionを重ねると全トークンが平均へ収束する概念図

上の図が本記事で起きることの全体像です。浅い層では散らばっていたトークンのベクトル(青い点)が、attention を重ねるごとに互いに近づき、深い層ではほぼ1点——全トークンの平均(赤い星)——に集まってしまいます。まず、なぜこうなるのかを attention の構造から見ていきます。

Attentionは平均化作用素である

self-attention 1層の出力は、注意行列を $A$ として

$$ \mathrm{Attn}(X) = A\, X W_V W_O, \qquad A = \mathrm{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right) $$

と書けます。ここで決定的に重要なのは $A$ の性質です。softmax を行ごとに適用しているので、$A$ は各行が確率分布(非負で行和が1)の行列——行確率行列です。

$$ A_{ij} \geq 0, \qquad \sum_j A_{ij} = 1 $$

つまり出力の各行(各トークンの新しい表現)は、value ベクトルたちの凸結合です。凸結合の結果は必ず元のベクトルたちの凸包の内側に落ちます。「外側に飛び出す」ことができない、根っからの内向きの変換なのです。

行確率行列による変換は出力を凸包の内側に閉じ込める

左が注意行列 $A$(各行の和が1)、右がその作用です。出力(オレンジ)はすべて入力(青)の凸包の内側に落ちています。1層ごとに凸包は縮むか維持されるかしかない——この単調性が、崩壊の直感的な理由です。ただし「縮む」だけなら普通の指数収束です。Dong らが示したのは、それよりはるかに速い崩壊でした。

主定理: 残差は二重指数で消える

トークン表現 $X$ が「どれだけ rank-1 から遠いか」を測る量として、残差を定義します。

$$ \mathrm{res}(X) = X – \mathbf{1}\bar{x}^\top, \qquad \bar{x} = \text{全トークンの平均方向} $$

全トークンが同じベクトルになれば $\mathrm{res}(X) = 0$ です。Dong らの主定理は、skip も FFN もない純粋な Self-Attention Network(SAN)について、残差のノルムが

$$ \|\mathrm{res}(X_L)\| \;\lesssim\; c^{\,3^L}\,\|\mathrm{res}(X_0)\|^{3^L} $$

つまり深さ $L$ に対して $3^L$ 乗のオーダーで消えることを示しました。指数 $3^L$ 自体が指数関数なので「二重指数(doubly exponential)」です。証明の核は、(1) softmax の各成分に下界があるため $A$ が「混合」として働くこと、(2) 多ヘッド・値変換を経由しても、1層通過するごとに残差ノルムがおよそ3乗されること、の2段構えです。残差ノルムは1未満の量なので、3乗されるたびに桁が3倍のスピードで落ちていきます。

言葉だけでは実感が湧きにくいので、実際に測ってみましょう。24トークン・64次元・8ヘッドの多層 attention をランダム初期化で重ね、各層の相対残差 $\|\mathrm{res}(X_l)\|_F / \|X_l\|_F$ を記録します。

import numpy as np

def softmax(z, axis=-1):
    z = z - z.max(axis=axis, keepdims=True)
    e = np.exp(z)
    return e / e.sum(axis=axis, keepdims=True)

def rel_residual(X):
    """rank-1(全トークン同一)からの相対距離。0なら完全に潰れている"""
    center = X - X.mean(axis=0, keepdims=True)
    return np.linalg.norm(center, "fro") / (np.linalg.norm(X, "fro") + 1e-30)

def multihead_attn(X, WQ, WK, WV, WO):
    heads = []
    for h in range(WQ.shape[0]):
        Q, K, V = X @ WQ[h], X @ WK[h], X @ WV[h]
        A = softmax(Q @ K.T / np.sqrt(WQ.shape[2]), axis=1)
        heads.append(A @ V)
    return np.concatenate(heads, axis=1) @ WO

rng = np.random.default_rng(0)
N, d, H, L = 24, 64, 8, 12
X0 = rng.standard_normal((N, d))
dh = d // H
gain = 1.6 / np.sqrt(d)
W = [(rng.standard_normal((H, d, dh)) * gain,
      rng.standard_normal((H, d, dh)) * gain,
      rng.standard_normal((H, d, dh)) / np.sqrt(d),
      rng.standard_normal((H * dh, d)) / np.sqrt(H * dh)) for _ in range(L)]

X = X0.copy()
res = [rel_residual(X)]
for (WQ, WK, WV, WO) in W:
    X = multihead_attn(X, WQ, WK, WV, WO)   # 純粋attention: skipもFFNもなし
    res.append(rel_residual(X))
print(np.array2string(np.array(res), precision=3))
# => [9.838e-01 8.597e-01 2.747e-01 1.903e-03 6.410e-10 2.909e-16 ... 3.252e-16]

純粋Attentionの残差は深さで急激に消える(対数軸)

結果は衝撃的です。相対残差は層0の 0.98 から、層3で $1.9 \times 10^{-3}$、層4で $6.4 \times 10^{-10}$、層5で $10^{-16}$(倍精度浮動小数点のマシンイプシロン)に到達しました。以降はもう「ゼロ」です。わずか5層で、24個のトークンは数値的に完全な1点に潰れました。

この落ち方が本当に「二重指数」なのかも確認できます。二重指数なら、$\log$ を取った値が1層ごとにおよそ3倍になる(残差が3乗される)はずです。

残差は1層ごとにおよそ3乗され、二重指数は指数より桁違いに速い

実測した連続する層間の「べき指数」$\log r_{l+1} / \log r_l$ は 4.85, 3.38 と、理論の3前後で推移しました(崩壊が速すぎて、マシンゼロに達する前に測れる区間が2つしかないほどです)。右パネルは通常の指数減衰 $c^L$ と二重指数 $c^{3^L}$ の比較で、二重指数の「崖から落ちる」ような速さが見て取れます。

数値の上で潰れたことは分かりました。次は、その「潰れ方」を幾何的に眺めます。

潰れていく表現を観察する

トークン同士のコサイン類似度を層ごとに測ります。

深いほど全トークンペアのコサイン類似度が1に近づく

層0では非対角要素(異なるトークン間の類似度)の平均は $-0.01$——ランダムなベクトルらしく、ほぼ直交です。それが層2で早くも 0.92、層4で 1.00。全トークンが完全に同じ方向を向いています。ヒートマップが層を追うごとに一様な黄色に染まっていく様子は、「表現の多様性の死」をそのまま可視化したものです。

特異値スペクトル: 第1特異値以外が層とともに消えていく

「rank collapse」という名前の由来も特異値で確認できます。第2特異値と第1特異値の比 $\sigma_2/\sigma_1$ は、層0の 0.99 から層2で 0.15、層4で $4 \times 10^{-10}$ へ。行列としての実質ランクが1に落ちる——文字どおりの rank collapse です。

純粋Attentionは深さとともに全トークンが同一方向へ向く

これで「attentionだけなら壊れる」ことは確定しました。しかし現実のTransformerは12層でも96層でも学習できています。何が救っているのでしょうか。

何が崩壊を止めるのか — 犯人は残差接続

Transformerブロックの他の部品——残差接続・FFN・LayerNorm——を1つずつ足して、同じ実験をします。

def layernorm(X, eps=1e-5):
    return (X - X.mean(1, keepdims=True)) / np.sqrt(X.var(1, keepdims=True) + eps)

def ffn(X, rng, d):
    W1 = rng.standard_normal((d, 4 * d)) / np.sqrt(d)
    W2 = rng.standard_normal((4 * d, d)) / np.sqrt(4 * d)
    return np.maximum(X @ W1, 0.0) @ W2

def run_model(X0, W, mode, ffn_rng=None, ffn_scale=0.35):
    X = X0.copy(); d = X.shape[1]
    res = [rel_residual(X)]
    for (WQ, WK, WV, WO) in W:
        attn = multihead_attn(X, WQ, WK, WV, WO)
        if mode == "san":       # 純粋attention
            X = attn
        elif mode == "mlp":     # attentionにskipなし + FFN
            X = attn + ffn(attn, ffn_rng, d)
        elif mode == "skip":    # 残差接続のみ
            X = X + attn
        elif mode == "full":    # 残差 + LN + FFN (Transformerブロック)
            X = layernorm(X + attn)
            X = layernorm(X + ffn_scale * ffn(X, ffn_rng, d))
        res.append(rel_residual(X))
    return np.array(res)

for mode, r in [("san", None), ("mlp", 5), ("skip", None), ("full", 7)]:
    frng = np.random.default_rng(r) if r is not None else None
    res = run_model(X0, W, mode, ffn_rng=frng)
    print(f"{mode:5s}: 最終層の相対残差 = {res[-1]:.3e}")
# => san  : 最終層の相対残差 = 3.252e-16
# => mlp  : 最終層の相対残差 = 3.871e-16
# => skip : 最終層の相対残差 = 4.299e-01
# => full : 最終層の相対残差 = 1.030e-01

skipの有無が運命を分ける: 残差接続だけがrank collapseを止める

結果は鮮明です。純粋attention(SAN)と「FFNは足したが attention に skip がない」構成(SAN+MLP)は、どちらも $10^{-16}$ までマシンゼロ級の崩壊。一方、残差接続を入れた瞬間、12層後も残差 0.43 が生き残ります。フルのTransformerブロック(残差+LN+FFN)でも 0.10 を保ちました。FFNやLayerNormを足すだけでは救えないことも、次の図で個別に確認できます。

LayerNormだけでは崩壊を止められない

残差なしで LayerNorm を挟んだ構成も、数層遅れるだけで結局マシンゼロへ落ちます。論文の結論と同じく、rank collapse に対する生命維持装置は残差接続であり、FFN は(リプシッツ定数を通じて)崩壊のスピードに抗う補助役、LayerNorm は単独では無力です。

では、なぜ残差接続はこれほど劇的に効くのでしょうか。論文はこれに「パス分解」という美しい説明を与えています。

パス分解: 残差接続は「長さ0のパス」を作る

残差付きの多層多ヘッドネットワークの出力は、展開すると「各層でヘッドを1つ選ぶか、skip を選ぶか」の全組み合わせ——パス——の和として書けます。

パス分解: 多層多ヘッドネットワークはパスの和

原論文の Figure 1 がこの描像を示しています。

深いSelf-Attention Networkの2つのパスの例(原論文Figure 1)

出典: Dong et al., “Attention is not all you need”, ICML 2021, Fig.1

赤いパスはあるヘッドを通り、skip を通り、また別のヘッドを通る——という1本の経路です。ネットワーク全体は、こうしたパスの膨大な和になっています。ここで各パスに主定理を適用すると、attention を $k$ 回通るパスは、単独では $3^k$ の二重指数で rank collapse する弱い成分です。しかし残差接続があると「attention を1回も通らないパス(長さ0=恒等写像)」や「1〜2回しか通らない浅いパス」が生まれます。これらの浅いパスが元の入力の多様性をそのまま運び続けるため、全体としては崩壊しない——深いネットワークの実体は浅いパスのアンサンブルという解釈です。これは残差接続の「暗黙のアンサンブル」説(ResNetで知られる)の attention 版とも言えます。

Dong らは実在モデルでもこれを検証しています。

BERT・Albert・XLNetでの残差の相対ノルムの深さ依存(原論文Figure 2)

出典: Dong et al., “Attention is not all you need”, ICML 2021, Fig.2

BERT・Albert・XLNet の3モデルで部品を外して測った図です。どのモデルでも、SAN(点線)と SAN+MLP(破線)は初期化直後・学習後を問わず数層で残差がほぼ0に落ちる一方、skip 付き(一点鎖線)とフルの transformer(実線)は深さ12でも残差を保っています。私たちのおもちゃの実験と同じパターンが、1億パラメータ級の実モデルでも成り立っているのです。

最後に、この理論が現実のどこに顔を出すかに触れておきます。フルのTransformerでも崩壊が「完全に」止まるわけではなく、深くなるほどトークン表現が徐々に似ていく over-smoothing は、深いViTやBERTで実際に観測され、深層化の障害として研究されています(本記事の実験でも full 構成の残差は 0.98→0.10 と漸減していました)。rank collapse は「attention という平均化装置の宿命」であり、アーキテクチャ設計はその宿命との綱引きなのです。

まとめ

本記事では、純粋 attention の rank collapse を理論と実測の両面から解説しました。

  • attention は平均化作用素: 注意行列は行確率行列で、出力は value の凸結合。外に出られない内向きの変換
  • 主定理(Dong et al., ICML 2021): 残差もFFNもない純粋attentionの残差は深さに対して二重指数(1層ごとにおよそ3乗)で消える。実測でも12層中5層で $10^{-16}$ のマシンゼロに到達し、べき指数は4.85, 3.38と理論の3前後だった
  • トークン一様性: コサイン類似度は4層で1.000、特異値比 $\sigma_2/\sigma_1$ は $4\times10^{-10}$ まで落ち、文字どおり rank-1 に潰れる
  • 救うのは残差接続だけ: skip ありは最終層でも残差0.43を保持(フルブロックで0.10)。FFN単体・LayerNorm単体では崩壊を止められない
  • パス分解: 残差接続は「attentionを通らない浅いパス」を作り、ネットワークを浅いパスのアンサンブルにする。これが多様性の生命線

「Attention is all you need」への理論からの返答は、皮肉にもこうでした——attentionだけでは、すべてが同じになってしまう

次のステップとして、以下の記事も参考にしてください。

画像なし
残差接続(スキップ接続)はなぜ効くのか — 図で直感的に理解する4つの視点
恒等写像・勾配ハイウェイ・損失地形・暗黙アンサンブル。本記事はこれに『rank collapse防止』という5つ目の視点を追加する
Transformer FFN(Feed-Forward Network)完全ガイド
attentionと交互に置かれる2層MLPの役割。崩壊への抵抗もその仕事の1つ
画像なし
Attentionの数式を行列の形で完全に理解する
注意行列の行が確率分布であること=本記事の出発点を図で確認する