Interactive

Self-Attention可視化

Attention(Q,K,V)=softmax(QKᵀ/√d_k)・V という1本の式を、 暗記ではなく実際の行列演算で追います。 3トークンの小さな例では投影・スコア・スケール・softmax・加重和の全5ステップを整数の行列で確認でき、 d_k=64や128という現実的な次元では、√d_kで割らないとsoftmaxがほぼ1点だけを見る分布に飽和することを、 乱数で生成したQ・Kから実測できます。

3トークン「猫・が・座る」、d_model=4、d_k=d_v=4(√d_k=2)。すべて整数の小さな行列なので、気になるところは手計算でも追えます。

入力 X(n×d_model)

1201
0120
座る2011

Q = X・W_Q

1223
2301
座る3131

K = X・W_K

3210
1022
座る1331

V = X・W_V

1201
0120
座る2011

同じ入力Xを3つの異なる重み行列で射影し、Query・Key・Valueという別の役割を持つベクトルにする。W_Q≠W_Kなので、QとKは違う値になる——だから注目は非対称になれる。

すべてブラウザ内で実際の行列演算(投影・内積・softmax)を計算しています。学習済みモデルは使っていません。

ここが分かる

  • Q・K・Vは同じ入力Xを3つの異なる重み行列で射影しただけ。W_Q≠W_Kだから、スコア行列Sは対称にならない——「小さな例」のステップ2で、S[0][1]とS[1][0]が実際に違う値になることを確認できる。
  • √d_kで割る理由は、内積の分散が次元d_kに比例して膨らむという統計的な性質にある。「√d_kの効果」タブでd_k=64を選ぶと、実測した標準偏差が理論値√64=8にほぼ一致することが数値で確認できる。
  • スケーリング無しだと、d_kが大きいほどsoftmaxの出力がone-hot(1箇所だけほぼ1、残りほぼ0)に近づく——d_k=128だと平均最大重みが0.9を超える。この状態は誤差逆伝播の勾配がほぼ消えるため、学習が進まなくなる。
  • スケーリングありだと、d_kをどれだけ増やしても分布の滑らかさがほぼ変わらない——「別の乱数で再生成」を何度か押しても、この傾向自体は再現し続ける。